From: Jiri Denemark Subject: [PATCH] xend: Remember bootable flag for vbds in xenstore Date: Mon, 8 Dec 2008 12:25:57 +0100 Message-ID: <20081208112557.GC3637@orkuz.home> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="pAwQNkOnpTn9IO2O" Return-path: Content-Disposition: inline List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org --pAwQNkOnpTn9IO2O Content-Type: text/plain; charset=us-ascii Content-Disposition: inline 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 --pAwQNkOnpTn9IO2O Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="remember-boootable-flag.patch" diff -r a00eb6595d3c tools/python/xen/xend/XendConfig.py --- a/tools/python/xen/xend/XendConfig.py Sat Nov 29 09:07:52 2008 +0000 +++ b/tools/python/xen/xend/XendConfig.py Thu Dec 04 16:49:05 2008 +0100 @@ -1285,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: @@ -1321,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) @@ -1329,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 -r a00eb6595d3c tools/python/xen/xend/server/blkif.py --- a/tools/python/xen/xend/server/blkif.py Sat Nov 29 09:07:52 2008 +0000 +++ b/tools/python/xen/xend/server/blkif.py Thu Dec 04 16:49:05 2008 +0100 @@ -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: --pAwQNkOnpTn9IO2O Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel --pAwQNkOnpTn9IO2O--