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

[Xen-devel] [PATCH] xend: fix vbd/tapdisk device destruction



blktap2 devices attach as a regular 'vbd' rather than a 'tap' device.
Accordingly, Xend should use 'vbd' as the device class of blktap2 devices. This
patch determines the appropriate device class by reading the 'type' field of the
backend's xenstore entry.

Signed-off-by: Ryan O'Connor <rjo@xxxxxxxxx>

diff -r 3c7536d6b583 -r 3f100fc620fd tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py   Tue Jun 23 17:27:01 2009 +0100
+++ b/tools/python/xen/xend/XendDomainInfo.py   Tue Jun 23 10:09:20 2009 -0700
@@ -1244,13 +1244,33 @@ class XendDomainInfo:
                     dev_num += 1
             return sxprs
 
-    def getBlockDeviceClass(self, devid):
-        # To get a device number from the devid,
-        # we temporarily use the device controller of VBD.
-        dev = self.getDeviceController('vbd').convertToDeviceNumber(devid)
-        dev_info = self._getDeviceInfo_vbd(dev)
-        if dev_info:
-            return dev_info[0]
+    def getBlockDeviceClass(self, devid, deviceClass=False):
+        backendType = 'vbd'
+
+        # For backwards compatability, we may have to get deviceClass ourselves
+        if not deviceClass:
+            t = xstransact("%s/device" % self.dompath)
+            for devclass in XendDevices.valid_devices():
+                if devid in t.list(devclass):
+                    deviceClass = devclass
+                    break
+            t.abort()
+
+        try:
+            # Note: deviceClass may be incorrect, so we cannot trust 
readBackend
+            # or readFrontend from the Device Controller to succeed
+            backendPath = xstransact.Read("%s/device/%s/%s"
+                                          % (self.dompath, deviceClass, devid),
+                                          "backend")
+            backendType = xstransact.Read(backendPath, "type")
+        except Exception, ex:
+            # we can probably just assume the block device is a VBD
+            log.debug("error reading backend for device (%s): %s", devid, 
str(ex))
+
+        if backendType == 'tap':
+            return 'tap'
+        else:
+            return 'vbd'
 
     def _getDeviceInfo_vif(self, mac):
         for dev_type, dev_info in self.info.all_devices_sxpr():
@@ -2217,7 +2237,7 @@ class XendDomainInfo:
                             # may possibly be "tap". Just in case, verify
                             # device class.
                             devid = dev.split('/')[-1]
-                            true_devclass = self.getBlockDeviceClass(devid)
+                            true_devclass = self.getBlockDeviceClass(devid, 
devclass)
                         log.debug("Removing %s", dev);
                         self.destroyDevice(true_devclass, dev, False);
                     except:

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

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