qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH for-2.1] scsi: fix scsi disk symbol confusion in gue


From: arei.gonglei
Subject: [Qemu-devel] [PATCH for-2.1] scsi: fix scsi disk symbol confusion in guest os
Date: Thu, 17 Jul 2014 20:55:34 +0800

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=raw, 
\
 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=raw,\
 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=raw,\
 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);
 
-- 
1.7.12.4





reply via email to

[Prev in Thread] Current Thread [Next in Thread]