diff mbox

[V3] virtio-blk: add default serial id

Message ID 20120926081805.GA6799@dhcp-16-143.nay.redhat.com
State New
Headers show

Commit Message

Dave Young Sept. 26, 2012, 8:18 a.m. UTC
For virtio block device, if user does not specify the serial attribute,
There will be no serial availabe, this is not convenient for identifying
the disk.

Doing something similar to ide disks, add a "VD0000?" default serial
number if user does not specify it.

Signed-off-by: Dave Young <dyoung@redhat.com>
---
 hw/virtio-blk.c |    9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

Comments

Dave Young Sept. 26, 2012, 8:54 a.m. UTC | #1
Hi, Eric

This is in fact same with v1 except the spelling fixes.

I switched back to v1 because of your concern about the same id reusing
issue. For v1, unplugging 100000 times is not likely and insane, so I
think we can safely ignore it.

Unless qemu-img create some uuid for disk imgs I think there's no way
to create some really ideal *uniq* ids.

On 09/26/2012 04:18 PM, Dave Young wrote:

> For virtio block device, if user does not specify the serial attribute,
> There will be no serial availabe, this is not convenient for identifying
> the disk.
> 
> Doing something similar to ide disks, add a "VD0000?" default serial
> number if user does not specify it.
> 
> Signed-off-by: Dave Young <dyoung@redhat.com>
> ---
>  hw/virtio-blk.c |    9 ++++++++-
>  1 file changed, 8 insertions(+), 1 deletion(-)
> 
> --- qemu-kvm.orig/hw/virtio-blk.c	2012-09-02 09:45:03.115696878 +0800
> +++ qemu-kvm/hw/virtio-blk.c	2012-09-20 20:57:56.177206991 +0800
> @@ -22,6 +22,7 @@
>  # include <scsi/sg.h>
>  #endif
>  
> +#define DEFAULT_VIRTIO_BLK_SERIAL_LEN 8
>  typedef struct VirtIOBlock
>  {
>      VirtIODevice vdev;
> @@ -33,6 +34,7 @@ typedef struct VirtIOBlock
>      VirtIOBlkConf *blk;
>      unsigned short sector_mask;
>      DeviceState *qdev;
> +    int drive_serial;
>  } VirtIOBlock;
>  
>  static VirtIOBlock *to_virtio_blk(VirtIODevice *vdev)
> @@ -364,6 +366,7 @@ static void virtio_blk_handle_request(Vi
>      MultiReqBuffer *mrb)
>  {
>      uint32_t type;
> +    char serial[DEFAULT_VIRTIO_BLK_SERIAL_LEN];
>  
>      if (req->elem.out_num < 1 || req->elem.in_num < 1) {
>          error_report("virtio-blk missing headers");
> @@ -388,12 +391,14 @@ static void virtio_blk_handle_request(Vi
>      } else if (type & VIRTIO_BLK_T_GET_ID) {
>          VirtIOBlock *s = req->dev;
>  
> +        snprintf(serial, DEFAULT_VIRTIO_BLK_SERIAL_LEN,
> +                 "VD%05d", s->drive_serial);
>          /*
>           * NB: per existing s/n string convention the string is
>           * terminated by '\0' only when shorter than buffer.
>           */
>          strncpy(req->elem.in_sg[0].iov_base,
> -                s->blk->serial ? s->blk->serial : "",
> +                s->blk->serial ? s->blk->serial : serial,
>                  MIN(req->elem.in_sg[0].iov_len, VIRTIO_BLK_ID_BYTES));
>          virtio_blk_req_complete(req, VIRTIO_BLK_S_OK);
>          g_free(req);
> @@ -611,6 +616,7 @@ static const BlockDevOps virtio_block_op
>  
>  VirtIODevice *virtio_blk_init(DeviceState *dev, VirtIOBlkConf *blk)
>  {
> +    static int drive_serial = 1;
>      VirtIOBlock *s;
>      static int virtio_blk_id;
>  
> @@ -632,6 +638,7 @@ VirtIODevice *virtio_blk_init(DeviceStat
>                                            sizeof(struct virtio_blk_config),
>                                            sizeof(VirtIOBlock));
>  
> +    s->drive_serial = drive_serial++;
>      s->vdev.get_config = virtio_blk_update_config;
>      s->vdev.set_config = virtio_blk_set_config;
>      s->vdev.get_features = virtio_blk_get_features;
> 
>
diff mbox

Patch

--- qemu-kvm.orig/hw/virtio-blk.c	2012-09-02 09:45:03.115696878 +0800
+++ qemu-kvm/hw/virtio-blk.c	2012-09-20 20:57:56.177206991 +0800
@@ -22,6 +22,7 @@ 
 # include <scsi/sg.h>
 #endif
 
+#define DEFAULT_VIRTIO_BLK_SERIAL_LEN 8
 typedef struct VirtIOBlock
 {
     VirtIODevice vdev;
@@ -33,6 +34,7 @@  typedef struct VirtIOBlock
     VirtIOBlkConf *blk;
     unsigned short sector_mask;
     DeviceState *qdev;
+    int drive_serial;
 } VirtIOBlock;
 
 static VirtIOBlock *to_virtio_blk(VirtIODevice *vdev)
@@ -364,6 +366,7 @@  static void virtio_blk_handle_request(Vi
     MultiReqBuffer *mrb)
 {
     uint32_t type;
+    char serial[DEFAULT_VIRTIO_BLK_SERIAL_LEN];
 
     if (req->elem.out_num < 1 || req->elem.in_num < 1) {
         error_report("virtio-blk missing headers");
@@ -388,12 +391,14 @@  static void virtio_blk_handle_request(Vi
     } else if (type & VIRTIO_BLK_T_GET_ID) {
         VirtIOBlock *s = req->dev;
 
+        snprintf(serial, DEFAULT_VIRTIO_BLK_SERIAL_LEN,
+                 "VD%05d", s->drive_serial);
         /*
          * NB: per existing s/n string convention the string is
          * terminated by '\0' only when shorter than buffer.
          */
         strncpy(req->elem.in_sg[0].iov_base,
-                s->blk->serial ? s->blk->serial : "",
+                s->blk->serial ? s->blk->serial : serial,
                 MIN(req->elem.in_sg[0].iov_len, VIRTIO_BLK_ID_BYTES));
         virtio_blk_req_complete(req, VIRTIO_BLK_S_OK);
         g_free(req);
@@ -611,6 +616,7 @@  static const BlockDevOps virtio_block_op
 
 VirtIODevice *virtio_blk_init(DeviceState *dev, VirtIOBlkConf *blk)
 {
+    static int drive_serial = 1;
     VirtIOBlock *s;
     static int virtio_blk_id;
 
@@ -632,6 +638,7 @@  VirtIODevice *virtio_blk_init(DeviceStat
                                           sizeof(struct virtio_blk_config),
                                           sizeof(VirtIOBlock));
 
+    s->drive_serial = drive_serial++;
     s->vdev.get_config = virtio_blk_update_config;
     s->vdev.set_config = virtio_blk_set_config;
     s->vdev.get_features = virtio_blk_get_features;