From: Hannes Reinecke <hare@suse.de>
To: Markus Armbruster <armbru@redhat.com>
Cc: qemu-devel@nongnu.org, Kevin Wolf <kwolf@redhat.com>,
kvm@vger.kernel.org, Alexander Graf <agraf@suse.de>
Subject: Re: [Qemu-devel] [PATCH 1/3] scsi: Sanitize command definitions
Date: Fri, 22 Jul 2011 16:14:22 +0200 [thread overview]
Message-ID: <4E2985BE.5000809@suse.de> (raw)
In-Reply-To: <m3aac6l87d.fsf@blackfin.pond.sub.org>
On 07/22/2011 04:07 PM, Markus Armbruster wrote:
> Hannes Reinecke<hare@suse.de> writes:
>
>> Adding some missing command definitions and update the existing ones.
>> No functional change.
>
> Add: LOCATE_10, UNMAP, VARLENGTH_CDB, WRITE_FILEMARKS_16, EXTENDED_COPY,
> ATA_PASSTHROUGH, ACCESS_CONTROL_IN, ACCESS_CONTROL_OUT,
> COMPARE_AND_WRITE, VERIFY_16, SYNCHRONIZE_CACHE_16, LOCATE_16, ERASE_16,
> WRITE_LONG_16, VERIFY_12, READ_DEFECT_DATA_12.
>
> Rename: READ_CAPACITY, WRITE_VERIFY, VERIFY, READ_LONG, WRITE_LONG,
> WRITE_SAME to&_10.
>
> Delete: WRITE_LONG_2
>
OK.
>>
>> Signed-off-by: Hannes Reinecke<hare@suse.de>
>> ---
>> hw/scsi-bus.c | 71 ++++++++++++++++++++++++++++++----------------------
>> hw/scsi-defs.h | 60 ++++++++++++++++++++++++++++----------------
>> hw/scsi-disk.c | 29 ++++++++-------------
>> hw/scsi-generic.c | 2 +-
>> 4 files changed, 91 insertions(+), 71 deletions(-)
>>
>> diff --git a/hw/scsi-bus.c b/hw/scsi-bus.c
>> index 8b1a412..24a1298 100644
>> --- a/hw/scsi-bus.c
>> +++ b/hw/scsi-bus.c
>> @@ -232,24 +232,24 @@ static int scsi_req_length(SCSIRequest *req, uint8_t *cmd)
>> case RELEASE:
>> case ERASE:
>> case ALLOW_MEDIUM_REMOVAL:
>> - case VERIFY:
>> + case VERIFY_10:
>> case SEEK_10:
>> case SYNCHRONIZE_CACHE:
>> case LOCK_UNLOCK_CACHE:
>> case LOAD_UNLOAD:
>> case SET_CD_SPEED:
>> case SET_LIMITS:
>> - case WRITE_LONG:
>> + case WRITE_LONG_10:
>> case MOVE_MEDIUM:
>> case UPDATE_BLOCK:
>> req->cmd.xfer = 0;
>> break;
>> case MODE_SENSE:
>> break;
>> - case WRITE_SAME:
>> + case WRITE_SAME_10:
>> req->cmd.xfer = 1;
>> break;
>> - case READ_CAPACITY:
>> + case READ_CAPACITY_10:
>> req->cmd.xfer = 8;
>> break;
>> case READ_BLOCK_LIMITS:
>> @@ -265,7 +265,7 @@ static int scsi_req_length(SCSIRequest *req, uint8_t *cmd)
>> req->cmd.xfer *= 8;
>> break;
>> case WRITE_10:
>> - case WRITE_VERIFY:
>> + case WRITE_VERIFY_10:
>> case WRITE_6:
>> case WRITE_12:
>> case WRITE_VERIFY_12:
>> @@ -325,7 +325,7 @@ static void scsi_req_xfer_mode(SCSIRequest *req)
>> switch (req->cmd.buf[0]) {
>> case WRITE_6:
>> case WRITE_10:
>> - case WRITE_VERIFY:
>> + case WRITE_VERIFY_10:
>> case WRITE_12:
>> case WRITE_VERIFY_12:
>> case WRITE_16:
>> @@ -345,15 +345,13 @@ static void scsi_req_xfer_mode(SCSIRequest *req)
>> case SEARCH_HIGH:
>> case SEARCH_LOW:
>> case UPDATE_BLOCK:
>> - case WRITE_LONG:
>> - case WRITE_SAME:
>> + case WRITE_LONG_10:
>> + case WRITE_SAME_10:
>> case SEARCH_HIGH_12:
>> case SEARCH_EQUAL_12:
>> case SEARCH_LOW_12:
>> - case SET_WINDOW:
>
> I figure this is "no functional change" because all users of this
> function reject SET_WINDOW elsewhere.
>
Yes, you are correct. Will be doing another patch with removing
references to obsolete commands SET_WINDOW and WRITE_LONG_2.
>> case MEDIUM_SCAN:
>> case SEND_VOLUME_TAG:
>> - case WRITE_LONG_2:
>
> Same here.
>
Indeed.
>> case PERSISTENT_RESERVE_OUT:
>> case MAINTENANCE_OUT:
>> req->cmd.mode = SCSI_XFER_TO_DEV;
>> @@ -517,8 +515,7 @@ static const char *scsi_command_name(uint8_t cmd)
>> {
>> static const char *names[] = {
>> [ TEST_UNIT_READY ] = "TEST_UNIT_READY",
>> - [ REZERO_UNIT ] = "REZERO_UNIT",
>> - /* REWIND and REZERO_UNIT use the same operation code */
>> + [ REWIND ] = "REWIND",
>
> "No functional change" because it's used only for scsi_req_print(),
> which is unused.
>
See above.
>> [ REQUEST_SENSE ] = "REQUEST_SENSE",
>> [ FORMAT_UNIT ] = "FORMAT_UNIT",
>> [ READ_BLOCK_LIMITS ] = "READ_BLOCK_LIMITS",
>> @@ -543,14 +540,13 @@ static const char *scsi_command_name(uint8_t cmd)
>> [ RECEIVE_DIAGNOSTIC ] = "RECEIVE_DIAGNOSTIC",
>> [ SEND_DIAGNOSTIC ] = "SEND_DIAGNOSTIC",
>> [ ALLOW_MEDIUM_REMOVAL ] = "ALLOW_MEDIUM_REMOVAL",
>> -
>> [ SET_WINDOW ] = "SET_WINDOW",
>> - [ READ_CAPACITY ] = "READ_CAPACITY",
>> + [ READ_CAPACITY_10 ] = "READ_CAPACITY_10",
>> [ READ_10 ] = "READ_10",
>> [ WRITE_10 ] = "WRITE_10",
>> [ SEEK_10 ] = "SEEK_10",
>
> New LOCATE_10 missing.
>
OK.
>> - [ WRITE_VERIFY ] = "WRITE_VERIFY",
>> - [ VERIFY ] = "VERIFY",
>> + [ WRITE_VERIFY_10 ] = "WRITE_VERIFY_10",
>> + [ VERIFY_10 ] = "VERIFY_10",
>> [ SEARCH_HIGH ] = "SEARCH_HIGH",
>> [ SEARCH_EQUAL ] = "SEARCH_EQUAL",
>> [ SEARCH_LOW ] = "SEARCH_LOW",
>> @@ -566,11 +562,14 @@ static const char *scsi_command_name(uint8_t cmd)
>> [ WRITE_BUFFER ] = "WRITE_BUFFER",
>> [ READ_BUFFER ] = "READ_BUFFER",
>> [ UPDATE_BLOCK ] = "UPDATE_BLOCK",
>> - [ READ_LONG ] = "READ_LONG",
>> - [ WRITE_LONG ] = "WRITE_LONG",
>> + [ READ_LONG_10 ] = "READ_LONG_10",
>> + [ WRITE_LONG_10 ] = "WRITE_LONG_10",
>> [ CHANGE_DEFINITION ] = "CHANGE_DEFINITION",
>> - [ WRITE_SAME ] = "WRITE_SAME",
>> + [ WRITE_SAME_10 ] = "WRITE_SAME_10",
>> + [ UNMAP ] = "UNMAP",
>> [ READ_TOC ] = "READ_TOC",
>> + [ REPORT_DENSITY_SUPPORT ] = "REPORT_DENSITY_SUPPORT",
>> + [ GET_CONFIGURATION ] = "GET_CONFIGURATION",
>> [ LOG_SELECT ] = "LOG_SELECT",
>> [ LOG_SENSE ] = "LOG_SENSE",
>> [ MODE_SELECT_10 ] = "MODE_SELECT_10",
>> @@ -579,27 +578,39 @@ static const char *scsi_command_name(uint8_t cmd)
>> [ MODE_SENSE_10 ] = "MODE_SENSE_10",
>> [ PERSISTENT_RESERVE_IN ] = "PERSISTENT_RESERVE_IN",
>> [ PERSISTENT_RESERVE_OUT ] = "PERSISTENT_RESERVE_OUT",
>
> New VARLENGTH_CDB missing.
>
Intentionally. VARLENGHT_CDB is used for all sorts of things, so
I think we should be printing that one out separately.
Same goes for MAINTENANCE_(IN|OUT) and SERVICE_ACTION_(IN|OUT).
>> + [ WRITE_FILEMARKS_16 ] = "WRITE_FILEMARKS_16",
>> + [ EXTENDED_COPY ] = "EXTENDED_COPY",
>> + [ ATA_PASSTHROUGH ] = "ATA_PASSTHROUGH",
>> + [ ACCESS_CONTROL_IN ] = "ACCESS_CONTROL_IN",
>> + [ ACCESS_CONTROL_OUT ] = "ACCESS_CONTROL_OUT",
>> + [ READ_16 ] = "READ_16",
>> + [ COMPARE_AND_WRITE ] = "COMPARE_AND_WRITE",
>> + [ WRITE_16 ] = "WRITE_16",
>> + [ WRITE_VERIFY_16 ] = "WRITE_VERIFY_16",
>> + [ VERIFY_16 ] = "VERIFY_16",
>> + [ SYNCHRONIZE_CACHE_16 ] = "SYNCHRONIZE_CACHE_16",
>> + [ LOCATE_16 ] = "LOCATE_16",
>> + [ WRITE_SAME_16 ] = "WRITE_SAME_16",
>> + [ ERASE_16 ] = "ERASE_16",
>> + [ SERVICE_ACTION_IN ] = "SERVICE_ACTION_IN",
>> + [ WRITE_LONG_16 ] = "WRITE_LONG_16",
>> + [ REPORT_LUNS ] = "REPORT_LUNS",
>> + [ BLANK ] = "BLANK",
>> + [ MAINTENANCE_IN ] = "MAINTENANCE_IN",
>> + [ MAINTENANCE_OUT ] = "MAINTENANCE_OUT",
>
> Fixes missing WRITE_SAME_16, MAINTENANCE_IN, MAINTENANCE_OUT.
>
Yes.
>> [ MOVE_MEDIUM ] = "MOVE_MEDIUM",
>> + [ LOAD_UNLOAD ] = "LOAD_UNLOAD",
>> [ READ_12 ] = "READ_12",
>> [ WRITE_12 ] = "WRITE_12",
>> [ WRITE_VERIFY_12 ] = "WRITE_VERIFY_12",
>> + [ VERIFY_12 ] = "VERIFY_12",
>> [ SEARCH_HIGH_12 ] = "SEARCH_HIGH_12",
>> [ SEARCH_EQUAL_12 ] = "SEARCH_EQUAL_12",
>> [ SEARCH_LOW_12 ] = "SEARCH_LOW_12",
>> [ READ_ELEMENT_STATUS ] = "READ_ELEMENT_STATUS",
>> [ SEND_VOLUME_TAG ] = "SEND_VOLUME_TAG",
>> - [ WRITE_LONG_2 ] = "WRITE_LONG_2",
>> -
>> - [ REPORT_DENSITY_SUPPORT ] = "REPORT_DENSITY_SUPPORT",
>> - [ GET_CONFIGURATION ] = "GET_CONFIGURATION",
>> - [ READ_16 ] = "READ_16",
>> - [ WRITE_16 ] = "WRITE_16",
>> - [ WRITE_VERIFY_16 ] = "WRITE_VERIFY_16",
>> - [ SERVICE_ACTION_IN ] = "SERVICE_ACTION_IN",
>> - [ REPORT_LUNS ] = "REPORT_LUNS",
>> - [ LOAD_UNLOAD ] = "LOAD_UNLOAD",
>> + [ READ_DEFECT_DATA ] = "READ_DEFECT_DATA",
>
> READ_DEFECT_DATA_12!
>
Yes.
>> [ SET_CD_SPEED ] = "SET_CD_SPEED",
>> - [ BLANK ] = "BLANK",
>> };
>>
>> if (cmd>= ARRAY_SIZE(names) || names[cmd] == NULL)
>> diff --git a/hw/scsi-defs.h b/hw/scsi-defs.h
>> index 413cce0..458a797 100644
>> --- a/hw/scsi-defs.h
>> +++ b/hw/scsi-defs.h
>> @@ -26,6 +26,7 @@
>>
>> #define TEST_UNIT_READY 0x00
>> #define REZERO_UNIT 0x01
>> +#define REWIND 0x01
>> #define REQUEST_SENSE 0x03
>> #define FORMAT_UNIT 0x04
>> #define READ_BLOCK_LIMITS 0x05
>> @@ -48,14 +49,14 @@
>> #define RECEIVE_DIAGNOSTIC 0x1c
>> #define SEND_DIAGNOSTIC 0x1d
>> #define ALLOW_MEDIUM_REMOVAL 0x1e
>> -
>> #define SET_WINDOW 0x24
>> -#define READ_CAPACITY 0x25
>> +#define READ_CAPACITY_10 0x25
>> #define READ_10 0x28
>> #define WRITE_10 0x2a
>> #define SEEK_10 0x2b
>> -#define WRITE_VERIFY 0x2e
>> -#define VERIFY 0x2f
>> +#define LOCATE_10 0x2b
>> +#define WRITE_VERIFY_10 0x2e
>> +#define VERIFY_10 0x2f
>> #define SEARCH_HIGH 0x30
>> #define SEARCH_EQUAL 0x31
>> #define SEARCH_LOW 0x32
>> @@ -71,11 +72,14 @@
>> #define WRITE_BUFFER 0x3b
>> #define READ_BUFFER 0x3c
>> #define UPDATE_BLOCK 0x3d
>> -#define READ_LONG 0x3e
>> -#define WRITE_LONG 0x3f
>> +#define READ_LONG_10 0x3e
>> +#define WRITE_LONG_10 0x3f
>> #define CHANGE_DEFINITION 0x40
>> -#define WRITE_SAME 0x41
>> +#define WRITE_SAME_10 0x41
>> +#define UNMAP 0x42
>> #define READ_TOC 0x43
>> +#define REPORT_DENSITY_SUPPORT 0x44
>> +#define GET_CONFIGURATION 0x46
>> #define LOG_SELECT 0x4c
>> #define LOG_SENSE 0x4d
>> #define MODE_SELECT_10 0x55
>> @@ -84,32 +88,40 @@
>> #define MODE_SENSE_10 0x5a
>> #define PERSISTENT_RESERVE_IN 0x5e
>> #define PERSISTENT_RESERVE_OUT 0x5f
>> +#define VARLENGTH_CDB 0x7f
>> +#define WRITE_FILEMARKS_16 0x80
>> +#define EXTENDED_COPY 0x83
>> +#define ATA_PASSTHROUGH 0x85
>> +#define ACCESS_CONTROL_IN 0x86
>> +#define ACCESS_CONTROL_OUT 0x87
>> +#define READ_16 0x88
>> +#define COMPARE_AND_WRITE 0x89
>> +#define WRITE_16 0x8a
>> +#define WRITE_VERIFY_16 0x8e
>> +#define VERIFY_16 0x8f
>> +#define SYNCHRONIZE_CACHE_16 0x91
>> +#define LOCATE_16 0x92
>> #define WRITE_SAME_16 0x93
>> +#define ERASE_16 0x93
>> +#define SERVICE_ACTION_IN 0x9e
>> +#define WRITE_LONG_16 0x9f
>> +#define REPORT_LUNS 0xa0
>> +#define BLANK 0xa1
>> #define MAINTENANCE_IN 0xa3
>> #define MAINTENANCE_OUT 0xa4
>> #define MOVE_MEDIUM 0xa5
>> +#define LOAD_UNLOAD 0xa6
>> #define READ_12 0xa8
>> #define WRITE_12 0xaa
>> #define WRITE_VERIFY_12 0xae
>> +#define VERIFY_12 0xaf
>> #define SEARCH_HIGH_12 0xb0
>> #define SEARCH_EQUAL_12 0xb1
>> #define SEARCH_LOW_12 0xb2
>> #define READ_ELEMENT_STATUS 0xb8
>> #define SEND_VOLUME_TAG 0xb6
>> -#define WRITE_LONG_2 0xea
>> -
>> -/* from hw/scsi-generic.c */
>> -#define REWIND 0x01
>> -#define REPORT_DENSITY_SUPPORT 0x44
>> -#define GET_CONFIGURATION 0x46
>> -#define READ_16 0x88
>> -#define WRITE_16 0x8a
>> -#define WRITE_VERIFY_16 0x8e
>> -#define SERVICE_ACTION_IN 0x9e
>> -#define REPORT_LUNS 0xa0
>> -#define LOAD_UNLOAD 0xa6
>> -#define SET_CD_SPEED 0xbb
>> -#define BLANK 0xa1
>> +#define READ_DEFECT_DATA_12 0xb7
>> +#define SET_CD_SPEED 0xbb
>>
>> /*
>> * SAM Status codes
>> @@ -154,6 +166,7 @@
>>
>> #define TYPE_DISK 0x00
>> #define TYPE_TAPE 0x01
>> +#define TYPE_PRINTER 0x02
>> #define TYPE_PROCESSOR 0x03 /* HP scanners use this */
>> #define TYPE_WORM 0x04 /* Treated as ROM by our system */
>> #define TYPE_ROM 0x05
>> @@ -161,6 +174,9 @@
>> #define TYPE_MOD 0x07 /* Magneto-optical disk -
>> * - treated as TYPE_DISK */
>> #define TYPE_MEDIUM_CHANGER 0x08
>> -#define TYPE_ENCLOSURE 0x0d /* Enclosure Services Device */
>> +#define TYPE_STORAGE_ARRAY 0x0c /* Storage array device */
>> +#define TYPE_ENCLOSURE 0x0d /* Enclosure Services Device */
>> +#define TYPE_RBC 0x0e /* Simplified Direct-Access Device */
>> +#define TYPE_OSD 0x11 /* Object-storage Device */
>> #define TYPE_NO_LUN 0x7f
>>
>> diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
>> index 05d14ab..2f7e0c9 100644
>> --- a/hw/scsi-disk.c
>> +++ b/hw/scsi-disk.c
>> @@ -836,7 +836,7 @@ static int scsi_disk_emulate_command(SCSIDiskReq *r, uint8_t *outbuf)
>> case TEST_UNIT_READY:
>> if (!bdrv_is_inserted(s->bs))
>> goto not_ready;
>> - break;
>> + break;
>> case REQUEST_SENSE:
>> if (req->cmd.xfer< 4)
>> goto illegal_request;
>> @@ -848,7 +848,7 @@ static int scsi_disk_emulate_command(SCSIDiskReq *r, uint8_t *outbuf)
>> buflen = scsi_disk_emulate_inquiry(req, outbuf);
>> if (buflen< 0)
>> goto illegal_request;
>> - break;
>> + break;
>> case MODE_SENSE:
>> case MODE_SENSE_10:
>> buflen = scsi_disk_emulate_mode_sense(req, outbuf);
>> @@ -881,14 +881,14 @@ static int scsi_disk_emulate_command(SCSIDiskReq *r, uint8_t *outbuf)
>> /* load/eject medium */
>> bdrv_eject(s->bs, !(req->cmd.buf[4]& 1));
>> }
>> - break;
>> + break;
>> case ALLOW_MEDIUM_REMOVAL:
>> bdrv_set_locked(s->bs, req->cmd.buf[4]& 1);
>> - break;
>> + break;
>> case READ_CAPACITY:
>> /* The normal LEN field for this command is zero. */
>> - memset(outbuf, 0, 8);
>> - bdrv_get_geometry(s->bs,&nb_sectors);
>> + memset(outbuf, 0, 8);
>> + bdrv_get_geometry(s->bs,&nb_sectors);
>> if (!nb_sectors)
>> goto not_ready;
>> nb_sectors /= s->cluster_size;
>> @@ -908,7 +908,7 @@ static int scsi_disk_emulate_command(SCSIDiskReq *r, uint8_t *outbuf)
>> outbuf[6] = s->cluster_size * 2;
>> outbuf[7] = 0;
>> buflen = 8;
>> - break;
>> + break;
>> case SYNCHRONIZE_CACHE:
>> ret = bdrv_flush(s->bs);
>> if (ret< 0) {
>> @@ -970,13 +970,7 @@ static int scsi_disk_emulate_command(SCSIDiskReq *r, uint8_t *outbuf)
>> outbuf[3] = 8;
>> buflen = 16;
>> break;
>> - case VERIFY:
>> - break;
>> - case REZERO_UNIT:
>> - DPRINTF("Rezero Unit\n");
>> - if (!bdrv_is_inserted(s->bs)) {
>> - goto not_ready;
>> - }
>
> Functional change, the commit message lies. Separate patch?
>
> Matching update to scsi_cmd_table[] missing.
>
> Looks like we could purge REZERO_UNIT elsewhere, too.
>
>> + case VERIFY_10:
>> break;
>> default:
>> scsi_command_complete(r, CHECK_CONDITION, SENSE_CODE(INVALID_OPCODE));
>> @@ -1052,14 +1046,13 @@ static int32_t scsi_send_command(SCSIRequest *req, uint8_t *buf)
>> case RELEASE_10:
>> case START_STOP:
>> case ALLOW_MEDIUM_REMOVAL:
>> - case READ_CAPACITY:
>> + case READ_CAPACITY_10:
>> case SYNCHRONIZE_CACHE:
>> case READ_TOC:
>> case GET_CONFIGURATION:
>> case SERVICE_ACTION_IN:
>> case REPORT_LUNS:
>> - case VERIFY:
>> - case REZERO_UNIT:
>> + case VERIFY_10:
>> rc = scsi_disk_emulate_command(r, outbuf);
>> if (rc< 0) {
>> return 0;
>> @@ -1082,7 +1075,7 @@ static int32_t scsi_send_command(SCSIRequest *req, uint8_t *buf)
>> case WRITE_10:
>> case WRITE_12:
>> case WRITE_16:
>> - case WRITE_VERIFY:
>> + case WRITE_VERIFY_10:
>> case WRITE_VERIFY_12:
>> case WRITE_VERIFY_16:
>> len = r->req.cmd.xfer / s->qdev.blocksize;
>> diff --git a/hw/scsi-generic.c b/hw/scsi-generic.c
>> index 90345a7..17e83c7 100644
>> --- a/hw/scsi-generic.c
>> +++ b/hw/scsi-generic.c
>> @@ -406,7 +406,7 @@ static int get_blocksize(BlockDriverState *bdrv)
>>
>> memset(cmd, 0, sizeof(cmd));
>> memset(buf, 0, sizeof(buf));
>> - cmd[0] = READ_CAPACITY;
>> + cmd[0] = READ_CAPACITY_10;
>>
>> memset(&io_header, 0, sizeof(io_header));
>> io_header.interface_id = 'S';
OK, convinced. Will be doing a separate patch for removing the
obsolete commands.
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
WARNING: multiple messages have this Message-ID (diff)
From: Hannes Reinecke <hare@suse.de>
To: Markus Armbruster <armbru@redhat.com>
Cc: Kevin Wolf <kwolf@redhat.com>,
qemu-devel@nongnu.org, kvm@vger.kernel.org,
Alexander Graf <agraf@suse.de>
Subject: Re: [Qemu-devel] [PATCH 1/3] scsi: Sanitize command definitions
Date: Fri, 22 Jul 2011 16:14:22 +0200 [thread overview]
Message-ID: <4E2985BE.5000809@suse.de> (raw)
In-Reply-To: <m3aac6l87d.fsf@blackfin.pond.sub.org>
On 07/22/2011 04:07 PM, Markus Armbruster wrote:
> Hannes Reinecke<hare@suse.de> writes:
>
>> Adding some missing command definitions and update the existing ones.
>> No functional change.
>
> Add: LOCATE_10, UNMAP, VARLENGTH_CDB, WRITE_FILEMARKS_16, EXTENDED_COPY,
> ATA_PASSTHROUGH, ACCESS_CONTROL_IN, ACCESS_CONTROL_OUT,
> COMPARE_AND_WRITE, VERIFY_16, SYNCHRONIZE_CACHE_16, LOCATE_16, ERASE_16,
> WRITE_LONG_16, VERIFY_12, READ_DEFECT_DATA_12.
>
> Rename: READ_CAPACITY, WRITE_VERIFY, VERIFY, READ_LONG, WRITE_LONG,
> WRITE_SAME to&_10.
>
> Delete: WRITE_LONG_2
>
OK.
>>
>> Signed-off-by: Hannes Reinecke<hare@suse.de>
>> ---
>> hw/scsi-bus.c | 71 ++++++++++++++++++++++++++++++----------------------
>> hw/scsi-defs.h | 60 ++++++++++++++++++++++++++++----------------
>> hw/scsi-disk.c | 29 ++++++++-------------
>> hw/scsi-generic.c | 2 +-
>> 4 files changed, 91 insertions(+), 71 deletions(-)
>>
>> diff --git a/hw/scsi-bus.c b/hw/scsi-bus.c
>> index 8b1a412..24a1298 100644
>> --- a/hw/scsi-bus.c
>> +++ b/hw/scsi-bus.c
>> @@ -232,24 +232,24 @@ static int scsi_req_length(SCSIRequest *req, uint8_t *cmd)
>> case RELEASE:
>> case ERASE:
>> case ALLOW_MEDIUM_REMOVAL:
>> - case VERIFY:
>> + case VERIFY_10:
>> case SEEK_10:
>> case SYNCHRONIZE_CACHE:
>> case LOCK_UNLOCK_CACHE:
>> case LOAD_UNLOAD:
>> case SET_CD_SPEED:
>> case SET_LIMITS:
>> - case WRITE_LONG:
>> + case WRITE_LONG_10:
>> case MOVE_MEDIUM:
>> case UPDATE_BLOCK:
>> req->cmd.xfer = 0;
>> break;
>> case MODE_SENSE:
>> break;
>> - case WRITE_SAME:
>> + case WRITE_SAME_10:
>> req->cmd.xfer = 1;
>> break;
>> - case READ_CAPACITY:
>> + case READ_CAPACITY_10:
>> req->cmd.xfer = 8;
>> break;
>> case READ_BLOCK_LIMITS:
>> @@ -265,7 +265,7 @@ static int scsi_req_length(SCSIRequest *req, uint8_t *cmd)
>> req->cmd.xfer *= 8;
>> break;
>> case WRITE_10:
>> - case WRITE_VERIFY:
>> + case WRITE_VERIFY_10:
>> case WRITE_6:
>> case WRITE_12:
>> case WRITE_VERIFY_12:
>> @@ -325,7 +325,7 @@ static void scsi_req_xfer_mode(SCSIRequest *req)
>> switch (req->cmd.buf[0]) {
>> case WRITE_6:
>> case WRITE_10:
>> - case WRITE_VERIFY:
>> + case WRITE_VERIFY_10:
>> case WRITE_12:
>> case WRITE_VERIFY_12:
>> case WRITE_16:
>> @@ -345,15 +345,13 @@ static void scsi_req_xfer_mode(SCSIRequest *req)
>> case SEARCH_HIGH:
>> case SEARCH_LOW:
>> case UPDATE_BLOCK:
>> - case WRITE_LONG:
>> - case WRITE_SAME:
>> + case WRITE_LONG_10:
>> + case WRITE_SAME_10:
>> case SEARCH_HIGH_12:
>> case SEARCH_EQUAL_12:
>> case SEARCH_LOW_12:
>> - case SET_WINDOW:
>
> I figure this is "no functional change" because all users of this
> function reject SET_WINDOW elsewhere.
>
Yes, you are correct. Will be doing another patch with removing
references to obsolete commands SET_WINDOW and WRITE_LONG_2.
>> case MEDIUM_SCAN:
>> case SEND_VOLUME_TAG:
>> - case WRITE_LONG_2:
>
> Same here.
>
Indeed.
>> case PERSISTENT_RESERVE_OUT:
>> case MAINTENANCE_OUT:
>> req->cmd.mode = SCSI_XFER_TO_DEV;
>> @@ -517,8 +515,7 @@ static const char *scsi_command_name(uint8_t cmd)
>> {
>> static const char *names[] = {
>> [ TEST_UNIT_READY ] = "TEST_UNIT_READY",
>> - [ REZERO_UNIT ] = "REZERO_UNIT",
>> - /* REWIND and REZERO_UNIT use the same operation code */
>> + [ REWIND ] = "REWIND",
>
> "No functional change" because it's used only for scsi_req_print(),
> which is unused.
>
See above.
>> [ REQUEST_SENSE ] = "REQUEST_SENSE",
>> [ FORMAT_UNIT ] = "FORMAT_UNIT",
>> [ READ_BLOCK_LIMITS ] = "READ_BLOCK_LIMITS",
>> @@ -543,14 +540,13 @@ static const char *scsi_command_name(uint8_t cmd)
>> [ RECEIVE_DIAGNOSTIC ] = "RECEIVE_DIAGNOSTIC",
>> [ SEND_DIAGNOSTIC ] = "SEND_DIAGNOSTIC",
>> [ ALLOW_MEDIUM_REMOVAL ] = "ALLOW_MEDIUM_REMOVAL",
>> -
>> [ SET_WINDOW ] = "SET_WINDOW",
>> - [ READ_CAPACITY ] = "READ_CAPACITY",
>> + [ READ_CAPACITY_10 ] = "READ_CAPACITY_10",
>> [ READ_10 ] = "READ_10",
>> [ WRITE_10 ] = "WRITE_10",
>> [ SEEK_10 ] = "SEEK_10",
>
> New LOCATE_10 missing.
>
OK.
>> - [ WRITE_VERIFY ] = "WRITE_VERIFY",
>> - [ VERIFY ] = "VERIFY",
>> + [ WRITE_VERIFY_10 ] = "WRITE_VERIFY_10",
>> + [ VERIFY_10 ] = "VERIFY_10",
>> [ SEARCH_HIGH ] = "SEARCH_HIGH",
>> [ SEARCH_EQUAL ] = "SEARCH_EQUAL",
>> [ SEARCH_LOW ] = "SEARCH_LOW",
>> @@ -566,11 +562,14 @@ static const char *scsi_command_name(uint8_t cmd)
>> [ WRITE_BUFFER ] = "WRITE_BUFFER",
>> [ READ_BUFFER ] = "READ_BUFFER",
>> [ UPDATE_BLOCK ] = "UPDATE_BLOCK",
>> - [ READ_LONG ] = "READ_LONG",
>> - [ WRITE_LONG ] = "WRITE_LONG",
>> + [ READ_LONG_10 ] = "READ_LONG_10",
>> + [ WRITE_LONG_10 ] = "WRITE_LONG_10",
>> [ CHANGE_DEFINITION ] = "CHANGE_DEFINITION",
>> - [ WRITE_SAME ] = "WRITE_SAME",
>> + [ WRITE_SAME_10 ] = "WRITE_SAME_10",
>> + [ UNMAP ] = "UNMAP",
>> [ READ_TOC ] = "READ_TOC",
>> + [ REPORT_DENSITY_SUPPORT ] = "REPORT_DENSITY_SUPPORT",
>> + [ GET_CONFIGURATION ] = "GET_CONFIGURATION",
>> [ LOG_SELECT ] = "LOG_SELECT",
>> [ LOG_SENSE ] = "LOG_SENSE",
>> [ MODE_SELECT_10 ] = "MODE_SELECT_10",
>> @@ -579,27 +578,39 @@ static const char *scsi_command_name(uint8_t cmd)
>> [ MODE_SENSE_10 ] = "MODE_SENSE_10",
>> [ PERSISTENT_RESERVE_IN ] = "PERSISTENT_RESERVE_IN",
>> [ PERSISTENT_RESERVE_OUT ] = "PERSISTENT_RESERVE_OUT",
>
> New VARLENGTH_CDB missing.
>
Intentionally. VARLENGHT_CDB is used for all sorts of things, so
I think we should be printing that one out separately.
Same goes for MAINTENANCE_(IN|OUT) and SERVICE_ACTION_(IN|OUT).
>> + [ WRITE_FILEMARKS_16 ] = "WRITE_FILEMARKS_16",
>> + [ EXTENDED_COPY ] = "EXTENDED_COPY",
>> + [ ATA_PASSTHROUGH ] = "ATA_PASSTHROUGH",
>> + [ ACCESS_CONTROL_IN ] = "ACCESS_CONTROL_IN",
>> + [ ACCESS_CONTROL_OUT ] = "ACCESS_CONTROL_OUT",
>> + [ READ_16 ] = "READ_16",
>> + [ COMPARE_AND_WRITE ] = "COMPARE_AND_WRITE",
>> + [ WRITE_16 ] = "WRITE_16",
>> + [ WRITE_VERIFY_16 ] = "WRITE_VERIFY_16",
>> + [ VERIFY_16 ] = "VERIFY_16",
>> + [ SYNCHRONIZE_CACHE_16 ] = "SYNCHRONIZE_CACHE_16",
>> + [ LOCATE_16 ] = "LOCATE_16",
>> + [ WRITE_SAME_16 ] = "WRITE_SAME_16",
>> + [ ERASE_16 ] = "ERASE_16",
>> + [ SERVICE_ACTION_IN ] = "SERVICE_ACTION_IN",
>> + [ WRITE_LONG_16 ] = "WRITE_LONG_16",
>> + [ REPORT_LUNS ] = "REPORT_LUNS",
>> + [ BLANK ] = "BLANK",
>> + [ MAINTENANCE_IN ] = "MAINTENANCE_IN",
>> + [ MAINTENANCE_OUT ] = "MAINTENANCE_OUT",
>
> Fixes missing WRITE_SAME_16, MAINTENANCE_IN, MAINTENANCE_OUT.
>
Yes.
>> [ MOVE_MEDIUM ] = "MOVE_MEDIUM",
>> + [ LOAD_UNLOAD ] = "LOAD_UNLOAD",
>> [ READ_12 ] = "READ_12",
>> [ WRITE_12 ] = "WRITE_12",
>> [ WRITE_VERIFY_12 ] = "WRITE_VERIFY_12",
>> + [ VERIFY_12 ] = "VERIFY_12",
>> [ SEARCH_HIGH_12 ] = "SEARCH_HIGH_12",
>> [ SEARCH_EQUAL_12 ] = "SEARCH_EQUAL_12",
>> [ SEARCH_LOW_12 ] = "SEARCH_LOW_12",
>> [ READ_ELEMENT_STATUS ] = "READ_ELEMENT_STATUS",
>> [ SEND_VOLUME_TAG ] = "SEND_VOLUME_TAG",
>> - [ WRITE_LONG_2 ] = "WRITE_LONG_2",
>> -
>> - [ REPORT_DENSITY_SUPPORT ] = "REPORT_DENSITY_SUPPORT",
>> - [ GET_CONFIGURATION ] = "GET_CONFIGURATION",
>> - [ READ_16 ] = "READ_16",
>> - [ WRITE_16 ] = "WRITE_16",
>> - [ WRITE_VERIFY_16 ] = "WRITE_VERIFY_16",
>> - [ SERVICE_ACTION_IN ] = "SERVICE_ACTION_IN",
>> - [ REPORT_LUNS ] = "REPORT_LUNS",
>> - [ LOAD_UNLOAD ] = "LOAD_UNLOAD",
>> + [ READ_DEFECT_DATA ] = "READ_DEFECT_DATA",
>
> READ_DEFECT_DATA_12!
>
Yes.
>> [ SET_CD_SPEED ] = "SET_CD_SPEED",
>> - [ BLANK ] = "BLANK",
>> };
>>
>> if (cmd>= ARRAY_SIZE(names) || names[cmd] == NULL)
>> diff --git a/hw/scsi-defs.h b/hw/scsi-defs.h
>> index 413cce0..458a797 100644
>> --- a/hw/scsi-defs.h
>> +++ b/hw/scsi-defs.h
>> @@ -26,6 +26,7 @@
>>
>> #define TEST_UNIT_READY 0x00
>> #define REZERO_UNIT 0x01
>> +#define REWIND 0x01
>> #define REQUEST_SENSE 0x03
>> #define FORMAT_UNIT 0x04
>> #define READ_BLOCK_LIMITS 0x05
>> @@ -48,14 +49,14 @@
>> #define RECEIVE_DIAGNOSTIC 0x1c
>> #define SEND_DIAGNOSTIC 0x1d
>> #define ALLOW_MEDIUM_REMOVAL 0x1e
>> -
>> #define SET_WINDOW 0x24
>> -#define READ_CAPACITY 0x25
>> +#define READ_CAPACITY_10 0x25
>> #define READ_10 0x28
>> #define WRITE_10 0x2a
>> #define SEEK_10 0x2b
>> -#define WRITE_VERIFY 0x2e
>> -#define VERIFY 0x2f
>> +#define LOCATE_10 0x2b
>> +#define WRITE_VERIFY_10 0x2e
>> +#define VERIFY_10 0x2f
>> #define SEARCH_HIGH 0x30
>> #define SEARCH_EQUAL 0x31
>> #define SEARCH_LOW 0x32
>> @@ -71,11 +72,14 @@
>> #define WRITE_BUFFER 0x3b
>> #define READ_BUFFER 0x3c
>> #define UPDATE_BLOCK 0x3d
>> -#define READ_LONG 0x3e
>> -#define WRITE_LONG 0x3f
>> +#define READ_LONG_10 0x3e
>> +#define WRITE_LONG_10 0x3f
>> #define CHANGE_DEFINITION 0x40
>> -#define WRITE_SAME 0x41
>> +#define WRITE_SAME_10 0x41
>> +#define UNMAP 0x42
>> #define READ_TOC 0x43
>> +#define REPORT_DENSITY_SUPPORT 0x44
>> +#define GET_CONFIGURATION 0x46
>> #define LOG_SELECT 0x4c
>> #define LOG_SENSE 0x4d
>> #define MODE_SELECT_10 0x55
>> @@ -84,32 +88,40 @@
>> #define MODE_SENSE_10 0x5a
>> #define PERSISTENT_RESERVE_IN 0x5e
>> #define PERSISTENT_RESERVE_OUT 0x5f
>> +#define VARLENGTH_CDB 0x7f
>> +#define WRITE_FILEMARKS_16 0x80
>> +#define EXTENDED_COPY 0x83
>> +#define ATA_PASSTHROUGH 0x85
>> +#define ACCESS_CONTROL_IN 0x86
>> +#define ACCESS_CONTROL_OUT 0x87
>> +#define READ_16 0x88
>> +#define COMPARE_AND_WRITE 0x89
>> +#define WRITE_16 0x8a
>> +#define WRITE_VERIFY_16 0x8e
>> +#define VERIFY_16 0x8f
>> +#define SYNCHRONIZE_CACHE_16 0x91
>> +#define LOCATE_16 0x92
>> #define WRITE_SAME_16 0x93
>> +#define ERASE_16 0x93
>> +#define SERVICE_ACTION_IN 0x9e
>> +#define WRITE_LONG_16 0x9f
>> +#define REPORT_LUNS 0xa0
>> +#define BLANK 0xa1
>> #define MAINTENANCE_IN 0xa3
>> #define MAINTENANCE_OUT 0xa4
>> #define MOVE_MEDIUM 0xa5
>> +#define LOAD_UNLOAD 0xa6
>> #define READ_12 0xa8
>> #define WRITE_12 0xaa
>> #define WRITE_VERIFY_12 0xae
>> +#define VERIFY_12 0xaf
>> #define SEARCH_HIGH_12 0xb0
>> #define SEARCH_EQUAL_12 0xb1
>> #define SEARCH_LOW_12 0xb2
>> #define READ_ELEMENT_STATUS 0xb8
>> #define SEND_VOLUME_TAG 0xb6
>> -#define WRITE_LONG_2 0xea
>> -
>> -/* from hw/scsi-generic.c */
>> -#define REWIND 0x01
>> -#define REPORT_DENSITY_SUPPORT 0x44
>> -#define GET_CONFIGURATION 0x46
>> -#define READ_16 0x88
>> -#define WRITE_16 0x8a
>> -#define WRITE_VERIFY_16 0x8e
>> -#define SERVICE_ACTION_IN 0x9e
>> -#define REPORT_LUNS 0xa0
>> -#define LOAD_UNLOAD 0xa6
>> -#define SET_CD_SPEED 0xbb
>> -#define BLANK 0xa1
>> +#define READ_DEFECT_DATA_12 0xb7
>> +#define SET_CD_SPEED 0xbb
>>
>> /*
>> * SAM Status codes
>> @@ -154,6 +166,7 @@
>>
>> #define TYPE_DISK 0x00
>> #define TYPE_TAPE 0x01
>> +#define TYPE_PRINTER 0x02
>> #define TYPE_PROCESSOR 0x03 /* HP scanners use this */
>> #define TYPE_WORM 0x04 /* Treated as ROM by our system */
>> #define TYPE_ROM 0x05
>> @@ -161,6 +174,9 @@
>> #define TYPE_MOD 0x07 /* Magneto-optical disk -
>> * - treated as TYPE_DISK */
>> #define TYPE_MEDIUM_CHANGER 0x08
>> -#define TYPE_ENCLOSURE 0x0d /* Enclosure Services Device */
>> +#define TYPE_STORAGE_ARRAY 0x0c /* Storage array device */
>> +#define TYPE_ENCLOSURE 0x0d /* Enclosure Services Device */
>> +#define TYPE_RBC 0x0e /* Simplified Direct-Access Device */
>> +#define TYPE_OSD 0x11 /* Object-storage Device */
>> #define TYPE_NO_LUN 0x7f
>>
>> diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
>> index 05d14ab..2f7e0c9 100644
>> --- a/hw/scsi-disk.c
>> +++ b/hw/scsi-disk.c
>> @@ -836,7 +836,7 @@ static int scsi_disk_emulate_command(SCSIDiskReq *r, uint8_t *outbuf)
>> case TEST_UNIT_READY:
>> if (!bdrv_is_inserted(s->bs))
>> goto not_ready;
>> - break;
>> + break;
>> case REQUEST_SENSE:
>> if (req->cmd.xfer< 4)
>> goto illegal_request;
>> @@ -848,7 +848,7 @@ static int scsi_disk_emulate_command(SCSIDiskReq *r, uint8_t *outbuf)
>> buflen = scsi_disk_emulate_inquiry(req, outbuf);
>> if (buflen< 0)
>> goto illegal_request;
>> - break;
>> + break;
>> case MODE_SENSE:
>> case MODE_SENSE_10:
>> buflen = scsi_disk_emulate_mode_sense(req, outbuf);
>> @@ -881,14 +881,14 @@ static int scsi_disk_emulate_command(SCSIDiskReq *r, uint8_t *outbuf)
>> /* load/eject medium */
>> bdrv_eject(s->bs, !(req->cmd.buf[4]& 1));
>> }
>> - break;
>> + break;
>> case ALLOW_MEDIUM_REMOVAL:
>> bdrv_set_locked(s->bs, req->cmd.buf[4]& 1);
>> - break;
>> + break;
>> case READ_CAPACITY:
>> /* The normal LEN field for this command is zero. */
>> - memset(outbuf, 0, 8);
>> - bdrv_get_geometry(s->bs,&nb_sectors);
>> + memset(outbuf, 0, 8);
>> + bdrv_get_geometry(s->bs,&nb_sectors);
>> if (!nb_sectors)
>> goto not_ready;
>> nb_sectors /= s->cluster_size;
>> @@ -908,7 +908,7 @@ static int scsi_disk_emulate_command(SCSIDiskReq *r, uint8_t *outbuf)
>> outbuf[6] = s->cluster_size * 2;
>> outbuf[7] = 0;
>> buflen = 8;
>> - break;
>> + break;
>> case SYNCHRONIZE_CACHE:
>> ret = bdrv_flush(s->bs);
>> if (ret< 0) {
>> @@ -970,13 +970,7 @@ static int scsi_disk_emulate_command(SCSIDiskReq *r, uint8_t *outbuf)
>> outbuf[3] = 8;
>> buflen = 16;
>> break;
>> - case VERIFY:
>> - break;
>> - case REZERO_UNIT:
>> - DPRINTF("Rezero Unit\n");
>> - if (!bdrv_is_inserted(s->bs)) {
>> - goto not_ready;
>> - }
>
> Functional change, the commit message lies. Separate patch?
>
> Matching update to scsi_cmd_table[] missing.
>
> Looks like we could purge REZERO_UNIT elsewhere, too.
>
>> + case VERIFY_10:
>> break;
>> default:
>> scsi_command_complete(r, CHECK_CONDITION, SENSE_CODE(INVALID_OPCODE));
>> @@ -1052,14 +1046,13 @@ static int32_t scsi_send_command(SCSIRequest *req, uint8_t *buf)
>> case RELEASE_10:
>> case START_STOP:
>> case ALLOW_MEDIUM_REMOVAL:
>> - case READ_CAPACITY:
>> + case READ_CAPACITY_10:
>> case SYNCHRONIZE_CACHE:
>> case READ_TOC:
>> case GET_CONFIGURATION:
>> case SERVICE_ACTION_IN:
>> case REPORT_LUNS:
>> - case VERIFY:
>> - case REZERO_UNIT:
>> + case VERIFY_10:
>> rc = scsi_disk_emulate_command(r, outbuf);
>> if (rc< 0) {
>> return 0;
>> @@ -1082,7 +1075,7 @@ static int32_t scsi_send_command(SCSIRequest *req, uint8_t *buf)
>> case WRITE_10:
>> case WRITE_12:
>> case WRITE_16:
>> - case WRITE_VERIFY:
>> + case WRITE_VERIFY_10:
>> case WRITE_VERIFY_12:
>> case WRITE_VERIFY_16:
>> len = r->req.cmd.xfer / s->qdev.blocksize;
>> diff --git a/hw/scsi-generic.c b/hw/scsi-generic.c
>> index 90345a7..17e83c7 100644
>> --- a/hw/scsi-generic.c
>> +++ b/hw/scsi-generic.c
>> @@ -406,7 +406,7 @@ static int get_blocksize(BlockDriverState *bdrv)
>>
>> memset(cmd, 0, sizeof(cmd));
>> memset(buf, 0, sizeof(buf));
>> - cmd[0] = READ_CAPACITY;
>> + cmd[0] = READ_CAPACITY_10;
>>
>> memset(&io_header, 0, sizeof(io_header));
>> io_header.interface_id = 'S';
OK, convinced. Will be doing a separate patch for removing the
obsolete commands.
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
next prev parent reply other threads:[~2011-07-22 14:14 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-07-22 12:31 [PATCH 0/3] Check for supported SCSI commands Hannes Reinecke
2011-07-22 12:31 ` [Qemu-devel] " Hannes Reinecke
2011-07-22 12:31 ` [PATCH 1/3] scsi: Sanitize command definitions Hannes Reinecke
2011-07-22 12:31 ` [Qemu-devel] " Hannes Reinecke
2011-07-22 14:07 ` Markus Armbruster
2011-07-22 14:07 ` Markus Armbruster
2011-07-22 14:14 ` Hannes Reinecke [this message]
2011-07-22 14:14 ` Hannes Reinecke
2011-07-22 12:31 ` [PATCH 2/3] scsi-disk: Remove drive_kind Hannes Reinecke
2011-07-22 12:31 ` [Qemu-devel] " Hannes Reinecke
2011-07-22 12:31 ` [PATCH 3/3] scsi-disk: Check for supported commands Hannes Reinecke
2011-07-22 12:31 ` [Qemu-devel] " Hannes Reinecke
2011-07-22 14:09 ` Markus Armbruster
2011-07-22 14:09 ` Markus Armbruster
2011-07-22 14:15 ` Hannes Reinecke
2011-07-22 14:15 ` Hannes Reinecke
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=4E2985BE.5000809@suse.de \
--to=hare@suse.de \
--cc=agraf@suse.de \
--cc=armbru@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=kwolf@redhat.com \
--cc=qemu-devel@nongnu.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: link
Be 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.