diff options
author | Keir Fraser <keir@xen.org> | 2010-11-08 15:36:58 +0000 |
---|---|---|
committer | Keir Fraser <keir@xen.org> | 2010-11-08 15:36:58 +0000 |
commit | c39abc43138cdd9cc0e8baaf704acbf8c314d6cb (patch) | |
tree | 42fa5fba12d507cf4d5ca307c848f10073c81065 | |
parent | 52f12fda0efb384ed026a162293cfbcd9c8d9414 (diff) | |
download | xen-c39abc43138cdd9cc0e8baaf704acbf8c314d6cb.tar.gz xen-c39abc43138cdd9cc0e8baaf704acbf8c314d6cb.tar.bz2 xen-c39abc43138cdd9cc0e8baaf704acbf8c314d6cb.zip |
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
-rw-r--r-- | tools/python/xen/xend/XendDomainInfo.py | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/tools/python/xen/xend/XendDomainInfo.py b/tools/python/xen/xend/XendDomainInfo.py index a60342c668..8001dd9844 100644 --- a/tools/python/xen/xend/XendDomainInfo.py +++ b/tools/python/xen/xend/XendDomainInfo.py @@ -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" |