[Xend] Add a --force option to detach operations.

In some situations triggered by errors found on guest side,
the device will be held forever, due to the online flag being still
on. Detach operations mostly fails from this point on, as the backend
will not see frontend's state change anymore.

Signed-off-by: Glauber de Oliveira Costa <gcosta@redhat.com>
This commit is contained in:
kfraser@localhost.localdomain committed 2006-12-14 10:17:37 +00:00
1 parent 2267ec4e4a
commit 70efc627d2
4 files changed
+24 -10

No files matched your search

+2 -2
View File
@@ -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)
@@ -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())
+3 -3
View File
@@ -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)
+11 -4
View File
@@ -142,14 +142,14 @@ SUBCOMMAND_HELP = {
'Create a new virtual block device.'),
'block-configure': ('<Domain> <BackDev> <FrontDev> <Mode> [BackDomain]',
'Change block device configuration'),
'block-detach' : ('<Domain> <DevId>',
'block-detach' : ('<Domain> <DevId> [-f|--force]',
'Destroy a domain\'s virtual block device.'),
'block-list' : ('<Domain> [--long]',
'List virtual block devices for a domain.'),
'network-attach': ('<Domain> [--script=<script>] [--ip=<ip>] '
'[--mac=<mac>]',
'Create a new virtual network device.'),
'network-detach': ('<Domain> <DevId>',
'network-detach': ('<Domain> <DevId> [-f|--force]',
'Destroy a domain\'s virtual network device.'),
'network-list' : ('<Domain> [--long]',
'List virtual network interfaces for a domain.'),
@@ -1493,12 +1493,19 @@ def xm_network_attach(args):
def detach(args, command, deviceClass):
arg_check(args, command, 2)
arg_check(args, command, 2, 3)
dom = args[0]
dev = args[1]
try:
force = args[2]
if (force != "--force") and (force != "-f"):
print "Ignoring option %s"%(force)
force = None
except IndexError:
force = None
server.xend.domain.destroyDevice(dom, deviceClass, dev)
server.xend.domain.destroyDevice(dom, deviceClass, dev, force)
def xm_block_detach(args):
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.