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

Re: [Xen-devel] [PATCH] blktap2: fix save/restore/migration



Great! I'm impressed by your patches!!

Best regards,
 Kan

Thu, 02 Jul 2009 23:35:47 -0700, "Ryan O'Connor" wrote:

># HG changeset patch
># User Ryan O'Connor <rjo@xxxxxxxxx>
># Date 1246602456 25200
># Node ID 2292564d6029d5a3fc6b57d51059e2bd5e0dfbec
># Parent  6b489d139da0dd3bd4a1f673816559acf9b0a9e0
>blktap2: fix save/restore/migration
>
>blktap2 devices use a regular 'phy' vbd blkback backend, causing
>Blktap2Controller to trample the devices' parameters. This causes problems 
>with
>save/restore and managed domains, among other things. This patch modifies
>Blktap2Controller to store both the vbd and tap2 parameters in xenstore, and
>stops it from trampling the device's config on device creation.
>
> * store blktap2 parameters in xenstore
> * restore blktap2 device config to original state once the underlying vbd
>   device is created (this fixes managed domains)
> * use blktap2 parameters rather than vbd parameters when building blktap2
>   device configurations
> * remove blktap2 specific code from XendConfig
>
>Signed-off-by: Ryan O'Connor <rjo@xxxxxxxxx>
>
>diff -r 6b489d139da0 -r 2292564d6029 tools/python/xen/xend/XendConfig.py
>--- a/tools/python/xen/xend/XendConfig.py      Thu Jul 02 23:27:33 2009 -0700
>+++ b/tools/python/xen/xend/XendConfig.py      Thu Jul 02 23:27:36 2009 -0700
>@@ -1120,8 +1120,6 @@ class XendConfig(dict):
>                                     if sxp.child_value(config, 'bootable',
> None) is None:
>                                         is_bootable = dev_cfg.get(
>'bootable', 0)
>                                         config.append(['bootable', int(
>is_bootable)])
>-                                    if dev_cfg.has_key('required_uname'):
>-                                        config.append(['required_uname', 
>dev_cfg['required_uname']])
>                                     config.append(['VDI', dev_cfg.get(
>'VDI', '')])
> 
>                                 sxpr.append(['device', config])
>@@ -1372,13 +1370,6 @@ class XendConfig(dict):
>                     dev_info['driver'] = 'paravirtualised'
> 
>             if dev_type == 'tap' or dev_type == 'tap2':
>-                if dev_info.has_key('required_uname'):
>-                    # Restore uname by required_uname because uname might
>-                    # be replaced with 'phy:/dev/xen/blktap-2/tapdev*'.
>-                    dev_info['uname'] = dev_info['required_uname']
>-                else:
>-                    # Save uname for next domain start.
>-                    dev_info['required_uname'] = dev_info['uname']
>                 tap_disk_type = dev_info['uname'].split(':')[1]
>                 # tapdisk uname may be 'tap:<driver>' or 'tap:tapdisk:<
>driver>'
>                 if tap_disk_type == 'tapdisk':
>diff -r 6b489d139da0 -r 2292564d6029 tools/python/xen/xend/server/
>BlktapController.py
>--- a/tools/python/xen/xend/server/BlktapController.py Thu Jul 02 23:27:33 
>2009 -0700
>+++ b/tools/python/xen/xend/server/BlktapController.py Thu Jul 02 23:27:36 
>2009 -0700
>@@ -137,10 +137,39 @@ class Blktap2Controller(BlktapController
>                                         deviceClass,
>                                         self.vm.getDomid(), devid)
> 
>+    def getDeviceDetails(self, config):
>+
>+        (devid, back, front) = BlktapController.getDeviceDetails(self, 
>config)
>+        if self.deviceClass == 'tap2':
>+        # since blktap2 uses blkback as a backend the 'params' feild 
>contains
>+        # the path to the blktap2 device (/dev/xen/blktap-2/tapdev*). As 
>well,
>+        # we need to store the params used to create the blktap2 device
>+        # (tap:tapdisk:<driver>:/<image-path>)
>+            tapdisk_uname = config.get('tapdisk_uname', '')
>+            (_, tapdisk_params) = string.split(tapdisk_uname, ':', 1)
>+            back['tapdisk-params'] = tapdisk_params 
>+            
>+        return (devid, back, front)
>+
>+    def getDeviceConfiguration(self, devid, transaction = None):
>+
>+        # this is a blktap2 device, so we need to overwrite the 'params' 
>feild
>+        # with the actual blktap2 parameters. (the vbd parameters are of 
>little
>+        # use to us)
>+        config = BlktapController.getDeviceConfiguration(self, devid, 
>transaction)
>+        if transaction is None:
>+            tapdisk_params = self.readBackend(devid, 'tapdisk-params')
>+        else:
>+            tapdisk_params = self.readBackendTxn(transaction, devid, 
>'tapdisk-params')
>+        if tapdisk_params:
>+            config['uname'] = 'tap:' + tapdisk_params
>+
>+        return config
>+
> 
>     def createDevice(self, config):
> 
>-        uname = config.get('required_uname', '')
>+        uname = config.get('uname', '')
>         try:
>             (typ, subtyp, params, file) = string.split(uname, ':', 3)
>         except:
>@@ -180,11 +209,15 @@ class Blktap2Controller(BlktapController
>         stdout.close();
>         stderr.close();
> 
>-        #modify the configuration to attach as a vbd, now that the
>-        #device is configured.  Then continue to create the device
>+        # modify the configutration to create a blkback for the underlying
>+        # blktap2 device. Note: we need to preserve the original tapdisk 
>uname
>+        # (it is used during save/restore and for managed domains).
>+        config.update({'tapdisk_uname' : uname})
>         config.update({'uname' : 'phy:' + device.rstrip()})
> 
>         devid = BlkifController.createDevice(self, config)
>+        config.update({'uname' : uname})
>+        config.pop('tapdisk_uname')
>         return devid
> 
>     # The new blocktap implementation requires a sysfs signal to close
>
>_______________________________________________
>Xen-devel mailing list
>Xen-devel@xxxxxxxxxxxxxxxxxxx
>http://lists.xensource.com/xen-devel


_______________________________________________
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®.