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
|