From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1M4I3P-0007Qb-5n for qemu-devel@nongnu.org; Wed, 13 May 2009 13:15:39 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1M4I3J-0007Pd-JL for qemu-devel@nongnu.org; Wed, 13 May 2009 13:15:37 -0400 Received: from [199.232.76.173] (port=37175 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1M4I3J-0007Pa-5E for qemu-devel@nongnu.org; Wed, 13 May 2009 13:15:33 -0400 Received: from mx2.redhat.com ([66.187.237.31]:59557) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1M4I3I-00026C-K3 for qemu-devel@nongnu.org; Wed, 13 May 2009 13:15:33 -0400 Message-ID: <4A0AFE42.903@redhat.com> Date: Wed, 13 May 2009 13:07:14 -0400 From: john cooper MIME-Version: 1.0 References: <49F876AA.2070600@third-harmonic.com> In-Reply-To: <49F876AA.2070600@third-harmonic.com> Content-Type: multipart/mixed; boundary="------------050409090403090508010604" Subject: [Qemu-devel] [PATCH 1/2] Add serial number support for virtio_blk, V2 List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: kvm@vger.kernel.org, qemu-devel@nongnu.org Cc: john cooper This is a multi-part message in MIME format. --------------050409090403090508010604 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit -- john.cooper@redhat.com --------------050409090403090508010604 Content-Type: text/x-patch; name="qemu-vblk-serial-2.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="qemu-vblk-serial-2.patch" diff --git a/hw/virtio-blk.c b/hw/virtio-blk.c index dad4ef0..90825a8 100644 --- a/hw/virtio-blk.c +++ b/hw/virtio-blk.c @@ -25,6 +25,7 @@ typedef struct VirtIOBlock BlockDriverState *bs; VirtQueue *vq; void *rq; + char serial_str[BLOCK_SERIAL_STRLEN + 1]; } VirtIOBlock; static VirtIOBlock *to_virtio_blk(VirtIODevice *vdev) @@ -285,6 +286,8 @@ static void virtio_blk_reset(VirtIODevice *vdev) qemu_aio_flush(); } +/* coalesce internal state, copy to pci i/o region 0 + */ static void virtio_blk_update_config(VirtIODevice *vdev, uint8_t *config) { VirtIOBlock *s = to_virtio_blk(vdev); @@ -299,11 +302,13 @@ static void virtio_blk_update_config(VirtIODevice *vdev, uint8_t *config) stw_raw(&blkcfg.cylinders, cylinders); blkcfg.heads = heads; blkcfg.sectors = secs; + memcpy(&blkcfg.serial, s->serial_str, sizeof (blkcfg.serial)); memcpy(config, &blkcfg, sizeof(blkcfg)); } static uint32_t virtio_blk_get_features(VirtIODevice *vdev) { + VirtIOBlock *s = to_virtio_blk(vdev); uint32_t features = 0; features |= (1 << VIRTIO_BLK_F_SEG_MAX); @@ -311,6 +316,8 @@ static uint32_t virtio_blk_get_features(VirtIODevice *vdev) #ifdef __linux__ features |= (1 << VIRTIO_BLK_F_SCSI); #endif + if (strcmp(s->serial_str, "0")) + features |= 1 << VIRTIO_BLK_F_SN; return features; } @@ -353,6 +360,7 @@ void *virtio_blk_init(PCIBus *bus, BlockDriverState *bs) VirtIOBlock *s; int cylinders, heads, secs; static int virtio_blk_id; + char *ps = drive_get_serial(bs); s = (VirtIOBlock *)virtio_init_pci(bus, "virtio-blk", PCI_VENDOR_ID_REDHAT_QUMRANET, @@ -369,6 +377,10 @@ void *virtio_blk_init(PCIBus *bus, BlockDriverState *bs) s->vdev.reset = virtio_blk_reset; s->bs = bs; s->rq = NULL; + if (strlen(ps)) + strncpy(s->serial_str, ps, sizeof (s->serial_str)); + else + snprintf(s->serial_str, sizeof (s->serial_str), "0"); bs->private = &s->vdev.pci_dev; bdrv_guess_geometry(s->bs, &cylinders, &heads, &secs); bdrv_set_geometry_hint(s->bs, cylinders, heads, secs); diff --git a/hw/virtio-blk.h b/hw/virtio-blk.h index 5ef6c36..3229394 100644 --- a/hw/virtio-blk.h +++ b/hw/virtio-blk.h @@ -31,6 +31,7 @@ #define VIRTIO_BLK_F_RO 5 /* Disk is read-only */ #define VIRTIO_BLK_F_BLK_SIZE 6 /* Block size of disk is available*/ #define VIRTIO_BLK_F_SCSI 7 /* Supports scsi command passthru */ +#define VIRTIO_BLK_F_SN 8 /* serial number supported */ struct virtio_blk_config { @@ -40,6 +41,8 @@ struct virtio_blk_config uint16_t cylinders; uint8_t heads; uint8_t sectors; + uint32_t _blk_size; /* structure pad, currently unused */ + uint8_t serial[BLOCK_SERIAL_STRLEN]; } __attribute__((packed)); /* These two define direction. */ diff --git a/sysemu.h b/sysemu.h index 1f45fd6..185b4e3 100644 --- a/sysemu.h +++ b/sysemu.h @@ -141,6 +141,8 @@ typedef enum { BLOCK_ERR_STOP_ANY } BlockInterfaceErrorAction; +#define BLOCK_SERIAL_STRLEN 20 + typedef struct DriveInfo { BlockDriverState *bdrv; BlockInterfaceType type; @@ -149,7 +151,7 @@ typedef struct DriveInfo { int used; int drive_opt_idx; BlockInterfaceErrorAction onerror; - char serial[21]; + char serial[BLOCK_SERIAL_STRLEN + 1]; } DriveInfo; #define MAX_IDE_DEVS 2 --------------050409090403090508010604--