diff options
author | aliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162> | 2009-01-07 17:32:33 +0000 |
---|---|---|
committer | aliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162> | 2009-01-07 17:32:33 +0000 |
commit | fa879c641435bec4b79872ad14b9a90c8b7172f3 (patch) | |
tree | d8ade34df31c450b8d597a396f29269a749deb45 /hw/scsi-disk.c | |
parent | ff4b91c2f7e51dab148aba4bf43c2f39f219e495 (diff) |
add "serial" parameter to -drive flag (Gleb Natapov)
Windows calculates HW "uniqueness" based on a hard drive serial number
among other things. The patch allows to specify drive serial number
from a command line.
Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6214 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'hw/scsi-disk.c')
-rw-r--r-- | hw/scsi-disk.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c index 9a0841156b..4c4b921d91 100644 --- a/hw/scsi-disk.c +++ b/hw/scsi-disk.c @@ -13,6 +13,8 @@ * the host adapter emulator. */ +#include <qemu-common.h> +#include <sysemu.h> //#define DEBUG_SCSI #ifdef DEBUG_SCSI @@ -68,6 +70,7 @@ struct SCSIDeviceState or from the AIO completion routines. */ scsi_completionfn completion; void *opaque; + char drive_serial_str[21]; }; /* Global pool of SCSIRequest structures. */ @@ -408,6 +411,8 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag, break; case 0x80: { + int l; + /* Device serial number, optional */ if (len < 4) { BADF("Error: EVPD[Serial number] Inquiry buffer " @@ -416,6 +421,7 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag, } DPRINTF("Inquiry EVPD[Serial number] buffer size %d\n", len); + l = MIN(len, strlen(s->drive_serial_str)); r->buf_len = 0; @@ -428,9 +434,9 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag, outbuf[r->buf_len++] = 0x80; // this page outbuf[r->buf_len++] = 0x00; - outbuf[r->buf_len++] = 0x01; // 1 byte data follow - - outbuf[r->buf_len++] = '0'; // 1 byte data follow + outbuf[r->buf_len++] = l; + memcpy(&outbuf[r->buf_len], s->drive_serial_str, l); + r->buf_len += l; } break; @@ -812,7 +818,10 @@ SCSIDevice *scsi_disk_init(BlockDriverState *bdrv, int tcq, } else { s->cluster_size = 1; } - + strncpy(s->drive_serial_str, drive_get_serial(s->bdrv), + sizeof(s->drive_serial_str)); + if (strlen(s->drive_serial_str) == 0) + strcpy(s->drive_serial_str, "0"); d = (SCSIDevice *)qemu_mallocz(sizeof(SCSIDevice)); d->state = s; d->destroy = scsi_destroy; |