diff mbox

[2/5] Vendor name and product name parameters for SCSI devices Options "vendor_name" and "product_name" added for SCSI disks.

Message ID 1331802150-12183-3-git-send-email-dmitry.fleytman@ravellosystems.com
State New
Headers show

Commit Message

Dmitry Fleytman March 15, 2012, 9:02 a.m. UTC
Sample command line is:

    -drive file=image.raw,if=none,cache=off,id=scsi1 \
    -device lsi,id=scsi -device scsi-disk,drive=scsi1,bus=scsi.0,product_name="VENDOR SCSI DISK",vendor_name="[VENDOR]" \

Signed-off-by: Dmitry Fleytman <dmitry@daynix.com>
Signed-off-by: Yan Vugenfirer <yan@daynix.com>
---
 blockdev.h     |    6 +++++-
 hw/scsi-disk.c |   51 ++++++++++++++++++++++++++++++++++++---------------
 2 files changed, 41 insertions(+), 16 deletions(-)

Comments

Paolo Bonzini March 15, 2012, 9:55 a.m. UTC | #1
Il 15/03/2012 10:02, Dmitry Fleytman ha scritto:
> Sample command line is:
> 
>     -drive file=image.raw,if=none,cache=off,id=scsi1 \
>     -device lsi,id=scsi -device scsi-disk,drive=scsi1,bus=scsi.0,product_name="VENDOR SCSI DISK",vendor_name="[VENDOR]" \
> 
> Signed-off-by: Dmitry Fleytman <dmitry@daynix.com>
> Signed-off-by: Yan Vugenfirer <yan@daynix.com>
> ---
>  blockdev.h     |    6 +++++-
>  hw/scsi-disk.c |   51 ++++++++++++++++++++++++++++++++++++---------------
>  2 files changed, 41 insertions(+), 16 deletions(-)
> 
> diff --git a/blockdev.h b/blockdev.h
> index 260e16b..1813c53 100644
> --- a/blockdev.h
> +++ b/blockdev.h
> @@ -17,7 +17,9 @@
>  void blockdev_mark_auto_del(BlockDriverState *bs);
>  void blockdev_auto_del(BlockDriverState *bs);
>  
> -#define BLOCK_SERIAL_STRLEN 20
> +#define BLOCK_SERIAL_STRLEN  20
> +#define BLOCK_VENDOR_STRLEN  8
> +#define BLOCK_PRODUCT_STRLEN 16
>  
>  typedef enum {
>      IF_DEFAULT = -1,            /* for use with drive_add() only */
> @@ -37,6 +39,8 @@ struct DriveInfo {
>      int media_cd;
>      QemuOpts *opts;
>      char serial[BLOCK_SERIAL_STRLEN + 1];
> +    char vname[BLOCK_VENDOR_STRLEN + 1];
> +    char pname[BLOCK_PRODUCT_STRLEN + 1];
>      QTAILQ_ENTRY(DriveInfo) next;
>      int refcount;
>  };

Unused.

> diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
> index add399e..0a12ea2 100644
> --- a/hw/scsi-disk.c
> +++ b/hw/scsi-disk.c
> @@ -70,6 +70,8 @@ struct SCSIDiskState
>      QEMUBH *bh;
>      char *version;
>      char *serial;
> +    char *vname;
> +    char *pname;
>      bool tray_open;
>      bool tray_locked;
>  };
> @@ -566,12 +568,23 @@ static int scsi_disk_emulate_inquiry(SCSIRequest *req, uint8_t *outbuf)
>  
>      outbuf[0] = s->qdev.type & 0x1f;
>      outbuf[1] = s->removable ? 0x80 : 0;
> -    if (s->qdev.type == TYPE_ROM) {
> -        memcpy(&outbuf[16], "QEMU CD-ROM     ", 16);
> +
> +    if (NULL != s->pname) {
> +        strpadcpy((char *) &outbuf[16], 16, s->pname, ' ');
>      } else {
> -        memcpy(&outbuf[16], "QEMU HARDDISK   ", 16);
> +        if (s->qdev.type == TYPE_ROM) {
> +            memcpy(&outbuf[16], "QEMU CD-ROM     ", 16);
> +        } else {
> +            memcpy(&outbuf[16], "QEMU HARDDISK   ", 16);
> +        }
>      }
> -    memcpy(&outbuf[8], "QEMU    ", 8);
> +
> +    if (NULL != s->vname) {
> +        strpadcpy((char *) &outbuf[8], 8, s->vname, ' ');
> +    } else {
> +        memcpy(&outbuf[8], "QEMU    ", 8);
> +    }
> +
>      memset(&outbuf[32], 0, 4);
>      memcpy(&outbuf[32], s->version, MIN(4, strlen(s->version)));
>      /*
> @@ -1585,14 +1598,19 @@ static int scsi_initfn(SCSIDevice *dev)
>          return -1;
>      }
>  
> -    if (!s->serial) {
> -        /* try to fall back to value set with legacy -drive serial=... */
> -        dinfo = drive_get_by_blockdev(s->qdev.conf.bs);
> -        if (*dinfo->serial) {
> -            s->serial = g_strdup(dinfo->serial);
> -        }
> -    }
> +    dinfo = drive_get_by_blockdev(s->qdev.conf.bs);
>  
> +    /* when no value given try to fall back to */
> +    /* value set with legacy -drive serial=... */
> +    if ((!s->serial) && (*dinfo->serial)) {
> +        s->serial = g_strdup(dinfo->serial);
> +    }

