[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH for-2.1] scsi: fix scsi disk symbol confusion in
From: |
Gonglei (Arei) |
Subject: |
Re: [Qemu-devel] [PATCH for-2.1] scsi: fix scsi disk symbol confusion in guest os |
Date: |
Fri, 18 Jul 2014 01:32:09 +0000 |
Hi,
> -----Original Message-----
> From: Paolo Bonzini [mailto:address@hidden
> Sent: Thursday, July 17, 2014 9:45 PM
> To: Gonglei (Arei); address@hidden
> Cc: Huangweidong (C); Luonengjun
> Subject: Re: [PATCH for-2.1] scsi: fix scsi disk symbol confusion in guest os
>
> Il 17/07/2014 14:55, address@hidden ha scritto:
> > From: Gonglei <address@hidden>
> >
> > Assuming that we hotplug three virtio-scsi disk as follow steps:
> > 1. start vm with virtio-scsi as system disk (guest os: suse11 sp3 ).
> > 2. hotplug disk 1 (as lun2)
> > -drive
> file=/Images/TestImg/kvm-disk-scsi_001,if=none,id=drive-scsi0-0-0-2,format=r
> aw, \
> > cache=none,aio=native -device
> scsi-hd,bus=scsi0.0,channel=0,scsi-id=0,lun=2, \
> > drive=drive-scsi0-0-0-2,id=scsi0-0-0-2
> > 2. hotplug disk 2 (as lun3)
> > -drive
> file=/Images/TestImg/kvm-disk-scsi_002,if=none,id=drive-scsi0-0-0-3,format=r
> aw,\
> > cache=none,aio=native -device
> scsi-hd,bus=scsi0.0,channel=0,scsi-id=0,lun=3,\
> > drive=drive-scsi0-0-0-3,id=scsi0-0-0-3
> > 3. hotplug disk 3 (as lun4)
> > -drive
> file=/Images/TestImg/kvm-disk-scsi_003,if=none,id=drive-scsi0-0-0-4,format=r
> aw,\
> > cache=none,aio=native -device
> scsi-hd,bus=scsi0.0,channel=0,scsi-id=0,lun=4,\
> > drive=drive-scsi0-0-0-4,id=scsi0-0-0-4
> >
> > We can see lun2 as sdb, lun3 as sdc, lun4 as sdd in the guest os.
> > But after rebootint the guest, the scsi disk symbol will changed,
> > lun2 change to sdd, lun3 as sdc, lun4 as sdb.
> >
> > Lun2 -> sdb reboot lun2 -> sdd
> > Lun3 -> sdc ------> lun3 -> sdc
> > Lun4 -> sdd lun4 -> sdb
> >
> > In Linux os, the scsi_scan_host() will scan scsi host adapter's lun,
> > firstly scan
> lun 0
> > and add into system, secondly send REPORT_LUNS command to qurey the
> other luns.
> >
> > In QEMU, the scsi_target_emulate_report_luns() emulate the REPORT_LUNS
> command.
> > The function will scan virtio-scsi-bus's children and report to guest os
> > finally.
> > QTAILQ_FOREACH(kid, &r->req.bus->qbus.children, sibling) {
> >
> > The step of attaching device in QEMU:
> > qdev_device_add
> > qdev_set_parent_bus
> > bus_add_child
> > QTAILQ_INSERT_HEAD(&bus->children, kid, sibling); // insert list
> head
> >
> > The latest hotplugged disk is at the head of bus->children list.
> >
> > Finally those cause the disk symbol confusion in the guest os.
> >
> > Fix the issue by QTAILQ_FOREACH_REVERSE replace QTAILQ_FOREACH in
> > scsi_target_emulate_report_luns(), which follow the FIFO principle for
> > scsi disks hotplugging.
> >
> > Signed-off-by: Gonglei <address@hidden>
> > ---
> > hw/scsi/scsi-bus.c | 3 ++-
> > 1 file changed, 2 insertions(+), 1 deletion(-)
> >
> > diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c
> > index 4341754..b6671ea 100644
> > --- a/hw/scsi/scsi-bus.c
> > +++ b/hw/scsi/scsi-bus.c
> > @@ -371,7 +371,8 @@ static bool
> scsi_target_emulate_report_luns(SCSITargetReq *r)
> > memset(r->buf, 0, len);
> > stl_be_p(&r->buf[0], n);
> > i = found_lun0 ? 8 : 16;
> > - QTAILQ_FOREACH(kid, &r->req.bus->qbus.children, sibling) {
> > + QTAILQ_FOREACH_REVERSE(kid, &r->req.bus->qbus.children,
> > + ChildrenHead, sibling) {
> > DeviceState *qdev = kid->child;
> > SCSIDevice *dev = SCSI_DEVICE(qdev);
> >
> >
>
> This is a change to the guest ABI, so you would have to make it only for
> the latest machine type;
Would you give me more details? Thanks.
> and this unfortunately disqualifies it already
> from 2.1 since it's very late.
>
OK.
> Does this happen for cold-plugged disks too? If so, I wonder if this
> would cause more pain than it fixes, because it could break machines
> when you upgrade QEMU.
No, it doesn't happen for cold-plugged disks.
> In the end, /dev/sd* is not stable and people
> should use /dev/disk/* and/or partition labels instead.
>
Agree.
But for general users, the /dev/sd* usually more commonly used. They
can be used easily through easy mount command "/dev/sd* /mnt/sd* ".
So, this changes make sense for people IMHO.
Best regards,
-Gonglei