diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2009-08-07 17:22:04 +0100 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2009-08-07 17:22:04 +0100 |
commit | 22d91502ea6d7abd9039354bccff8f4b744da4e2 (patch) | |
tree | 35ab606fa16cd9871a42f2725e8df5834b082a37 | |
parent | b1b6362f10c95343eec1be30c346593df89adf9f (diff) | |
download | xen-22d91502ea6d7abd9039354bccff8f4b744da4e2.tar.gz xen-22d91502ea6d7abd9039354bccff8f4b744da4e2.tar.bz2 xen-22d91502ea6d7abd9039354bccff8f4b744da4e2.zip |
xend: Rename device backend value when xm save/migrate
The Xend has a problem that it often fails to restore/migrate
a PV domain whose device backends are partly a driver domain.
Because a checkpoint of the PV domain has device backend value as
domain id, you can restore/migrate the PV domain only when a driver
domain is the same id as device backend value in the checkpoint.
I attached a patch to fix it by renaming device backend value in a
checkpoint from domain id to domain name when xm save/migrate.
This patch doesn't rename device backend value if the value is 0,
which is Domain-0, so the checkpoint format is compatible if you use
only Domain-0 as device backend.
Signed-off-by: Rikiya Ayukawa <ayukawa.rikiya@jp.fujitsu.com>
-rw-r--r-- | tools/python/xen/xend/XendCheckpoint.py | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/tools/python/xen/xend/XendCheckpoint.py b/tools/python/xen/xend/XendCheckpoint.py index 3952846d4f..146437c486 100644 --- a/tools/python/xen/xend/XendCheckpoint.py +++ b/tools/python/xen/xend/XendCheckpoint.py @@ -66,6 +66,8 @@ def insert_after(list, pred, value): def save(fd, dominfo, network, live, dst, checkpoint=False, node=-1): + from xen.xend import XendDomain + try: if not os.path.isdir("/var/lib/xen"): os.makedirs("/var/lib/xen") @@ -80,6 +82,18 @@ def save(fd, dominfo, network, live, dst, checkpoint=False, node=-1): if node > -1: insert_after(sxprep,'vcpus',['node', str(node)]) + for device_sxp in sxp.children(sxprep, 'device'): + backend = sxp.child(device_sxp[1], 'backend') + if backend == None: + continue + bkdominfo = XendDomain.instance().domain_lookup_nr(backend[1]) + if bkdominfo == None: + raise XendError("Could not find backend: %s" % backend[1]) + if bkdominfo.getDomid() == XendDomain.DOM0_ID: + # Skip for compatibility of checkpoint data format + continue + backend[1] = bkdominfo.getName() + config = sxp.to_string(sxprep) domain_name = dominfo.getName() |