No need to change the way the serial is handled, because you don't need
dinfo for vname/pname.

> +    if ((!s->vname) && (*dinfo->vname)) {
> +        s->vname = g_strdup(dinfo->vname);
> +    }
> +    if ((!s->pname) && (*dinfo->pname)) {
> +        s->pname = g_strdup(dinfo->pname);
> +    }

(Also, no parentheses around simple conditions).

>      if (!s->version) {
>          s->version = g_strdup(QEMU_VERSION);
>      }
> @@ -1788,10 +1806,13 @@ static SCSIRequest *scsi_block_new_request(SCSIDevice *d, uint32_t tag,
>  }
>  #endif
>  
> -#define DEFINE_SCSI_DISK_PROPERTIES()                           \
> -    DEFINE_BLOCK_PROPERTIES(SCSIDiskState, qdev.conf),          \
> -    DEFINE_PROP_STRING("ver",  SCSIDiskState, version),         \
> -    DEFINE_PROP_STRING("serial",  SCSIDiskState, serial)
> +#define DEFINE_SCSI_DISK_PROPERTIES()                                 \
> +    DEFINE_BLOCK_PROPERTIES(SCSIDiskState, qdev.conf),                \
> +    DEFINE_PROP_STRING("ver",  SCSIDiskState, version),               \
> +    DEFINE_PROP_STRING("serial",  SCSIDiskState, serial),             \
> +    DEFINE_PROP_STRING("vendor_name",  SCSIDiskState, vname),         \
> +    DEFINE_PROP_STRING("product_name",  SCSIDiskState, pname)
> +
>  
>  static Property scsi_hd_properties[] = {
>      DEFINE_SCSI_DISK_PROPERTIES(),

Paolo
Dmitry Fleytman March 18, 2012, 9:24 a.m. UTC | #2
Unused stuff cleaned out.

On Thu, Mar 15, 2012 at 11:55 AM, Paolo Bonzini <pbonzini@redhat.com> wrote:
> Il 15/03/2012 10:02, Dmitry Fleytman ha scritto:
>> Sample command line is:
>>
>>     -drive file=image.raw,if=none,cache=off,id=scsi1 \
>>     -device lsi,id=scsi -device scsi-disk,drive=scsi1,bus=scsi.0,product_name="VENDOR SCSI DISK",vendor_name="[VENDOR]" \
>>
>> Signed-off-by: Dmitry Fleytman <dmitry@daynix.com>
>> Signed-off-by: Yan Vugenfirer <yan@daynix.com>
>> ---
>>  blockdev.h     |    6 +++++-
>>  hw/scsi-disk.c |   51 ++++++++++++++++++++++++++++++++++++---------------
>>  2 files changed, 41 insertions(+), 16 deletions(-)
>>
>> diff --git a/blockdev.h b/blockdev.h
>> index 260e16b..1813c53 100644
>> --- a/blockdev.h
>> +++ b/blockdev.h
>> @@ -17,7 +17,9 @@
>>  void blockdev_mark_auto_del(BlockDriverState *bs);
>>  void blockdev_auto_del(BlockDriverState *bs);
>>
>> -#define BLOCK_SERIAL_STRLEN 20
>> +#define BLOCK_SERIAL_STRLEN  20
>> +#define BLOCK_VENDOR_STRLEN  8
>> +#define BLOCK_PRODUCT_STRLEN 16
>>
>>  typedef enum {
>>      IF_DEFAULT = -1,            /* for use with drive_add() only */
>> @@ -37,6 +39,8 @@ struct DriveInfo {
>>      int media_cd;
>>      QemuOpts *opts;
>>      char serial[BLOCK_SERIAL_STRLEN + 1];
>> +    char vname[BLOCK_VENDOR_STRLEN + 1];
>> +    char pname[BLOCK_PRODUCT_STRLEN + 1];
>>      QTAILQ_ENTRY(DriveInfo) next;
>>      int refcount;
>>  };
>
> Unused.
>
>> diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
>> index add399e..0a12ea2 100644
>> --- a/hw/scsi-disk.c
>> +++ b/hw/scsi-disk.c
>> @@ -70,6 +70,8 @@ struct SCSIDiskState
>>      QEMUBH *bh;
>>      char *version;
>>      char *serial;
>> +    char *vname;
>> +    char *pname;
>>      bool tray_open;
>>      bool tray_locked;
>>  };
>> @@ -566,12 +568,23 @@ static int scsi_disk_emulate_inquiry(SCSIRequest *req, uint8_t *outbuf)
>>
>>      outbuf[0] = s->qdev.type & 0x1f;
>>      outbuf[1] = s->removable ? 0x80 : 0;
>> -    if (s->qdev.type == TYPE_ROM) {
>> -        memcpy(&outbuf[16], "QEMU CD-ROM     ", 16);
>> +
>> +    if (NULL != s->pname) {
>> +        strpadcpy((char *) &outbuf[16], 16, s->pname, ' ');
>>      } else {
>> -        memcpy(&outbuf[16], "QEMU HARDDISK   ", 16);
>> +        if (s->qdev.type == TYPE_ROM) {
>> +            memcpy(&outbuf[16], "QEMU CD-ROM     ", 16);
>> +        } else {
>> +            memcpy(&outbuf[16], "QEMU HARDDISK   ", 16);
>> +        }
>>      }
>> -    memcpy(&outbuf[8], "QEMU    ", 8);
>> +
>> +    if (NULL != s->vname) {
>> +        strpadcpy((char *) &outbuf[8], 8, s->vname, ' ');
>> +    } else {
>> +        memcpy(&outbuf[8], "QEMU    ", 8);
>> +    }
>> +
>>      memset(&outbuf[32], 0, 4);
>>      memcpy(&outbuf[32], s->version, MIN(4, strlen(s->version)));
>>      /*
>> @@ -1585,14 +1598,19 @@ static int scsi_initfn(SCSIDevice *dev)
>>          return -1;
>>      }
>>
>> -    if (!s->serial) {
>> -        /* try to fall back to value set with legacy -drive serial=... */
>> -        dinfo = drive_get_by_blockdev(s->qdev.conf.bs);
>> -        if (*dinfo->serial) {
>> -            s->serial = g_strdup(dinfo->serial);
>> -        }
>> -    }
>> +    dinfo = drive_get_by_blockdev(s->qdev.conf.bs);
>>
>> +    /* when no value given try to fall back to */
>> +    /* value set with legacy -drive serial=... */
>> +    if ((!s->serial) && (*dinfo->serial)) {
>> +        s->serial = g_strdup(dinfo->serial);
>> +    }
>
> No need to change the way the serial is handled, because you don't need
> dinfo for vname/pname.
>
>> +    if ((!s->vname) && (*dinfo->vname)) {
>> +        s->vname = g_strdup(dinfo->vname);
>> +    }
>> +    if ((!s->pname) && (*dinfo->pname)) {
>> +        s->pname = g_strdup(dinfo->pname);
>> +    }
>
> (Also, no parentheses around simple conditions).
>
>>      if (!s->version) {
>>          s->version = g_strdup(QEMU_VERSION);
>>      }
>> @@ -1788,10 +1806,13 @@ static SCSIRequest *scsi_block_new_request(SCSIDevice *d, uint32_t tag,
>>  }
>>  #endif
>>
>> -#define DEFINE_SCSI_DISK_PROPERTIES()                           \
>> -    DEFINE_BLOCK_PROPERTIES(SCSIDiskState, qdev.conf),          \
>> -    DEFINE_PROP_STRING("ver",  SCSIDiskState, version),         \
>> -    DEFINE_PROP_STRING("serial",  SCSIDiskState, serial)
>> +#define DEFINE_SCSI_DISK_PROPERTIES()                                 \
>> +    DEFINE_BLOCK_PROPERTIES(SCSIDiskState, qdev.conf),                \
>> +    DEFINE_PROP_STRING("ver",  SCSIDiskState, version),               \
>> +    DEFINE_PROP_STRING("serial",  SCSIDiskState, serial),             \
>> +    DEFINE_PROP_STRING("vendor_name",  SCSIDiskState, vname),         \
>> +    DEFINE_PROP_STRING("product_name",  SCSIDiskState, pname)
>> +
>>
>>  static Property scsi_hd_properties[] = {
>>      DEFINE_SCSI_DISK_PROPERTIES(),
>
> Paolo
diff mbox

Patch

diff --git a/blockdev.h b/blockdev.h
index 260e16b..1813c53 100644
--- a/blockdev.h
+++ b/blockdev.h
@@ -17,7 +17,9 @@ 
 void blockdev_mark_auto_del(BlockDriverState *bs);
 void blockdev_auto_del(BlockDriverState *bs);
 
-#define BLOCK_SERIAL_STRLEN 20
+#define BLOCK_SERIAL_STRLEN  20
+#define BLOCK_VENDOR_STRLEN  8
+#define BLOCK_PRODUCT_STRLEN 16
 
 typedef enum {
     IF_DEFAULT = -1,            /* for use with drive_add() only */
@@ -37,6 +39,8 @@  struct DriveInfo {
     int media_cd;
     QemuOpts *opts;
     char serial[BLOCK_SERIAL_STRLEN + 1];
+    char vname[BLOCK_VENDOR_STRLEN + 1];
+    char pname[BLOCK_PRODUCT_STRLEN + 1];
     QTAILQ_ENTRY(DriveInfo) next;
     int refcount;
 };
diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
index add399e..0a12ea2 100644
--- a/hw/scsi-disk.c
+++ b/hw/scsi-disk.c
@@ -70,6 +70,8 @@  struct SCSIDiskState
     QEMUBH *bh;
     char *version;
     char *serial;
+    char *vname;
+    char *pname;
     bool tray_open;
     bool tray_locked;
 };
@@ -566,12 +568,23 @@  static int scsi_disk_emulate_inquiry(SCSIRequest *req, uint8_t *outbuf)
 
     outbuf[0] = s->qdev.type & 0x1f;
     outbuf[1] = s->removable ? 0x80 : 0;
-    if (s->qdev.type == TYPE_ROM) {
-        memcpy(&outbuf[16], "QEMU CD-ROM     ", 16);
+
+    if (NULL != s->pname) {
+        strpadcpy((char *) &outbuf[16], 16, s->pname, ' ');
     } else {
-        memcpy(&outbuf[16], "QEMU HARDDISK   ", 16);
+        if (s->qdev.type == TYPE_ROM) {
+            memcpy(&outbuf[16], "QEMU CD-ROM     ", 16);
+        } else {
+            memcpy(&outbuf[16], "QEMU HARDDISK   ", 16);
+        }
     }
-    memcpy(&outbuf[8], "QEMU    ", 8);
+
+    if (NULL != s->vname) {
+        strpadcpy((char *) &outbuf[8], 8, s->vname, ' ');
+    } else {
+        memcpy(&outbuf[8], "QEMU    ", 8);
+    }
+
     memset(&outbuf[32], 0, 4);
     memcpy(&outbuf[32], s->version, MIN(4, strlen(s->version)));
     /*
@@ -1585,14 +1598,19 @@  static int scsi_initfn(SCSIDevice *dev)
         return -1;
     }
 
-    if (!s->serial) {
-        /* try to fall back to value set with legacy -drive serial=... */
-        dinfo = drive_get_by_blockdev(s->qdev.conf.bs);
-        if (*dinfo->serial) {
-            s->serial = g_strdup(dinfo->serial);
-        }
-    }
+    dinfo = drive_get_by_blockdev(s->qdev.conf.bs);
 
+    /* when no value given try to fall back to */
+    /* value set with legacy -drive serial=... */
+    if ((!s->serial) && (*dinfo->serial)) {
+        s->serial = g_strdup(dinfo->serial);
+    }
+    if ((!s->vname) && (*dinfo->vname)) {
+        s->vname = g_strdup(dinfo->vname);
+    }
+    if ((!s->pname) && (*dinfo->pname)) {
+        s->pname = g_strdup(dinfo->pname);
+    }
     if (!s->version) {
         s->version = g_strdup(QEMU_VERSION);
     }
@@ -1788,10 +1806,13 @@  static SCSIRequest *scsi_block_new_request(SCSIDevice *d, uint32_t tag,
 }
 #endif
 
-#define DEFINE_SCSI_DISK_PROPERTIES()                           \
-    DEFINE_BLOCK_PROPERTIES(SCSIDiskState, qdev.conf),          \
-    DEFINE_PROP_STRING("ver",  SCSIDiskState, version),         \
-    DEFINE_PROP_STRING("serial",  SCSIDiskState, serial)
+#define DEFINE_SCSI_DISK_PROPERTIES()                                 \
+    DEFINE_BLOCK_PROPERTIES(SCSIDiskState, qdev.conf),                \
+    DEFINE_PROP_STRING("ver",  SCSIDiskState, version),               \
+    DEFINE_PROP_STRING("serial",  SCSIDiskState, serial),             \
+    DEFINE_PROP_STRING("vendor_name",  SCSIDiskState, vname),         \
+    DEFINE_PROP_STRING("product_name",  SCSIDiskState, pname)
+
 
 static Property scsi_hd_properties[] = {
     DEFINE_SCSI_DISK_PROPERTIES(),