diff --git a/tools/python/xen/xend/XendDomainInfo.py b/tools/python/xen/xend/XendDomainInfo.py index de66eb4e75..e26d2ffdab 100644 --- a/tools/python/xen/xend/XendDomainInfo.py +++ b/tools/python/xen/xend/XendDomainInfo.py @@ -563,7 +563,7 @@ class XendDomainInfo: for devclass in XendDevices.valid_devices(): self.getDeviceController(devclass).waitForDevices() - def destroyDevice(self, deviceClass, devid): + def destroyDevice(self, deviceClass, devid, force=None): try: devid = int(devid) except ValueError: @@ -578,7 +578,7 @@ class XendDomainInfo: devid = entry break - return self.getDeviceController(deviceClass).destroyDevice(devid) + return self.getDeviceController(deviceClass).destroyDevice(devid, force) diff --git a/tools/python/xen/xend/server/DevController.py b/tools/python/xen/xend/server/DevController.py index 7f738ab67e..aa96e323ce 100644 --- a/tools/python/xen/xend/server/DevController.py +++ b/tools/python/xen/xend/server/DevController.py @@ -195,7 +195,7 @@ class DevController: raise VmError('%s devices may not be reconfigured' % self.deviceClass) - def destroyDevice(self, devid): + def destroyDevice(self, devid, force): """Destroy the specified device. @param devid The device ID, or something device-specific from which @@ -216,6 +216,13 @@ class DevController: self.writeBackend(devid, 'online', "0") self.writeBackend(devid, 'state', str(xenbusState['Closing'])) + if force: + frontpath = self.frontendPath(devid) + backpath = xstransact.Read(frontpath, "backend") + if backpath: + xstransact.Remove(backpath) + xstransact.Remove(frontpath) + def configurations(self): return map(self.configuration, self.deviceIDs()) diff --git a/tools/python/xen/xend/server/blkif.py b/tools/python/xen/xend/server/blkif.py index bba11ebe1f..44d1a1e1ff 100644 --- a/tools/python/xen/xend/server/blkif.py +++ b/tools/python/xen/xend/server/blkif.py @@ -133,7 +133,7 @@ class BlkifController(DevController): return config - def destroyDevice(self, devid): + def destroyDevice(self, devid, force): """@see DevController.destroyDevice""" # If we are given a device name, then look up the device ID from it, @@ -142,13 +142,13 @@ class BlkifController(DevController): # superclass's method. try: - DevController.destroyDevice(self, int(devid)) + DevController.destroyDevice(self, int(devid), force) except ValueError: devid_end = type(devid) is str and devid.split('/')[-1] or None for i in self.deviceIDs(): d = self.readBackend(i, 'dev') if d == devid or (devid_end and d == devid_end): - DevController.destroyDevice(self, i) + DevController.destroyDevice(self, i, force) return raise VmError("Device %s not connected" % devid) diff --git a/tools/python/xen/xm/main.py b/tools/python/xen/xm/main.py index 779b5280b8..981c01f1e9 100644 --- a/tools/python/xen/xm/main.py +++ b/tools/python/xen/xm/main.py @@ -142,14 +142,14 @@ SUBCOMMAND_HELP = { 'Create a new virtual block device.'), 'block-configure': (' [BackDomain]', 'Change block device configuration'), - 'block-detach' : (' ', + 'block-detach' : (' [-f|--force]', 'Destroy a domain\'s virtual block device.'), 'block-list' : (' [--long]', 'List virtual block devices for a domain.'), 'network-attach': (' [--script=