Fix/cleanup destroyDevice code path in xend.

When calling destroyDevice code path (e.g. xm block-detach dom devid),
allow specifying an integer device id or a device name such as xvdN or
/dev/xvdN.  Allowing the /dev/xvdN form is useful when detaching
devices from dom0.  Bootloaders may do this to unmount a disk
previously mounted in dom0.

Move examination of device ID format into the DevController,
permitting device controllers to determine a valid device ID instead
of higher level code.

Signed-off-by: Jim Fehlig <jfehlig@novell.com>
This commit is contained in:
kfraser@localhost.localdomain committed 2007-08-06 10:12:34 +01:00
1 parent 883ff61657
commit e080ffba8d
5 files changed
+96 -27

No files matched your search

+2 -12
View File
@@ -559,18 +559,8 @@ class XendDomainInfo:
self.getDeviceController(devclass).waitForDevices()
def destroyDevice(self, deviceClass, devid, force = False):
try:
dev = int(devid)
except ValueError:
# devid is not a number but a string containing either device
# name (e.g. xvda) or device_type/device_id (e.g. vbd/51728)
dev = type(devid) is str and devid.split('/')[-1] or None
if dev == None:
log.debug("Could not find the device %s", devid)
return None
log.debug("dev = %s", dev)
return self.getDeviceController(deviceClass).destroyDevice(dev, force)
log.debug("dev = %s", devid)
return self.getDeviceController(deviceClass).destroyDevice(devid, force)
def getDeviceSxprs(self, deviceClass):
if self._stateGet() in (DOM_STATE_RUNNING, DOM_STATE_PAUSED):
+14 -9
View File
@@ -203,27 +203,32 @@ class DevController:
The implementation here simply deletes the appropriate paths from the
store. This may be overridden by subclasses who need to perform other
tasks on destruction. Further, the implementation here can only
accept integer device IDs, or values that can be converted to
integers. Subclasses may accept other values and convert them to
integers before passing them here.
tasks on destruction. The implementation here accepts integer device
IDs or paths containg integer deviceIDs, e.g. vfb/0. Subclasses may
accept other values and convert them to integers before passing them
here.
"""
devid = int(devid)
try:
dev = int(devid)
except ValueError:
# Does devid contain devicetype/deviceid?
# Propogate exception if unable to find an integer devid
dev = int(type(devid) is str and devid.split('/')[-1] or None)
# Modify online status /before/ updating state (latter is watched by
# drivers, so this ordering avoids a race).
self.writeBackend(devid, 'online', "0")
self.writeBackend(devid, 'state', str(xenbusState['Closing']))
self.writeBackend(dev, 'online', "0")
self.writeBackend(dev, 'state', str(xenbusState['Closing']))
if force:
frontpath = self.frontendPath(devid)
frontpath = self.frontendPath(dev)
backpath = xstransact.Read(frontpath, "backend")
if backpath:
xstransact.Remove(backpath)
xstransact.Remove(frontpath)
self.vm._removeVm("device/%s/%d" % (self.deviceClass, devid))
self.vm._removeVm("device/%s/%d" % (self.deviceClass, dev))
def configurations(self):
return map(self.configuration, self.deviceIDs())
+9 -6
View File
@@ -154,13 +154,16 @@ class BlkifController(DevController):
def destroyDevice(self, devid, force):
"""@see DevController.destroyDevice"""
# If we are given a device name, then look up the device ID from it,
# and destroy that ID instead. If what we are given is an integer,
# then assume it's a device ID and pass it straight through to our
# superclass's method.
# vbd device IDs can be either string or integer. Further, the
# following string values are possible:
# - devicetype/deviceid (vbd/51728)
# - devicetype/devicename (/dev/xvdb)
# - devicename (xvdb)
# Let our superclass handle integer or devicetype/deviceid forms.
# If we are given a device name form, then look up the device ID
# from it, and destroy that ID instead.
try:
DevController.destroyDevice(self, int(devid), force)
DevController.destroyDevice(self, devid, force)
except ValueError:
devid_end = type(devid) is str and devid.split('/')[-1] or None
@@ -0,0 +1,30 @@
<?xml version="1.0" ?>
<SecurityPolicyDefinition xmlns="http://www.ibm.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ibm.com ../../security_policy.xsd">
<PolicyHeader>
<PolicyName>DEFAULT</PolicyName>
<Version>1.0</Version>
</PolicyHeader>
<SimpleTypeEnforcement>
<SimpleTypeEnforcementTypes>
<Type>SystemManagement</Type>
</SimpleTypeEnforcementTypes>
</SimpleTypeEnforcement>
<ChineseWall>
<ChineseWallTypes>
<Type>SystemManagement</Type>
</ChineseWallTypes>
</ChineseWall>
<SecurityLabelTemplate>
<SubjectLabels bootstrap="SystemManagement">
<VirtualMachineLabel>
<Name>SystemManagement</Name>
<SimpleTypeEnforcementTypes>
<Type>SystemManagement</Type>
</SimpleTypeEnforcementTypes>
<ChineseWallTypes>
<Type/>
</ChineseWallTypes>
</VirtualMachineLabel>
</SubjectLabels>
</SecurityLabelTemplate>
</SecurityPolicyDefinition>
@@ -0,0 +1,41 @@
<?xml version="1.0" ?>
<SecurityPolicyDefinition xmlns="http://www.ibm.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ibm.com ../../security_policy.xsd">
<PolicyHeader>
<PolicyName>DEFAULT-UL</PolicyName>
<Version>1.0</Version>
</PolicyHeader>
<SimpleTypeEnforcement>
<SimpleTypeEnforcementTypes>
<Type>SystemManagement</Type>
<Type>__UNLABELED__</Type>
</SimpleTypeEnforcementTypes>
</SimpleTypeEnforcement>
<ChineseWall>
<ChineseWallTypes>
<Type>SystemManagement</Type>
</ChineseWallTypes>
</ChineseWall>
<SecurityLabelTemplate>
<SubjectLabels bootstrap="SystemManagement">
<VirtualMachineLabel>
<Name>SystemManagement</Name>
<SimpleTypeEnforcementTypes>
<Type>SystemManagement</Type>
<Type>__UNLABELED__</Type>
</SimpleTypeEnforcementTypes>
<ChineseWallTypes>
<Type/>
</ChineseWallTypes>
</VirtualMachineLabel>
<VirtualMachineLabel>
<Name>__UNLABELED__</Name>
<SimpleTypeEnforcementTypes>
<Type>__UNLABELED__</Type>
</SimpleTypeEnforcementTypes>
<ChineseWallTypes>
<Type/>
</ChineseWallTypes>
</VirtualMachineLabel>
</SubjectLabels>
</SecurityLabelTemplate>
</SecurityPolicyDefinition>
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.