scsi: Turn drive serial into a qdev property scsi-disk.serial

It needs to be a qdev property, because it belongs to the drive's
guest part.

Bonus: info qtree now shows the serial number.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
Markus Armbruster 2010-06-01 20:32:34 +02:00 committed by Kevin Wolf
parent 0343240725
commit a0fef654f6
1 changed files with 13 additions and 4 deletions

View File

@ -66,6 +66,7 @@ struct SCSIDiskState
uint64_t max_lba; uint64_t max_lba;
QEMUBH *bh; QEMUBH *bh;
char *version; char *version;
char *serial;
}; };
static SCSIDiskReq *scsi_new_request(SCSIDevice *d, uint32_t tag, uint32_t lun) static SCSIDiskReq *scsi_new_request(SCSIDevice *d, uint32_t tag, uint32_t lun)
@ -359,9 +360,7 @@ static int scsi_disk_emulate_inquiry(SCSIRequest *req, uint8_t *outbuf)
case 0x80: /* Device serial number, optional */ case 0x80: /* Device serial number, optional */
{ {
const char *serial = req->dev->conf.dinfo->serial ? int l = strlen(s->serial);
req->dev->conf.dinfo->serial : "0";
int l = strlen(serial);
if (l > req->cmd.xfer) if (l > req->cmd.xfer)
l = req->cmd.xfer; l = req->cmd.xfer;
@ -371,7 +370,7 @@ static int scsi_disk_emulate_inquiry(SCSIRequest *req, uint8_t *outbuf)
DPRINTF("Inquiry EVPD[Serial number] " DPRINTF("Inquiry EVPD[Serial number] "
"buffer size %zd\n", req->cmd.xfer); "buffer size %zd\n", req->cmd.xfer);
outbuf[buflen++] = l; outbuf[buflen++] = l;
memcpy(outbuf+buflen, serial, l); memcpy(outbuf+buflen, s->serial, l);
buflen += l; buflen += l;
break; break;
} }
@ -1058,6 +1057,15 @@ static int scsi_disk_initfn(SCSIDevice *dev)
} }
s->bs = s->qdev.conf.dinfo->bdrv; s->bs = s->qdev.conf.dinfo->bdrv;
if (!s->serial) {
if (*dev->conf.dinfo->serial) {
/* try to fall back to value set with legacy -drive serial=... */
s->serial = qemu_strdup(dev->conf.dinfo->serial);
} else {
s->serial = qemu_strdup("0");
}
}
if (bdrv_is_sg(s->bs)) { if (bdrv_is_sg(s->bs)) {
error_report("scsi-disk: unwanted /dev/sg*"); error_report("scsi-disk: unwanted /dev/sg*");
return -1; return -1;
@ -1090,6 +1098,7 @@ static SCSIDeviceInfo scsi_disk_info = {
.qdev.props = (Property[]) { .qdev.props = (Property[]) {
DEFINE_BLOCK_PROPERTIES(SCSIDiskState, qdev.conf), DEFINE_BLOCK_PROPERTIES(SCSIDiskState, qdev.conf),
DEFINE_PROP_STRING("ver", SCSIDiskState, version), DEFINE_PROP_STRING("ver", SCSIDiskState, version),
DEFINE_PROP_STRING("serial", SCSIDiskState, serial),
DEFINE_PROP_END_OF_LIST(), DEFINE_PROP_END_OF_LIST(),
}, },
}; };