mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
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 <t.horikoshi@jp.fujitsu.com> Signed-off-by: Jun Kamada <kama@jp.fujitsu.com>
This commit is contained in:
1 parent
eabcd59fd9
commit
a3de16cb53
3 files changed
+38
-32
No files matched your search
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||