mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
[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:
1 parent
2267ec4e4a
commit
70efc627d2
4 files changed
+24
-10
No files matched your search
@@ -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())
|
||||
|
||||
@@ -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)
|
||||
@@ -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):
|
||||
|
||||