From a3de16cb5370a9634b3d7e8b95ad4ff6d170aa75 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Tue, 8 Jul 2008 09:28:50 +0100 Subject: [PATCH] pvSCSI: fix xend 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 Signed-off-by: Jun Kamada --- tools/python/xen/xend/XendConfig.py | 64 +++++++++++++------------ tools/python/xen/xend/XendDomainInfo.py | 2 +- tools/python/xen/xend/server/vscsiif.py | 4 ++ 3 files changed, 38 insertions(+), 32 deletions(-) diff --git a/tools/python/xen/xend/XendConfig.py b/tools/python/xen/xend/XendConfig.py index 097c18e701..0df4c04658 100644 --- a/tools/python/xen/xend/XendConfig.py +++ b/tools/python/xen/xend/XendConfig.py @@ -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, diff --git a/tools/python/xen/xend/XendDomainInfo.py b/tools/python/xen/xend/XendDomainInfo.py index 968d8d1411..a128f302f8 100644 --- a/tools/python/xen/xend/XendDomainInfo.py +++ b/tools/python/xen/xend/XendDomainInfo.py @@ -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) diff --git a/tools/python/xen/xend/server/vscsiif.py b/tools/python/xen/xend/server/vscsiif.py index af37eae699..85dccee7b4 100644 --- a/tools/python/xen/xend/server/vscsiif.py +++ b/tools/python/xen/xend/server/vscsiif.py @@ -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 -- 2.30.2