pvSCSI: fix xend
authorKeir Fraser <keir.fraser@citrix.com>
Tue, 8 Jul 2008 08:28:50 +0000 (09:28 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Tue, 8 Jul 2008 08:28:50 +0000 (09:28 +0100)
Previous "xend" assumed initial Xenbus state would be "Connected" when
LUN hot-plug starts. However it was not guaranteed in general, and it
may cause some problems.

Signed-off-by: Tomonari Horikoshi <t.horikoshi@jp.fujitsu.com>
Signed-off-by: Jun Kamada <kama@jp.fujitsu.com>
tools/python/xen/xend/XendConfig.py
tools/python/xen/xend/XendDomainInfo.py
tools/python/xen/xend/server/vscsiif.py

index 097c18e701b6e5590526925c58fb5167acd73ded..0df4c04658e1917feb8c0256657921a5da87d4b8 100644 (file)
@@ -1223,22 +1223,23 @@ class XendConfig(dict):
                 pci_dict = self.pci_convert_sxp_to_dict(config)
                 pci_devs = pci_dict['devs']
 
-                # create XenAPI DPCI objects.
-                for pci_dev in pci_devs:
-                    dpci_uuid = pci_dev.get('uuid')
-                    ppci_uuid = XendPPCI.get_by_sbdf(pci_dev['domain'],
-                                                    pci_dev['bus'],
-                                                    pci_dev['slot'],
-                                                    pci_dev['func'])
-                    if ppci_uuid is None:
-                        continue
-                    dpci_record = {
-                        'VM': self['uuid'],
-                        'PPCI': ppci_uuid,
-                        'hotplug_slot': pci_dev.get('vslot', 0)
-                    }
-                    XendDPCI(dpci_uuid, dpci_record)
-                    
+                if dev_type != 'vscsi':
+                    # create XenAPI DPCI objects.
+                    for pci_dev in pci_devs:
+                        dpci_uuid = pci_dev.get('uuid')
+                        ppci_uuid = XendPPCI.get_by_sbdf(pci_dev['domain'],
+                                                        pci_dev['bus'],
+                                                        pci_dev['slot'],
+                                                        pci_dev['func'])
+                        if ppci_uuid is None:
+                            continue
+                        dpci_record = {
+                            'VM': self['uuid'],
+                            'PPCI': ppci_uuid,
+                            'hotplug_slot': pci_dev.get('vslot', 0)
+                        }
+                        XendDPCI(dpci_uuid, dpci_record)
+
                 target['devices'][pci_devs_uuid] = (dev_type,
                                                     {'devs': pci_devs,
                                                      'uuid': pci_devs_uuid})
@@ -1633,21 +1634,22 @@ class XendConfig(dict):
                 for dpci_uuid in XendDPCI.get_by_VM(self['uuid']):
                     XendAPIStore.deregister(dpci_uuid, "DPCI")
 
-                # create XenAPI DPCI objects.
-                for pci_dev in pci_devs:
-                    dpci_uuid = pci_dev.get('uuid')
-                    ppci_uuid = XendPPCI.get_by_sbdf(pci_dev['domain'],
-                                                     pci_dev['bus'],
-                                                     pci_dev['slot'],
-                                                     pci_dev['func'])
-                    if ppci_uuid is None:
-                        continue
-                    dpci_record = {
-                        'VM': self['uuid'],
-                        'PPCI': ppci_uuid,
-                        'hotplug_slot': pci_dev.get('vslot', 0)
-                    }
-                    XendDPCI(dpci_uuid, dpci_record)
+                if dev_type != 'vscsi':
+                    # create XenAPI DPCI objects.
+                    for pci_dev in pci_devs:
+                        dpci_uuid = pci_dev.get('uuid')
+                        ppci_uuid = XendPPCI.get_by_sbdf(pci_dev['domain'],
+                                                         pci_dev['bus'],
+                                                         pci_dev['slot'],
+                                                         pci_dev['func'])
+                        if ppci_uuid is None:
+                            continue
+                        dpci_record = {
+                            'VM': self['uuid'],
+                            'PPCI': ppci_uuid,
+                            'hotplug_slot': pci_dev.get('vslot', 0)
+                        }
+                        XendDPCI(dpci_uuid, dpci_record)
 
                 self['devices'][dev_uuid] = (dev_type,
                                              {'devs': pci_devs,
index 968d8d14118a270e703642bcc877f031ddea78db..a128f302f8341e70bdf9c2f643c71f1af51ba38f 100644 (file)
@@ -758,7 +758,7 @@ class XendDomainInfo:
         if dev_class != 'vscsi':
             return False
 
-        dev_config = self.pci_convert_sxp_to_dict(dev_sxp)
+        dev_config = self.info.pci_convert_sxp_to_dict(dev_sxp)
         dev = dev_config['devs'][0]
         req_devid = sxp.child_value(dev_sxp, 'devid')
         req_devid = int(req_devid)
index af37eae6998db46afb65b3d535d459704ef1b962..85dccee7b47430faaceadf1bb94adaf45c3b2e6e 100644 (file)
@@ -169,6 +169,10 @@ class VSCSIController(DevController):
         devid = int(devid)
         vscsi_config = config['devs'][0]
         states = config.get('states', [])
+        driver_state = self.readBackend(devid, 'state')
+        if str(xenbusState['Connected']) != driver_state:
+            raise VmError("Driver status is not connected")
+
         uuid = self.readBackend(devid, 'uuid')
         if states[0] == 'Initialising':
             back['uuid'] = uuid