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

[Xen-changelog] [xen-unstable] pvscsi: Some fixes for xm scsi-attach



# 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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.