From: Mike Christie <michael.christie@oracle.com> To: bvanassche@acm.org, hch@lst.de, martin.petersen@oracle.com, linux-scsi@vger.kernel.org, james.bottomley@hansenpartnership.com, linux-block@vger.kernel.org, dm-devel@redhat.com, snitzer@kernel.org, axboe@kernel.dk, linux-nvme@lists.infradead.org, chaitanyak@nvidia.com, kbusch@kernel.org, target-devel@vger.kernel.org Cc: Mike Christie <michael.christie@oracle.com> Subject: [PATCH v3 04/19] scsi: Add support for block PR read keys/reservation Date: Wed, 26 Oct 2022 18:19:30 -0500 [thread overview] Message-ID: <20221026231945.6609-5-michael.christie@oracle.com> (raw) In-Reply-To: <20221026231945.6609-1-michael.christie@oracle.com> This adds support in sd.c for the block PR read keys and read reservation callouts. Signed-off-by: Mike Christie <michael.christie@oracle.com> --- drivers/scsi/sd.c | 104 +++++++++++++++++++++++++++++++++++ include/scsi/scsi_block_pr.h | 20 +++++++ include/scsi/scsi_proto.h | 5 ++ 3 files changed, 129 insertions(+) diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index ad9374b07585..86b602399000 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -1695,6 +1695,108 @@ static int sd_get_unique_id(struct gendisk *disk, u8 id[16], return ret; } +static int sd_pr_in_command(struct block_device *bdev, u8 sa, + unsigned char *data, int data_len) +{ + struct scsi_disk *sdkp = scsi_disk(bdev->bd_disk); + struct scsi_device *sdev = sdkp->device; + struct scsi_sense_hdr sshdr; + u8 cmd[10] = { PERSISTENT_RESERVE_IN, sa }; + struct scsi_failure failures[] = { + { + .sense = UNIT_ATTENTION, + .asc = SCMD_FAILURE_ASC_ANY, + .ascq = SCMD_FAILURE_ASCQ_ANY, + .allowed = 5, + .result = SAM_STAT_CHECK_CONDITION, + }, + {}, + }; + int result; + + put_unaligned_be16(data_len, &cmd[7]); + + result = scsi_exec_req(((struct scsi_exec_args) { + .sdev = sdev, + .cmd = cmd, + .data_dir = DMA_FROM_DEVICE, + .buf = data, + .buf_len = data_len, + .sshdr = &sshdr, + .timeout = SD_TIMEOUT, + .retries = sdkp->max_retries, + .failures = failures })); + if (scsi_status_is_check_condition(result) && + scsi_sense_valid(&sshdr)) { + sdev_printk(KERN_INFO, sdev, "PR command failed: %d\n", result); + scsi_print_sense_hdr(sdev, NULL, &sshdr); + } + + return result; +} + +static int sd_pr_read_keys(struct block_device *bdev, struct pr_keys *keys_info, + u32 keys_len) +{ + int result, i, data_offset, num_copy_keys; + int data_len = keys_len + 8; + u8 *data; + + data = kzalloc(data_len, GFP_KERNEL); + if (!data) + return -ENOMEM; + + result = sd_pr_in_command(bdev, READ_KEYS, data, data_len); + if (result) + goto free_data; + + keys_info->generation = get_unaligned_be32(&data[0]); + keys_info->num_keys = get_unaligned_be32(&data[4]) / 8; + + data_offset = 8; + num_copy_keys = min(keys_len / 8, keys_info->num_keys); + + for (i = 0; i < num_copy_keys; i++) { + keys_info->keys[i] = get_unaligned_be64(&data[data_offset]); + data_offset += 8; + } + +free_data: + kfree(data); + return result; +} + +static int sd_pr_read_reservation(struct block_device *bdev, + struct pr_held_reservation *rsv) +{ + struct scsi_disk *sdkp = scsi_disk(bdev->bd_disk); + struct scsi_device *sdev = sdkp->device; + u8 data[24] = { 0, }; + int result, len; + + result = sd_pr_in_command(bdev, READ_RESERVATION, data, sizeof(data)); + if (result) + return result; + + memset(rsv, 0, sizeof(*rsv)); + len = get_unaligned_be32(&data[4]); + if (!len) + return result; + + /* Make sure we have at least the key and type */ + if (len < 14) { + sdev_printk(KERN_INFO, sdev, + "READ RESERVATION failed due to short return buffer of %d bytes\n", + len); + return -EINVAL; + } + + rsv->generation = get_unaligned_be32(&data[0]); + rsv->key = get_unaligned_be64(&data[8]); + rsv->type = scsi_pr_type_to_block(data[21] & 0x0f); + return 0; +} + static int sd_pr_out_command(struct block_device *bdev, u8 sa, u64 key, u64 sa_key, enum scsi_pr_type type, u8 flags) { @@ -1787,6 +1889,8 @@ static const struct pr_ops sd_pr_ops = { .pr_release = sd_pr_release, .pr_preempt = sd_pr_preempt, .pr_clear = sd_pr_clear, + .pr_read_keys = sd_pr_read_keys, + .pr_read_reservation = sd_pr_read_reservation, }; static void scsi_disk_free_disk(struct gendisk *disk) diff --git a/include/scsi/scsi_block_pr.h b/include/scsi/scsi_block_pr.h index 6e99f844330d..137bf2247273 100644 --- a/include/scsi/scsi_block_pr.h +++ b/include/scsi/scsi_block_pr.h @@ -33,4 +33,24 @@ static inline enum scsi_pr_type block_pr_type_to_scsi(enum pr_type type) } }; +static inline enum pr_type scsi_pr_type_to_block(enum scsi_pr_type type) +{ + switch (type) { + case SCSI_PR_WRITE_EXCLUSIVE: + return PR_WRITE_EXCLUSIVE; + case SCSI_PR_EXCLUSIVE_ACCESS: + return PR_EXCLUSIVE_ACCESS; + case SCSI_PR_WRITE_EXCLUSIVE_REG_ONLY: + return PR_WRITE_EXCLUSIVE_REG_ONLY; + case SCSI_PR_EXCLUSIVE_ACCESS_REG_ONLY: + return PR_EXCLUSIVE_ACCESS_REG_ONLY; + case SCSI_PR_WRITE_EXCLUSIVE_ALL_REGS: + return PR_WRITE_EXCLUSIVE_ALL_REGS; + case SCSI_PR_EXCLUSIVE_ACCESS_ALL_REGS: + return PR_EXCLUSIVE_ACCESS_ALL_REGS; + default: + return 0; + } +} + #endif diff --git a/include/scsi/scsi_proto.h b/include/scsi/scsi_proto.h index c03e35fc382c..0fd6e295375a 100644 --- a/include/scsi/scsi_proto.h +++ b/include/scsi/scsi_proto.h @@ -151,6 +151,11 @@ #define ZO_FINISH_ZONE 0x02 #define ZO_OPEN_ZONE 0x03 #define ZO_RESET_WRITE_POINTER 0x04 +/* values for PR in service action */ +#define READ_KEYS 0x00 +#define READ_RESERVATION 0x01 +#define REPORT_CAPABILITES 0x02 +#define READ_FULL_STATUS 0x03 /* values for variable length command */ #define XDREAD_32 0x03 #define XDWRITE_32 0x04 -- 2.25.1
WARNING: multiple messages have this Message-ID (diff)
From: Mike Christie <michael.christie@oracle.com> To: bvanassche@acm.org, hch@lst.de, martin.petersen@oracle.com, linux-scsi@vger.kernel.org, james.bottomley@hansenpartnership.com, linux-block@vger.kernel.org, dm-devel@redhat.com, snitzer@kernel.org, axboe@kernel.dk, linux-nvme@lists.infradead.org, chaitanyak@nvidia.com, kbusch@kernel.org, target-devel@vger.kernel.org Cc: Mike Christie <michael.christie@oracle.com> Subject: [dm-devel] [PATCH v3 04/19] scsi: Add support for block PR read keys/reservation Date: Wed, 26 Oct 2022 18:19:30 -0500 [thread overview] Message-ID: <20221026231945.6609-5-michael.christie@oracle.com> (raw) In-Reply-To: <20221026231945.6609-1-michael.christie@oracle.com> This adds support in sd.c for the block PR read keys and read reservation callouts. Signed-off-by: Mike Christie <michael.christie@oracle.com> --- drivers/scsi/sd.c | 104 +++++++++++++++++++++++++++++++++++ include/scsi/scsi_block_pr.h | 20 +++++++ include/scsi/scsi_proto.h | 5 ++ 3 files changed, 129 insertions(+) diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index ad9374b07585..86b602399000 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -1695,6 +1695,108 @@ static int sd_get_unique_id(struct gendisk *disk, u8 id[16], return ret; } +static int sd_pr_in_command(struct block_device *bdev, u8 sa, + unsigned char *data, int data_len) +{ + struct scsi_disk *sdkp = scsi_disk(bdev->bd_disk); + struct scsi_device *sdev = sdkp->device; + struct scsi_sense_hdr sshdr; + u8 cmd[10] = { PERSISTENT_RESERVE_IN, sa }; + struct scsi_failure failures[] = { + { + .sense = UNIT_ATTENTION, + .asc = SCMD_FAILURE_ASC_ANY, + .ascq = SCMD_FAILURE_ASCQ_ANY, + .allowed = 5, + .result = SAM_STAT_CHECK_CONDITION, + }, + {}, + }; + int result; + + put_unaligned_be16(data_len, &cmd[7]); + + result = scsi_exec_req(((struct scsi_exec_args) { + .sdev = sdev, + .cmd = cmd, + .data_dir = DMA_FROM_DEVICE, + .buf = data, + .buf_len = data_len, + .sshdr = &sshdr, + .timeout = SD_TIMEOUT, + .retries = sdkp->max_retries, + .failures = failures })); + if (scsi_status_is_check_condition(result) && + scsi_sense_valid(&sshdr)) { + sdev_printk(KERN_INFO, sdev, "PR command failed: %d\n", result); + scsi_print_sense_hdr(sdev, NULL, &sshdr); + } + + return result; +} + +static int sd_pr_read_keys(struct block_device *bdev, struct pr_keys *keys_info, + u32 keys_len) +{ + int result, i, data_offset, num_copy_keys; + int data_len = keys_len + 8; + u8 *data; + + data = kzalloc(data_len, GFP_KERNEL); + if (!data) + return -ENOMEM; + + result = sd_pr_in_command(bdev, READ_KEYS, data, data_len); + if (result) + goto free_data; + + keys_info->generation = get_unaligned_be32(&data[0]); + keys_info->num_keys = get_unaligned_be32(&data[4]) / 8; + + data_offset = 8; + num_copy_keys = min(keys_len / 8, keys_info->num_keys); + + for (i = 0; i < num_copy_keys; i++) { + keys_info->keys[i] = get_unaligned_be64(&data[data_offset]); + data_offset += 8; + } + +free_data: + kfree(data); + return result; +} + +static int sd_pr_read_reservation(struct block_device *bdev, + struct pr_held_reservation *rsv) +{ + struct scsi_disk *sdkp = scsi_disk(bdev->bd_disk); + struct scsi_device *sdev = sdkp->device; + u8 data[24] = { 0, }; + int result, len; + + result = sd_pr_in_command(bdev, READ_RESERVATION, data, sizeof(data)); + if (result) + return result; + + memset(rsv, 0, sizeof(*rsv)); + len = get_unaligned_be32(&data[4]); + if (!len) + return result; + + /* Make sure we have at least the key and type */ + if (len < 14) { + sdev_printk(KERN_INFO, sdev, + "READ RESERVATION failed due to short return buffer of %d bytes\n", + len); + return -EINVAL; + } + + rsv->generation = get_unaligned_be32(&data[0]); + rsv->key = get_unaligned_be64(&data[8]); + rsv->type = scsi_pr_type_to_block(data[21] & 0x0f); + return 0; +} + static int sd_pr_out_command(struct block_device *bdev, u8 sa, u64 key, u64 sa_key, enum scsi_pr_type type, u8 flags) { @@ -1787,6 +1889,8 @@ static const struct pr_ops sd_pr_ops = { .pr_release = sd_pr_release, .pr_preempt = sd_pr_preempt, .pr_clear = sd_pr_clear, + .pr_read_keys = sd_pr_read_keys, + .pr_read_reservation = sd_pr_read_reservation, }; static void scsi_disk_free_disk(struct gendisk *disk) diff --git a/include/scsi/scsi_block_pr.h b/include/scsi/scsi_block_pr.h index 6e99f844330d..137bf2247273 100644 --- a/include/scsi/scsi_block_pr.h +++ b/include/scsi/scsi_block_pr.h @@ -33,4 +33,24 @@ static inline enum scsi_pr_type block_pr_type_to_scsi(enum pr_type type) } }; +static inline enum pr_type scsi_pr_type_to_block(enum scsi_pr_type type) +{ + switch (type) { + case SCSI_PR_WRITE_EXCLUSIVE: + return PR_WRITE_EXCLUSIVE; + case SCSI_PR_EXCLUSIVE_ACCESS: + return PR_EXCLUSIVE_ACCESS; + case SCSI_PR_WRITE_EXCLUSIVE_REG_ONLY: + return PR_WRITE_EXCLUSIVE_REG_ONLY; + case SCSI_PR_EXCLUSIVE_ACCESS_REG_ONLY: + return PR_EXCLUSIVE_ACCESS_REG_ONLY; + case SCSI_PR_WRITE_EXCLUSIVE_ALL_REGS: + return PR_WRITE_EXCLUSIVE_ALL_REGS; + case SCSI_PR_EXCLUSIVE_ACCESS_ALL_REGS: + return PR_EXCLUSIVE_ACCESS_ALL_REGS; + default: + return 0; + } +} + #endif diff --git a/include/scsi/scsi_proto.h b/include/scsi/scsi_proto.h index c03e35fc382c..0fd6e295375a 100644 --- a/include/scsi/scsi_proto.h +++ b/include/scsi/scsi_proto.h @@ -151,6 +151,11 @@ #define ZO_FINISH_ZONE 0x02 #define ZO_OPEN_ZONE 0x03 #define ZO_RESET_WRITE_POINTER 0x04 +/* values for PR in service action */ +#define READ_KEYS 0x00 +#define READ_RESERVATION 0x01 +#define REPORT_CAPABILITES 0x02 +#define READ_FULL_STATUS 0x03 /* values for variable length command */ #define XDREAD_32 0x03 #define XDWRITE_32 0x04 -- 2.25.1 -- dm-devel mailing list dm-devel@redhat.com https://listman.redhat.com/mailman/listinfo/dm-devel
next prev parent reply other threads:[~2022-10-26 23:25 UTC|newest] Thread overview: 114+ messages / expand[flat|nested] mbox.gz Atom feed top 2022-10-26 23:19 [PATCH v3 00/19] Use block pr_ops in LIO Mike Christie 2022-10-26 23:19 ` [dm-devel] " Mike Christie 2022-10-26 23:19 ` [PATCH v3 01/19] block: Add PR callouts for read keys and reservation Mike Christie 2022-10-26 23:19 ` [dm-devel] " Mike Christie 2022-11-02 22:50 ` Bart Van Assche 2022-11-02 22:50 ` [dm-devel] " Bart Van Assche 2022-11-03 1:54 ` Mike Christie 2022-11-03 1:54 ` [dm-devel] " Mike Christie 2022-11-02 22:53 ` Bart Van Assche 2022-11-02 22:53 ` [dm-devel] " Bart Van Assche 2022-11-03 2:25 ` Mike Christie 2022-11-03 2:25 ` [dm-devel] " Mike Christie 2022-10-26 23:19 ` [PATCH v3 02/19] scsi: Rename sd_pr_command Mike Christie 2022-10-26 23:19 ` [dm-devel] " Mike Christie 2022-11-01 5:33 ` Chaitanya Kulkarni 2022-11-01 5:33 ` [dm-devel] " Chaitanya Kulkarni 2022-10-26 23:19 ` [PATCH v3 03/19] scsi: Move sd_pr_type to header to share Mike Christie 2022-10-26 23:19 ` [dm-devel] " Mike Christie 2022-11-01 5:43 ` Chaitanya Kulkarni 2022-11-01 5:43 ` [dm-devel] " Chaitanya Kulkarni 2022-11-01 16:43 ` Mike Christie 2022-11-01 16:43 ` [dm-devel] " Mike Christie 2022-11-02 22:47 ` Bart Van Assche 2022-11-02 22:47 ` [dm-devel] " Bart Van Assche 2022-11-03 2:13 ` Mike Christie 2022-11-03 2:13 ` [dm-devel] " Mike Christie 2022-11-03 18:14 ` Bart Van Assche 2022-11-03 18:14 ` [dm-devel] " Bart Van Assche 2022-10-26 23:19 ` Mike Christie [this message] 2022-10-26 23:19 ` [dm-devel] [PATCH v3 04/19] scsi: Add support for block PR read keys/reservation Mike Christie 2022-10-27 6:08 ` kernel test robot 2022-10-27 6:08 ` [dm-devel] " kernel test robot 2022-10-27 7:59 ` kernel test robot 2022-10-27 7:59 ` [dm-devel] " kernel test robot 2022-10-27 10:41 ` kernel test robot 2022-10-27 10:41 ` [dm-devel] " kernel test robot 2022-11-01 5:45 ` Chaitanya Kulkarni 2022-11-01 5:45 ` [dm-devel] " Chaitanya Kulkarni 2022-11-02 22:54 ` Bart Van Assche 2022-11-02 22:54 ` [dm-devel] " Bart Van Assche 2022-10-26 23:19 ` [PATCH v3 05/19] dm: " Mike Christie 2022-10-26 23:19 ` [dm-devel] " Mike Christie 2022-10-26 23:19 ` [PATCH v3 06/19] nvme: Fix reservation status related structs Mike Christie 2022-10-26 23:19 ` [dm-devel] " Mike Christie 2022-10-27 17:04 ` Keith Busch 2022-10-27 17:04 ` [dm-devel] " Keith Busch 2022-10-26 23:19 ` [PATCH v3 07/19] nvme: Don't hardcode the data len for pr commands Mike Christie 2022-10-26 23:19 ` [dm-devel] " Mike Christie 2022-10-27 17:05 ` Keith Busch 2022-10-27 17:05 ` [dm-devel] " Keith Busch 2022-11-01 5:29 ` Chaitanya Kulkarni 2022-11-01 5:29 ` [dm-devel] " Chaitanya Kulkarni 2022-10-26 23:19 ` [PATCH v3 08/19] nvme: Move pr code to it's own file Mike Christie 2022-10-26 23:19 ` [dm-devel] " Mike Christie 2022-10-27 17:06 ` Keith Busch 2022-10-27 17:06 ` [dm-devel] " Keith Busch 2022-10-28 16:06 ` Mike Christie 2022-10-28 16:06 ` [dm-devel] " Mike Christie 2022-10-28 16:38 ` Keith Busch 2022-10-28 16:38 ` [dm-devel] " Keith Busch 2022-10-30 8:06 ` Christoph Hellwig 2022-10-30 8:06 ` [dm-devel] " Christoph Hellwig 2022-11-01 5:25 ` Chaitanya Kulkarni 2022-11-01 5:25 ` [dm-devel] " Chaitanya Kulkarni 2022-10-26 23:19 ` [PATCH v3 09/19] nvme: Add pr_ops read_keys support Mike Christie 2022-10-26 23:19 ` [dm-devel] " Mike Christie 2022-10-30 8:17 ` Christoph Hellwig 2022-10-30 8:17 ` [dm-devel] " Christoph Hellwig 2022-10-30 20:47 ` Mike Christie 2022-10-30 20:47 ` [dm-devel] " Mike Christie 2022-10-26 23:19 ` [PATCH v3 10/19] nvme: Move NVMe and Block PR types to an array Mike Christie 2022-10-26 23:19 ` [dm-devel] " Mike Christie 2022-10-27 15:18 ` Keith Busch 2022-10-27 15:18 ` [dm-devel] " Keith Busch 2022-10-27 17:06 ` Mike Christie 2022-10-27 17:06 ` [dm-devel] " Mike Christie 2022-10-27 17:13 ` michael.christie 2022-10-27 17:13 ` [dm-devel] " michael.christie 2022-10-27 17:16 ` Keith Busch 2022-10-27 17:16 ` [dm-devel] " Keith Busch 2022-10-28 16:05 ` Mike Christie 2022-10-28 16:05 ` [dm-devel] " Mike Christie 2022-10-26 23:19 ` [PATCH v3 11/19] nvme: Add pr_ops read_reservation support Mike Christie 2022-10-26 23:19 ` [dm-devel] " Mike Christie 2022-10-30 8:18 ` Christoph Hellwig 2022-10-30 8:18 ` [dm-devel] " Christoph Hellwig 2022-10-30 20:54 ` Mike Christie 2022-10-30 20:54 ` [dm-devel] " Mike Christie 2022-10-26 23:19 ` [PATCH v3 12/19] block,nvme,scsi,dm: Add blk_status to pr_ops callouts Mike Christie 2022-10-26 23:19 ` [dm-devel] [PATCH v3 12/19] block, nvme, scsi, dm: " Mike Christie 2022-10-30 8:20 ` [PATCH v3 12/19] block,nvme,scsi,dm: " Christoph Hellwig 2022-10-30 8:20 ` [dm-devel] [PATCH v3 12/19] block, nvme, scsi, dm: " Christoph Hellwig 2022-10-30 23:05 ` [PATCH v3 12/19] block,nvme,scsi,dm: " Mike Christie 2022-10-30 23:05 ` [dm-devel] [PATCH v3 12/19] block, nvme, scsi, dm: " Mike Christie 2022-11-01 10:15 ` [PATCH v3 12/19] block,nvme,scsi,dm: " Christoph Hellwig 2022-11-01 10:15 ` [dm-devel] [PATCH v3 12/19] block, nvme, scsi, dm: " Christoph Hellwig 2022-11-05 18:36 ` [PATCH v3 12/19] block,nvme,scsi,dm: " Mike Christie 2022-11-05 18:36 ` [dm-devel] [PATCH v3 12/19] block, nvme, scsi, dm: " Mike Christie 2022-11-07 9:16 ` [PATCH v3 12/19] block,nvme,scsi,dm: " Christoph Hellwig 2022-11-07 9:16 ` [dm-devel] [PATCH v3 12/19] block, nvme, scsi, dm: " Christoph Hellwig 2022-10-26 23:19 ` [PATCH v3 13/19] nvme: Have NVMe pr_ops return a blk_status_t Mike Christie 2022-10-26 23:19 ` [dm-devel] " Mike Christie 2022-10-26 23:19 ` [PATCH v3 14/19] scsi: Export scsi_result_to_blk_status Mike Christie 2022-10-26 23:19 ` [dm-devel] " Mike Christie 2022-10-26 23:19 ` [PATCH v3 15/19] scsi: Have sd pr_ops return a blk_status_t Mike Christie 2022-10-26 23:19 ` [dm-devel] " Mike Christie 2022-10-26 23:19 ` [PATCH v3 16/19] scsi: target: Rename sbc_ops to exec_cmd_ops Mike Christie 2022-10-26 23:19 ` [dm-devel] " Mike Christie 2022-10-26 23:19 ` [PATCH v3 17/19] scsi: target: Allow backends to hook into PR handling Mike Christie 2022-10-26 23:19 ` [dm-devel] " Mike Christie 2022-10-26 23:19 ` [PATCH v3 18/19] scsi: target: Don't support SCSI-2 RESERVE/RELEASE Mike Christie 2022-10-26 23:19 ` [dm-devel] " Mike Christie 2022-10-26 23:19 ` [PATCH v3 19/19] scsi: target: Add block PR support to iblock Mike Christie 2022-10-26 23:19 ` [dm-devel] " Mike Christie
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20221026231945.6609-5-michael.christie@oracle.com \ --to=michael.christie@oracle.com \ --cc=axboe@kernel.dk \ --cc=bvanassche@acm.org \ --cc=chaitanyak@nvidia.com \ --cc=dm-devel@redhat.com \ --cc=hch@lst.de \ --cc=james.bottomley@hansenpartnership.com \ --cc=kbusch@kernel.org \ --cc=linux-block@vger.kernel.org \ --cc=linux-nvme@lists.infradead.org \ --cc=linux-scsi@vger.kernel.org \ --cc=martin.petersen@oracle.com \ --cc=snitzer@kernel.org \ --cc=target-devel@vger.kernel.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.