# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1236592190 0
# Node ID 5997e86988f6800eed360d6858a419eede556d6b
# Parent 12c19447f6eae9b05102ad5f34428c447fa5a9e4
pvscsi: Some fixes for xm scsi-attach
Signed-off-by: Masaki Kanno <kanno.masaki@xxxxxxxxxxxxxx>
---
tools/python/xen/xend/XendDomainInfo.py | 85 ++++++++++++++++++++++----------
1 files changed, 60 insertions(+), 25 deletions(-)
diff -r 12c19447f6ea -r 5997e86988f6 tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py Mon Mar 09 09:48:45 2009 +0000
+++ b/tools/python/xen/xend/XendDomainInfo.py Mon Mar 09 09:49:50 2009 +0000
@@ -855,27 +855,73 @@ class XendDomainInfo:
"""Configure an existing vscsi device.
quoted pci funciton
"""
+ def _is_vscsi_defined(dev_info, p_devs = None, v_devs = None):
+ if not dev_info:
+ return False
+ for dev in sxp.children(dev_info, 'dev'):
+ if p_devs is not None:
+ if sxp.child_value(dev, 'p-dev') in p_devs:
+ return True
+ if v_devs is not None:
+ if sxp.child_value(dev, 'v-dev') in v_devs:
+ return True
+ return False
+
+ def _vscsi_be(be):
+ be_xdi = xen.xend.XendDomain.instance().domain_lookup_nr(be)
+ if be_xdi is not None:
+ be_domid = be_xdi.getDomid()
+ if be_domid is not None:
+ return str(be_domid)
+ return str(be)
+
dev_class = sxp.name(dev_sxp)
if dev_class != 'vscsi':
return False
dev_config = self.info.vscsi_convert_sxp_to_dict(dev_sxp)
- dev = dev_config['devs'][0]
- req_devid = int(dev['devid'])
- existing_dev_info = self._getDeviceInfo_vscsi(req_devid, dev['v-dev'])
- state = dev['state']
+ devs = dev_config['devs']
+ v_devs = [d['v-dev'] for d in devs]
+ state = devs[0]['state']
+ req_devid = int(devs[0]['devid'])
+ cur_dev_sxp = self._getDeviceInfo_vscsi(req_devid)
if state == xenbusState['Initialising']:
# new create
# If request devid does not exist, create and exit.
- if existing_dev_info is None:
+ p_devs = [d['p-dev'] for d in devs]
+ for dev_type, dev_info in self.info.all_devices_sxpr():
+ if dev_type != 'vscsi':
+ continue
+ if _is_vscsi_defined(dev_info, p_devs = p_devs):
+ raise XendError('The physical device "%s" is already
defined' % \
+ p_devs[0])
+ if cur_dev_sxp is None:
self.device_create(dev_sxp)
return True
- elif existing_dev_info == "exists":
- raise XendError("The virtual device %s is already defined" %
dev['v-dev'])
+
+ if _is_vscsi_defined(cur_dev_sxp, v_devs = v_devs):
+ raise XendError('The virtual device "%s" is already defined' %
\
+ v_devs[0])
+
+ if int(dev_config['feature-host']) != \
+ int(sxp.child_value(cur_dev_sxp, 'feature-host')):
+ raise XendError('The physical device "%s" cannot define '
+ 'because mode is different' % devs[0]['p-dev'])
+
+ new_be = dev_config.get('backend', None)
+ if new_be is not None:
+ cur_be = sxp.child_value(cur_dev_sxp, 'backend', None)
+ if cur_be is None:
+ cur_be = xen.xend.XendDomain.DOM0_ID
+ new_be_dom = _vscsi_be(new_be)
+ cur_be_dom = _vscsi_be(cur_be)
+ if new_be_dom != cur_be_dom:
+ raise XendError('The physical device "%s" cannot define '
+ 'because backend is different' %
devs[0]['p-dev'])
elif state == xenbusState['Closing']:
- if existing_dev_info is None:
+ if not _is_vscsi_defined(cur_dev_sxp, v_devs = v_devs):
raise XendError("Cannot detach vscsi device does not exist")
if self.domid is not None:
@@ -896,7 +942,6 @@ class XendDomainInfo:
del self.info['devices'][dev_uuid]
else:
- cur_dev_sxp = self._getDeviceInfo_vscsi(req_devid, None)
new_dev_sxp = ['vscsi']
cur_mode = sxp.children(cur_dev_sxp, 'feature-host')[0]
new_dev_sxp.append(cur_mode)
@@ -910,8 +955,7 @@ class XendDomainInfo:
if state == xenbusState['Closing']:
if int(cur_mode[1]) == 1:
continue
- cur_dev_vdev = sxp.child_value(cur_dev, 'v-dev')
- if cur_dev_vdev == dev['v-dev']:
+ if sxp.child_value(cur_dev, 'v-dev') in v_devs:
continue
new_dev_sxp.append(cur_dev)
@@ -1172,23 +1216,14 @@ class XendDomainInfo:
return dev_info
return None
- def _getDeviceInfo_vscsi(self, devid, vdev):
+ def _getDeviceInfo_vscsi(self, devid):
devid = int(devid)
for dev_type, dev_info in self.info.all_devices_sxpr():
if dev_type != 'vscsi':
continue
- existing_dev_uuid = sxp.child_value(dev_info, 'uuid')
- existing_conf = self.info['devices'][existing_dev_uuid][1]
- existing_dev = existing_conf['devs'][0]
- existing_devid = int(existing_dev['devid'])
- existing_vdev = existing_dev['v-dev']
-
- if vdev == existing_vdev:
- return "exists"
-
- if devid == existing_devid:
+ devs = sxp.children(dev_info, 'dev')
+ if devid == int(sxp.child_value(devs[0], 'devid')):
return dev_info
-
return None
def setMemoryTarget(self, target):
@@ -3639,7 +3674,7 @@ class XendDomainInfo:
if self._stateGet() != XEN_API_VM_POWER_STATE_RUNNING:
- cur_vscsi_sxp = self._getDeviceInfo_vscsi(devid, None)
+ cur_vscsi_sxp = self._getDeviceInfo_vscsi(devid)
if cur_vscsi_sxp is None:
dev_uuid = self.info.device_add('vscsi', cfg_sxp =
target_vscsi_sxp)
@@ -3737,7 +3772,7 @@ class XendDomainInfo:
dscsi = XendAPIStore.get(dev_uuid, 'DSCSI')
devid = dscsi.get_virtual_host()
vHCTL = dscsi.get_virtual_HCTL()
- cur_vscsi_sxp = self._getDeviceInfo_vscsi(devid, None)
+ cur_vscsi_sxp = self._getDeviceInfo_vscsi(devid)
dev_uuid = sxp.child_value(cur_vscsi_sxp, 'uuid')
target_dev = None
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|