aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2008-12-09 12:45:45 +0000
committerKeir Fraser <keir.fraser@citrix.com>2008-12-09 12:45:45 +0000
commitb90edb337d11a3e599e170b0835fa31d457aafce (patch)
treeb4b995497c6c7f65253540f832d903a68c367c3b /tools
parentce4d300de0f5dd0ff1762e26bed8c008cf784a49 (diff)
downloadxen-b90edb337d11a3e599e170b0835fa31d457aafce.tar.gz
xen-b90edb337d11a3e599e170b0835fa31d457aafce.tar.bz2
xen-b90edb337d11a3e599e170b0835fa31d457aafce.zip
xend: Remember bootable flag for vbds in xenstore
When xend is restarted, bootable flags of all disk devices are lost and then the first disk is marked as bootable by a "compatibility hack". When a guest domain is created with a mixture of several vbd and tap devices, the compatibility hack may fail to choose the right bootable device. Thus preventing the guest to be restarted. This patch fixes this behavior by remembering bootable flag for each disk device in xenstore database. Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
Diffstat (limited to 'tools')
-rw-r--r--tools/python/xen/xend/XendConfig.py8
-rw-r--r--tools/python/xen/xend/server/blkif.py13
2 files changed, 14 insertions, 7 deletions
diff --git a/tools/python/xen/xend/XendConfig.py b/tools/python/xen/xend/XendConfig.py
index 3e1953fbb7..adef04dd06 100644
--- a/tools/python/xen/xend/XendConfig.py
+++ b/tools/python/xen/xend/XendConfig.py
@@ -1289,7 +1289,6 @@ class XendConfig(dict):
pass
if dev_type == 'vbd':
- dev_info['bootable'] = 0
if dev_info.get('dev', '').startswith('ioemu:'):
dev_info['driver'] = 'ioemu'
else:
@@ -1325,7 +1324,7 @@ class XendConfig(dict):
if param not in target:
target[param] = []
if dev_uuid not in target[param]:
- if dev_type == 'vbd':
+ if dev_type == 'vbd' and 'bootable' not in dev_info:
# Compat hack -- mark first disk bootable
dev_info['bootable'] = int(not target[param])
target[param].append(dev_uuid)
@@ -1333,8 +1332,9 @@ class XendConfig(dict):
if 'vbd_refs' not in target:
target['vbd_refs'] = []
if dev_uuid not in target['vbd_refs']:
- # Compat hack -- mark first disk bootable
- dev_info['bootable'] = int(not target['vbd_refs'])
+ if 'bootable' not in dev_info:
+ # Compat hack -- mark first disk bootable
+ dev_info['bootable'] = int(not target['vbd_refs'])
target['vbd_refs'].append(dev_uuid)
elif dev_type == 'vfb':
diff --git a/tools/python/xen/xend/server/blkif.py b/tools/python/xen/xend/server/blkif.py
index 28ddf5f95d..fdbdd04cf8 100644
--- a/tools/python/xen/xend/server/blkif.py
+++ b/tools/python/xen/xend/server/blkif.py
@@ -78,6 +78,10 @@ class BlkifController(DevController):
if uuid:
back['uuid'] = uuid
+ bootable = config.get('bootable', None)
+ if bootable != None:
+ back['bootable'] = str(bootable)
+
if security.on() == xsconstants.XS_POLICY_USE:
self.do_access_control(config, uname)
@@ -143,11 +147,12 @@ class BlkifController(DevController):
config = DevController.getDeviceConfiguration(self, devid, transaction)
if transaction is None:
devinfo = self.readBackend(devid, 'dev', 'type', 'params', 'mode',
- 'uuid')
+ 'uuid', 'bootable')
else:
devinfo = self.readBackendTxn(transaction, devid,
- 'dev', 'type', 'params', 'mode', 'uuid')
- dev, typ, params, mode, uuid = devinfo
+ 'dev', 'type', 'params', 'mode', 'uuid',
+ 'bootable')
+ dev, typ, params, mode, uuid, bootable = devinfo
if dev:
if transaction is None:
@@ -165,6 +170,8 @@ class BlkifController(DevController):
config['mode'] = mode
if uuid:
config['uuid'] = uuid
+ if bootable != None:
+ config['bootable'] = int(bootable)
proto = self.readFrontend(devid, 'protocol')
if proto: