From: eXeC001er Date: Mon, 16 Aug 2010 16:11:30 +0000 (+0100) Subject: Fix "Error: Device 51952 not connected" error when using pygrub X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~11636 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=3484b6c6c6d64846e69c13e137cd2d8065e5a58c;p=xen.git 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 Signed-off-by: Stefano Stabellini committer: Stefano Stabellini --- diff --git a/tools/python/xen/xend/XendDomainInfo.py b/tools/python/xen/xend/XendDomainInfo.py index 831506b9d9..4360ce2492 100644 --- a/tools/python/xen/xend/XendDomainInfo.py +++ b/tools/python/xen/xend/XendDomainInfo.py @@ -3261,6 +3261,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 @@ -3276,7 +3277,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: @@ -3286,8 +3288,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"