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

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



My apologies to all,

This patch depends on my previous patch (seperate blktap1/blktap2 disk
types). I should have sent them out together.

Thanks,
Ryan

On Thu, Jul 02, 2009 at 11:35:47PM -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

-- 
 Ryan O'Connor <rjo@xxxxxxxxx>

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