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>
This commit is contained in:
Keir Fraser committed 2008-12-09 12:45:45 +00:00
1 parent ce4d300de0
commit b90edb337d
2 files changed
+14 -7

No files matched your search

+4 -4
View File
@@ -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':
+10 -3
View File
@@ -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:
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.