aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorkfraser@localhost.localdomain <kfraser@localhost.localdomain>2007-09-07 11:30:18 +0100
committerkfraser@localhost.localdomain <kfraser@localhost.localdomain>2007-09-07 11:30:18 +0100
commit986fc80c6864d87d9578a2fc696fcc9fd1851a77 (patch)
tree25e062af2ca84a2118c87bb501274d74cf052b27 /tools
parent214523659d2433c54329411d06ce7dbbb95fa39b (diff)
downloadxen-986fc80c6864d87d9578a2fc696fcc9fd1851a77.tar.gz
xen-986fc80c6864d87d9578a2fc696fcc9fd1851a77.tar.bz2
xen-986fc80c6864d87d9578a2fc696fcc9fd1851a77.zip
Fix error message and wait time for xm block-detach command.
- Wait time When xm requests a block device detach to xend, xm makes two requests. At first, xm requests the block device detach by device class 'vbd'. Next, xm requests the block device detaching by device class 'tap'. As a result, the wait time is 200 seconds because each of the block device detaching requests causes time-out. - Misleading error message Because the last request is by device class 'tap' to xend, the keyword "(tap)" is included in the error message. This patch fixes the number of times of the block device detaching request to one time. At first, xm makes inquiries about device class of a detaching target device to xend. Then xm requires the block device detaching by xend returned device class. The wait time becomes 100 seconds because the block device detaching request is one time. And the error message is also fixed. Signed-off-by: Masaki Kanno <kanno.masaki@jp.fujitsu.com>
Diffstat (limited to 'tools')
-rw-r--r--tools/python/xen/xend/XendDomainInfo.py18
-rw-r--r--tools/python/xen/xend/server/XMLRPCServer.py2
-rw-r--r--tools/python/xen/xm/main.py11
3 files changed, 20 insertions, 11 deletions
diff --git a/tools/python/xen/xend/XendDomainInfo.py b/tools/python/xen/xend/XendDomainInfo.py
index 9ef0993c35..20009b0760 100644
--- a/tools/python/xen/xend/XendDomainInfo.py
+++ b/tools/python/xen/xend/XendDomainInfo.py
@@ -602,16 +602,16 @@ class XendDomainInfo:
mac = x[1]
break
break
- dev_info = self.getDeviceInfo_vif(mac)
+ dev_info = self._getDeviceInfo_vif(mac)
else:
_, dev_info = sxprs[dev]
else: # 'vbd' or 'tap'
- dev_info = self.getDeviceInfo_vbd(dev)
+ dev_info = self._getDeviceInfo_vbd(dev)
# To remove the UUID of the device from refs,
# deviceClass must be always 'vbd'.
deviceClass = 'vbd'
if dev_info is None:
- return rc
+ raise XendError("Device %s is not defined" % devid)
dev_uuid = sxp.child_value(dev_info, 'uuid')
del self.info['devices'][dev_uuid]
@@ -632,14 +632,22 @@ class XendDomainInfo:
dev_num += 1
return sxprs
- def getDeviceInfo_vif(self, mac):
+ def getBlockDeviceClass(self, devid):
+ # To get a device number from the devid,
+ # we temporarily use the device controller of VBD.
+ dev = self.getDeviceController('vbd').convertToDeviceNumber(devid)
+ dev_info = self._getDeviceInfo_vbd(dev)
+ if dev_info:
+ return dev_info[0]
+
+ def _getDeviceInfo_vif(self, mac):
for dev_type, dev_info in self.info.all_devices_sxpr():
if dev_type != 'vif':
continue
if mac == sxp.child_value(dev_info, 'mac'):
return dev_info
- def getDeviceInfo_vbd(self, devid):
+ def _getDeviceInfo_vbd(self, devid):
for dev_type, dev_info in self.info.all_devices_sxpr():
if dev_type != 'vbd' and dev_type != 'tap':
continue
diff --git a/tools/python/xen/xend/server/XMLRPCServer.py b/tools/python/xen/xend/server/XMLRPCServer.py
index 81a799b185..91eb21632d 100644
--- a/tools/python/xen/xend/server/XMLRPCServer.py
+++ b/tools/python/xen/xend/server/XMLRPCServer.py
@@ -87,7 +87,7 @@ methods = ['device_create', 'device_configure',
'destroyDevice','getDeviceSxprs',
'setMemoryTarget', 'setName', 'setVCpuCount', 'shutdown',
'send_sysrq', 'getVCPUInfo', 'waitForDevices',
- 'getRestartCount']
+ 'getRestartCount', 'getBlockDeviceClass']
exclude = ['domain_create', 'domain_restore']
diff --git a/tools/python/xen/xm/main.py b/tools/python/xen/xm/main.py
index 3f83e65d05..8473f8bf5b 100644
--- a/tools/python/xen/xm/main.py
+++ b/tools/python/xen/xm/main.py
@@ -2217,12 +2217,13 @@ def xm_block_detach(args):
% (dev,dom))
else:
arg_check(args, 'block-detach', 2, 3)
- try:
+ dom = args[0]
+ dev = args[1]
+ dc = server.xend.domain.getBlockDeviceClass(dom, dev)
+ if dc == "tap":
+ detach(args, 'tap')
+ else:
detach(args, 'vbd')
- return
- except:
- pass
- detach(args, 'tap')
def xm_network_detach(args):
if serverType == SERVER_XEN_API: