mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
xend: improve psudeo-bootloader support for external block scripts
Userspace tools support external block scripts (e.g. block-drbd provided by drbd project). The psuedo-bootloader setup code in xend has a few limitations wrt external block scripts, which this patch addresses. blkif.py: parse_uname() utility function should be able to parse a disk specifier understood by the rest of the tools. XendDomainInfo.py: Block devices using external block scripts must be attached to dom0 before running the psuedo-bootloader. Signed-off-by: Jim Fehlig <jfehlig@novell.com> Tested-by: Shriram Rajagopalan <rshriram@gmail.com> Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
This commit is contained in:
1 parent
9418284397
commit
891436a0e8
2 files changed
+21
-9
No files matched your search
@@ -66,8 +66,8 @@ def blkdev_segment(name):
|
||||
'type' : 'Disk' }
|
||||
return val
|
||||
|
||||
def _parse_uname(uname):
|
||||
fn = taptype = None
|
||||
def parse_uname(uname):
|
||||
fn = typ = taptype = None
|
||||
if uname.find(":") != -1:
|
||||
(typ, fn) = uname.split(":", 1)
|
||||
|
||||
@@ -76,15 +76,18 @@ def _parse_uname(uname):
|
||||
|
||||
if typ in ("tap", "tap2"):
|
||||
(taptype, fn) = fn.split(":", 1)
|
||||
return (fn, taptype)
|
||||
if taptype in ("tapdisk", "ioemu"):
|
||||
(taptype, fn) = fn.split(":", 1)
|
||||
return (fn, (typ,taptype))
|
||||
|
||||
|
||||
def blkdev_uname_to_file(uname):
|
||||
"""Take a blkdev uname and return the corresponding filename."""
|
||||
return _parse_uname(uname)[0]
|
||||
return parse_uname(uname)[0]
|
||||
|
||||
def blkdev_uname_to_taptype(uname):
|
||||
"""Take a blkdev uname and return the blktap type."""
|
||||
return _parse_uname(uname)[1]
|
||||
return parse_uname(uname)[1]
|
||||
|
||||
def mount_mode(name):
|
||||
mode = None
|
||||
|
||||
@@ -38,7 +38,7 @@ from types import StringTypes
|
||||
|
||||
import xen.lowlevel.xc
|
||||
from xen.util import asserts, auxbin, mkdir
|
||||
from xen.util.blkif import blkdev_uname_to_file, blkdev_uname_to_taptype
|
||||
from xen.util.blkif import parse_uname
|
||||
import xen.util.xsm.xsm as security
|
||||
from xen.util import xsconstants
|
||||
from xen.util import mkdir
|
||||
@@ -3248,9 +3248,18 @@ class XendDomainInfo:
|
||||
devtype = devinfo[0]
|
||||
disk = devinfo[1]['uname']
|
||||
|
||||
fn = blkdev_uname_to_file(disk)
|
||||
taptype = blkdev_uname_to_taptype(disk)
|
||||
mounted = devtype in ['tap', 'tap2'] and taptype != 'aio' and taptype != 'sync' and not os.stat(fn).st_rdev
|
||||
(fn, types) = parse_uname(disk)
|
||||
def _shouldMount(types):
|
||||
if types[0] in ('file', 'phy'):
|
||||
return False
|
||||
if types[0] in ('tap', 'tap2'):
|
||||
if types[1] in ('aio', 'sync'):
|
||||
return False
|
||||
else:
|
||||
return True
|
||||
return os.access('/etc/xen/scripts/block-%s' % types[0], os.X_OK)
|
||||
|
||||
mounted = _shouldMount(types)
|
||||
mounted_vbd_uuid = 0
|
||||
if mounted:
|
||||
# This is a file, not a device. pygrub can cope with a
|
||||
|
||||