From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LzCsl-0005vQ-CJ for qemu-devel@nongnu.org; Wed, 29 Apr 2009 12:43:39 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LzCsi-0005tu-1R for qemu-devel@nongnu.org; Wed, 29 Apr 2009 12:43:39 -0400 Received: from [199.232.76.173] (port=36074 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LzCsh-0005tn-Ik for qemu-devel@nongnu.org; Wed, 29 Apr 2009 12:43:35 -0400 Received: from dpc691978010.direcpc.com ([69.19.78.10]:37027 helo=anvil.third-harmonic.com) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1LzCsf-0006js-71 for qemu-devel@nongnu.org; Wed, 29 Apr 2009 12:43:35 -0400 Message-ID: <49F876AA.2070600@third-harmonic.com> Date: Wed, 29 Apr 2009 11:47:54 -0400 From: john cooper MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------020504070601030903000806" Subject: [Qemu-devel] [PATCH 1/2] Add serial number support for virtio_blk 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@redhat.com This is a multi-part message in MIME format. --------------020504070601030903000806 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit -- john.cooper@third-harmonic.com --------------020504070601030903000806 Content-Type: text/x-patch; name="qemu-vblk-serial.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="qemu-vblk-serial.patch" hw/virtio-blk.c | 15 ++++++++++++++- hw/virtio-blk.h | 3 +++ sysemu.h | 4 +++- 3 files changed, 20 insertions(+), 2 deletions(-) ================================================================= --- a/qemu/hw/virtio-blk.h +++ b/qemu/hw/virtio-blk.h @@ -28,6 +28,7 @@ #define VIRTIO_BLK_F_SIZE_MAX 1 /* Indicates maximum segment size */ #define VIRTIO_BLK_F_SEG_MAX 2 /* Indicates maximum # of segments */ #define VIRTIO_BLK_F_GEOMETRY 4 /* Indicates support of legacy geometry */ +#define VIRTIO_BLK_F_SN 7 /* serial number supported */ struct virtio_blk_config { @@ -37,6 +38,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. */ ================================================================= --- a/qemu/hw/virtio-blk.c +++ b/qemu/hw/virtio-blk.c @@ -22,6 +22,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) @@ -238,6 +239,8 @@ static void virtio_blk_reset(VirtIODevic 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); @@ -252,12 +255,17 @@ static void virtio_blk_update_config(Vir 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) { - return (1 << VIRTIO_BLK_F_SEG_MAX | 1 << VIRTIO_BLK_F_GEOMETRY); + VirtIOBlock *s = to_virtio_blk(vdev); + char ser_set = strcmp(s->serial_str, "0"); + + return (1 << VIRTIO_BLK_F_SEG_MAX | 1 << VIRTIO_BLK_F_GEOMETRY | + (ser_set ? 1 << VIRTIO_BLK_F_SN : 0)); } static void virtio_blk_save(QEMUFile *f, void *opaque) @@ -298,6 +306,7 @@ void *virtio_blk_init(PCIBus *bus, Block 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, @@ -314,6 +323,10 @@ void *virtio_blk_init(PCIBus *bus, Block 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->devfn = s->vdev.pci_dev.devfn; bdrv_guess_geometry(s->bs, &cylinders, &heads, &secs); bdrv_set_geometry_hint(s->bs, cylinders, heads, secs); ================================================================= --- a/qemu/sysemu.h +++ b/qemu/sysemu.h @@ -133,13 +133,15 @@ typedef enum { BLOCK_ERR_STOP_ANY } BlockInterfaceErrorAction; +#define BLOCK_SERIAL_STRLEN 20 + typedef struct DriveInfo { BlockDriverState *bdrv; BlockInterfaceType type; int bus; int unit; BlockInterfaceErrorAction onerror; - char serial[21]; + char serial[BLOCK_SERIAL_STRLEN + 1]; int used; int drive_opt_idx; } DriveInfo; --------------020504070601030903000806--