--- 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;
