: python blkdev_name_to_number fixes
PATCH 4/4 : python blkdev_name_to_number fixes
This patch reworks blkdev_name_to_number to allow the tools to attach xvd disks beyond xvdp. Once this patch is applied, the whole system should work together and allow disks xvdq onwards. The patch does 2 things:
1. Adds the handling for the /dev/xvd[q-z] and /dev/xvd[a-i][a-z] extended devices
2. Changes blkdev_name_to_number() to return a tuple of (xenbus, devnum), and then deals with the resulting fallout.
I freely admit that the change to tools/python/xen/xm/main.py is horrible, but my python is not very good. If someone can suggest a better way to do it, I would appreciate it.
tools/python/xen/util/blkif.py +21 -16
@@ -16,6 +16,9 @@ def blkdev_name_to_number(name): n = expand_dev_name(name) + devname = 'virtual-device' + devnum = None + try: return os.stat(n).st_rdev except Exception, ex:
@@ -25,28 +28,30 @@ def blkdev_name_to_number(name): if re.match( '/dev/sd[a-z]([1-9]|1[0-5])?$', n): major = scsi_major[(ord(n[7:8]) - ord('a')) / 16] minor = ((ord(n[7:8]) - ord('a')) % 16) * 16 + int(n[8:] or 0) - return major * 256 + minor - if re.match( '/dev/sd[a-i][a-z]([1-9]|1[0-5])?$', n): + devnum = major * 256 + minor + elif re.match( '/dev/sd[a-i][a-z]([1-9]|1[0-5])?$', n): major = scsi_major[((ord(n[7:8]) - ord('a') + 1) * 26 + (ord(n[8:9]) - ord('a'))) / 16 ] minor = (((ord(n[7:8]) - ord('a') + 1 ) * 26 + (ord(n[8:9]) - ord('a'))) % 16) * 16 + int(n[9:] or 0) - return major * 256 + minor - - if re.match( '/dev/hd[a-t]([1-9]|[1-5][0-9]|6[0-3])?', n): + devnum = major * 256 + minor + elif re.match( '/dev/hd[a-t]([1-9]|[1-5][0-9]|6[0-3])?', n): ide_majors = [ 3, 22, 33, 34, 56, 57, 88, 89, 90, 91 ] major = ide_majors[(ord(n[7:8]) - ord('a')) / 2] minor = ((ord(n[7:8]) - ord('a')) % 2) * 64 + int(n[8:] or 0) - return major * 256 + minor + devnum = major * 256 + minor + elif re.match( '/dev/xvd[a-p]([1-9]|1[0-5])?$', n): + devnum = (202 << 8) + ((ord(n[8:9]) - ord('a')) << 4) + int(n[9:] or 0) + elif re.match('/dev/xvd[q-z]([1-9]|1[0-5])?$', n): + devname = 'virtual-device-ext' + devnum = (1 << 28) + ((ord(n[8:9]) - ord('a')) << 8) + int(n[9:] or 0) + elif re.match('/dev/xvd[a-i][a-z]([1-9]|1[0-5])?$', n): + devname = 'virtual-device-ext' + devnum = (1 << 28) + (((ord(n[8:9]) - ord('a') + 1) * 26 + (ord(n[9:10]) - ord('a'))) << 8) + int(n[10:] or 0) + elif re.match( '^(0x)[0-9a-fA-F]+$', name ): + devnum = string.atoi(name,16) + elif re.match('^[0-9]+$', name): + devnum = string.atoi(name, 10) - if re.match( '/dev/xvd[a-p]([1-9]|1[0-5])?', n): - return 202 * 256 + 16 * (ord(n[8:9]) - ord('a')) + int(n[9:] or 0) - - if re.match( '^(0x)[0-9a-fA-F]+$', name ): - return string.atoi(name,16) - - if re.match('^[0-9]+$', name): - return string.atoi(name, 10) - - return None + return (devname, devnum) def blkdev_segment(name): """Take the given block-device name (e.g. '/dev/sda1', 'hda')
tools/python/xen/xend/XendConfig.py +1 -1
@@ -1123,7 +1123,7 @@ class XendConfig(dict): try: devid = int(dev2) except ValueError: - devid = blkdev_name_to_number(dev2) + (device_path, devid) = blkdev_name_to_number(dev2) if devid == None: log.debug("The device %s is not device name", dev2) return None
tools/python/xen/xend/server/blkif.py +3 -3
@@ -81,11 +81,11 @@ class BlkifController(DevController): if security.on() == xsconstants.XS_POLICY_ACM: self.do_access_control(config, uname) - devid = blkif.blkdev_name_to_number(dev) + (device_path, devid) = blkif.blkdev_name_to_number(dev) if devid is None: raise VmError('Unable to find number for device (%s)' % (dev)) - front = { 'virtual-device' : "%i" % devid, + front = { device_path : "%i" % devid, 'device-type' : dev_type }
@@ -204,5 +204,5 @@ class BlkifController(DevController): dev = devid.split('/')[-1] dev = int(dev) except ValueError: - dev = blkif.blkdev_name_to_number(dev) + (device_path, dev) = blkif.blkdev_name_to_number(dev) return dev
tools/python/xen/xm/main.py +4 -1
@@ -2022,8 +2022,11 @@ def xm_block_list(args): map(server.xenapi.VBD.get_runtime_properties, vbd_refs) vbd_devs = \ map(server.xenapi.VBD.get_device, vbd_refs) - vbd_devids = \ + tmp_devids = \ map(blkdev_name_to_number, vbd_devs) + vbd_devids = [] + for dev in tmp_devids: + vbd_devids.append(dev[1]) devs = map(lambda (devid, prop): [devid, map2sxp(prop)], zip(vbd_devids, vbd_properties)) else:
_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel
Quoted 12 lines · Chris Lalancette
This patch reworks
blkdev_name_to_numberto allow the tools to attach xvd disks beyond xvdp. Once this patch is applied, the whole system should work together and allow disks xvdq onwards. The patch does 2 things:1. Adds the handling for the /dev/xvd[q-z] and /dev/xvd[a-i][a-z] extended devices
2. Changes
blkdev_name_to_number()to return a tuple of (xenbus, devnum), and then deals with the resulting fallout.I freely admit that the change to
tools/python/xen/xm/main.pyis horrible, but my python is not very good. If someone can suggest a better way to do it, I would appreciate it.
...
Quoted 6 lines
diff -r
dedfadeadf86tools/python/xen/xm/main.pytools/python/xen/xm/main.py +0
-0@@ -2022,8 +2022,11 @@ def xm_block_list(args): map(server.xenapi.VBD.get_runtime_properties, vbd_refs) vbd_devs = \
tools/python/xen/xm/main.py def xm_block_list(args): · line 2032
Quoted 10 lines
tools/python/xen/xm/main.py +4
-1map(server.xenapi.VBD.get_device, vbd_refs) - vbd_devids = \ + tmp_devids = \ map(blkdev_name_to_number, vbd_devs) + vbd_devids = [] + for dev in tmp_devids: + vbd_devids.append(dev[1]) devs = map(lambda (devid, prop): [devid, map2sxp(prop)], zip(vbd_devids, vbd_properties)) else:
vbd_devids = [blkdev_name_to_number(x)[1] for x in vbd_devs]
is probably more idiomatic.
Quoted 4 lines · Brendan Cully
vbd_devids= [blkdev_name_to_number(x)[1] for x invbd_devs]is probably more idiomatic.
Ah yes, much better. Thanks a lot!
Chris Lalancette