mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 02:30:03 +01:00
Fix "Error: Device 51952 not connected" error when using pygrub
The following is the process of booting a DomU with 'mounted-blktap2' (VHD for example) and 'pygrub' as bootloader: 1. Connect boot-device to Dom0 as '/dev/xpvd' 2. Pygrub get info for load DomU 3. Disconnect boot-device from Dom0 4. Boot DomU During step 3 the created device is disconnected from Dom0, but xenstore does not scrape away after the device is disconnected so you get the following error: "Error: Device /dev/xvdp (51952, tap2) is already connected." During step 3 xend calls destroyDevice always with 'tap' as argument. Signed-off-by: eXeC001er <execooler@gmail.com> Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> xen-unstable changeset: 21999:cd5b4135fe03 xen-unstable date: Mon Aug 16 17:11:30 2010 +0100
This commit is contained in:
1 parent
52f12fda0e
commit
c39abc4313
1 file changed
+6
-3
@@ -3243,6 +3243,7 @@ class XendDomainInfo:
|
||||
|
||||
taptype = blkdev_uname_to_taptype(disk)
|
||||
mounted = devtype in ['tap', 'tap2'] and taptype != 'aio' and taptype != 'sync' and not os.stat(fn).st_rdev
|
||||
mounted_vbd_uuid = 0
|
||||
if mounted:
|
||||
# This is a file, not a device. pygrub can cope with a
|
||||
# file if it's raw, but if it's QCOW or other such formats
|
||||
@@ -3258,7 +3259,8 @@ class XendDomainInfo:
|
||||
|
||||
from xen.xend import XendDomain
|
||||
dom0 = XendDomain.instance().privilegedDomain()
|
||||
dom0._waitForDeviceUUID(dom0.create_vbd(vbd, disk))
|
||||
mounted_vbd_uuid = dom0.create_vbd(vbd, disk);
|
||||
dom0._waitForDeviceUUID(mounted_vbd_uuid)
|
||||
fn = BOOTLOADER_LOOPBACK_DEVICE
|
||||
|
||||
try:
|
||||
@@ -3268,8 +3270,9 @@ class XendDomainInfo:
|
||||
if mounted:
|
||||
log.info("Unmounting %s from %s." %
|
||||
(fn, BOOTLOADER_LOOPBACK_DEVICE))
|
||||
|
||||
dom0.destroyDevice('tap', BOOTLOADER_LOOPBACK_DEVICE)
|
||||
_, vbd_info = dom0.info['devices'][mounted_vbd_uuid]
|
||||
dom0.destroyDevice(dom0.getBlockDeviceClass(vbd_info['devid']),
|
||||
BOOTLOADER_LOOPBACK_DEVICE, force = True)
|
||||
|
||||
if blcfg is None:
|
||||
msg = "Had a bootloader specified, but can't find disk"
|
||||
|
||||