Patchwork virtio-blk: Set default serial id

login
register
mail settings
Submitter Asias He
Date March 20, 2013, 5:56 a.m.
Message ID <1363758968-28549-1-git-send-email-asias@redhat.com>
Download mbox | patch
Permalink /patch/229253/
State New
Headers show

Comments

Asias He - March 20, 2013, 5:56 a.m.
If user does not specify a serial id, e.g.

   -device virtio-blk-pci,serial="serial_id"
or
   -drive serial="serial_id"

no serial id will be assigned.

Add a default serial id in this case to help identifying
the disk in guest.

Signed-off-by: Asias He <asias@redhat.com>
---
 hw/virtio-blk.c | 7 +++++++
 1 file changed, 7 insertions(+)
Stefan Hajnoczi - March 20, 2013, 7:52 a.m.
On Wed, Mar 20, 2013 at 01:56:08PM +0800, Asias He wrote:
> If user does not specify a serial id, e.g.
> 
>    -device virtio-blk-pci,serial="serial_id"
> or
>    -drive serial="serial_id"
> 
> no serial id will be assigned.
> 
> Add a default serial id in this case to help identifying
> the disk in guest.
> 
> Signed-off-by: Asias He <asias@redhat.com>
> ---
>  hw/virtio-blk.c | 7 +++++++
>  1 file changed, 7 insertions(+)

Autogenerated IDs have been proposed (for other devices?) before and I
think we should avoid them.

The serial in this patch depends on the internal counter we use for
savevm.  It is not a well-defined value that guests can depend on
remaining the same.

It can change between QEMU invocations - due to internal changes in QEMU
or because the management tool reordered -device options.

Users will be confused and their guests may stop working if they depend
on an ID like this.

The solution is to do persistent naming either by really passing -device
virtio-blk-pci,serial= or with udev inside the guest using the bus
address (PCI devfn) like the new persistent network interface naming for
Linux.

Stefan
Asias He - March 20, 2013, 8:34 a.m.
On Wed, Mar 20, 2013 at 08:52:57AM +0100, Stefan Hajnoczi wrote:
> On Wed, Mar 20, 2013 at 01:56:08PM +0800, Asias He wrote:
> > If user does not specify a serial id, e.g.
> > 
> >    -device virtio-blk-pci,serial="serial_id"
> > or
> >    -drive serial="serial_id"
> > 
> > no serial id will be assigned.
> > 
> > Add a default serial id in this case to help identifying
> > the disk in guest.
> > 
> > Signed-off-by: Asias He <asias@redhat.com>
> > ---
> >  hw/virtio-blk.c | 7 +++++++
> >  1 file changed, 7 insertions(+)
> 
> Autogenerated IDs have been proposed (for other devices?) before and I
> think we should avoid them.
> 
> The serial in this patch depends on the internal counter we use for
> savevm.  It is not a well-defined value that guests can depend on
> remaining the same.
> 
> It can change between QEMU invocations - due to internal changes in QEMU
> or because the management tool reordered -device options.
> 
> Users will be confused and their guests may stop working if they depend
> on an ID like this.

So, no serial id forces user not to depend on the serial id. This is how it
works now.

Okay, let's leave it as it is, persistent id specified by user or no id
at all. This is not perfect but at least it does not break any thing.

> The solution is to do persistent naming either by really passing -device
> virtio-blk-pci,serial= or with udev inside the guest using the bus
> address (PCI devfn) like the new persistent network interface naming for
> Linux.

'-virtio-blk-pci,serial=' specified by user would be persistent, but pci
id might be changed as well.

> Stefan
Paolo Bonzini - March 21, 2013, 9:31 a.m.
Il 20/03/2013 09:34, Asias He ha scritto:
>> The solution is to do persistent naming either by really passing -device
>> virtio-blk-pci,serial= or with udev inside the guest using the bus
>> address (PCI devfn) like the new persistent network interface naming for
>> Linux.
> 
> '-virtio-blk-pci,serial=' specified by user would be persistent, but pci
> id might be changed as well.

Yes, but '-device virtio-blk-pci,addr=10.0' would be persistent too. :)
 Also, management may try to keep addresses persistent (libvirt does).

Paolo

Patch

diff --git a/hw/virtio-blk.c b/hw/virtio-blk.c
index f2143fd..c016817 100644
--- a/hw/virtio-blk.c
+++ b/hw/virtio-blk.c
@@ -642,6 +642,13 @@  static int virtio_blk_device_init(VirtIODevice *vdev)
     }
 
     blkconf_serial(&blk->conf, &blk->serial);
+
+    if (!blk->serial) {
+        char serial[VIRTIO_BLK_ID_BYTES];
+        snprintf(serial, VIRTIO_BLK_ID_BYTES, "ID%05d", virtio_blk_id);
+        blk->serial = g_strdup(serial);
+    }
+
     if (blkconf_geometry(&blk->conf, NULL, 65535, 255, 255) < 0) {
         return -1;
     }