From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=58488 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OKFnG-0001Vo-7h for qemu-devel@nongnu.org; Thu, 03 Jun 2010 15:09:35 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OKFnE-0002y3-IC for qemu-devel@nongnu.org; Thu, 03 Jun 2010 15:09:30 -0400 Received: from mail-gw0-f45.google.com ([74.125.83.45]:42915) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OKFnE-0002xq-Fk for qemu-devel@nongnu.org; Thu, 03 Jun 2010 15:09:28 -0400 Received: by gwj20 with SMTP id 20so341396gwj.4 for ; Thu, 03 Jun 2010 12:09:27 -0700 (PDT) Message-ID: <4C07FDE3.3020905@codemonkey.ws> Date: Thu, 03 Jun 2010 14:09:23 -0500 From: Anthony Liguori MIME-Version: 1.0 References: <4BAAF573.5000109@redhat.com> In-Reply-To: <4BAAF573.5000109@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] Re: [PATCH 1/4] Add virtio disk identification support List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: john cooper Cc: Rusty Russell , Marc Haber , qemu-devel@nongnu.org On 03/25/2010 12:32 AM, john cooper wrote: > Add virtio-blk device id (s/n) support via virtio request. > Remove artifacts of pci and ATA_IDENTIFY implementation > relative to prior versions. > > Signed-off-by: john cooper > --- > > diff --git a/hw/virtio-blk.c b/hw/virtio-blk.c > index 9915840..358b0af 100644 > --- a/hw/virtio-blk.c > +++ b/hw/virtio-blk.c > @@ -19,6 +19,8 @@ > # include > #endif > > +#define min(a,b) ((a)< (b) ? (a) : (b)) > We already have MIN(). > + > typedef struct VirtIOBlock > { > VirtIODevice vdev; > @@ -28,6 +30,7 @@ typedef struct VirtIOBlock > QEMUBH *bh; > BlockConf *conf; > unsigned short sector_mask; > + char sn[BLOCK_SERIAL_STRLEN]; > } VirtIOBlock; > > static VirtIOBlock *to_virtio_blk(VirtIODevice *vdev) > @@ -317,6 +320,12 @@ static void virtio_blk_handle_request(VirtIOBlockReq *req, > virtio_blk_handle_flush(req); > } else if (req->out->type& VIRTIO_BLK_T_SCSI_CMD) { > virtio_blk_handle_scsi(req); > + } else if (req->out->type& VIRTIO_BLK_T_GET_ID) { > + VirtIOBlock *s = req->dev; > + > + memcpy(req->elem.in_sg[0].iov_base, s->sn, > + min(req->elem.in_sg[0].iov_len, sizeof(s->sn))); > + virtio_blk_req_complete(req, VIRTIO_BLK_S_OK); > } else if (req->out->type& VIRTIO_BLK_T_OUT) { > qemu_iovec_init_external(&req->qiov,&req->elem.out_sg[1], > req->elem.out_num - 1); > @@ -496,6 +505,8 @@ VirtIODevice *virtio_blk_init(DeviceState *dev, BlockConf *conf) > bdrv_guess_geometry(s->bs,&cylinders,&heads,&secs); > bdrv_set_geometry_hint(s->bs, cylinders, heads, secs); > > + strncpy(s->sn, drive_get_serial(s->bs), sizeof (s->sn)); > + > Friends don't let friends use strncpy(). This actually will result in a non-NULL terminated string if drive_get_serial() returns a string larger than s->sn. Use snprintf() instead. Regards, Anthony Liguori > s->vq = virtio_add_queue(&s->vdev, 128, virtio_blk_handle_output); > > qemu_add_vm_change_state_handler(virtio_blk_dma_restart_cb, s); > diff --git a/hw/virtio-blk.h b/hw/virtio-blk.h > index 7a7ece3..fff46da 100644 > --- a/hw/virtio-blk.h > +++ b/hw/virtio-blk.h > @@ -59,6 +59,9 @@ struct virtio_blk_config > /* Flush the volatile write cache */ > #define VIRTIO_BLK_T_FLUSH 4 > > +/* return the device ID string */ > +#define VIRTIO_BLK_T_GET_ID 8 > + > /* Barrier before this op. */ > #define VIRTIO_BLK_T_BARRIER 0x80000000 > >