Message ID | 1331802150-12183-3-git-send-email-dmitry.fleytman@ravellosystems.com |
---|---|
State | New |
Headers | show |
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
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 --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(),