Skip to contentSkip to conversation

Xend: Fix Device Duplicate Check

PATCH In review Yosuke Iwamatsu 2 participants 3 messages Dec 17, 2007 – Dec 18, 2007

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Xend: Fix Device Duplicate Check

Hi,

This patch fixes device duplicate check as follows.

- Add duplicate check for the blktap device
- Do case-insensitve comparison for mac addresses

Regards,
-------------------
Yosuke Iwamatsu
NEC Corporation

# HG changeset patch
# User [email protected]
# Date 1197871440 -32400
# Node ID f9b5560cfe23eba8870bcca48fb42bf9fb4fbd65 # Parent 966a6d3b74087474df337e00b31cbecf495b442a
Xend: Fix device duplicate check.

tools/python/xen/xend/XendConfig.py +2 -2
diff -r 966a6d3b7408 -r f9b5560cfe23 tools/python/xen/xend/XendConfig.py
@@ -1023,7 +1023,7 @@ class XendConfig(dict):
     def device_duplicate_check(self, dev_type, dev_info, defined_config):
         defined_devices_sxpr = self.all_devices_sxpr(target = defined_config)
         
-        if dev_type == 'vbd':
+        if dev_type == 'vbd' or dev_type == 'tap':
             dev_uname = dev_info.get('uname')
             blkdev_name = dev_info.get('dev')
             devid = self._blkdev_name_to_number(blkdev_name)
@@ -1046,7 +1046,7 @@ class XendConfig(dict):
             
             for o_dev_type, o_dev_info in defined_devices_sxpr:
                 if dev_type == o_dev_type:
-                    if dev_mac == sxp.child_value(o_dev_info, 'mac'):
+                    if dev_mac.lower() == sxp.child_value(o_dev_info, 'mac').lower():
                         raise XendConfigError('The mac "%s" is already defined' %
                                               dev_mac)
     

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel

#1 lore raw

Hi Iwamatsu,

Could you improve your patch to cause an error in the following conditions?

- different blktap disk type:
disk = [ 'tap:aio:/xen/root.img,hda1,w', 'tap:sync:/xen/root.img,hdb1,w' ]
^^^ ^^^^
- different device type:
disk = [ 'file:/xen/root.img,hda1,w', 'tap:***:/xen/root.img,hdb1,w' ]
^^^^ ^^^

Best regards,
Kan

Quoted 11 lines · Yosuke Iwamatsu

Hi,

This patch fixes device duplicate check as follows.

- Add duplicate check for the blktap device
- Do case-insensitve comparison for mac addresses

Regards,
-------------------
Yosuke Iwamatsu
NEC Corporation

#2 lore raw

Hi,

Quoted 10 lines · Masaki Kanno

Hi Iwamatsu,

Could you improve your patch to cause an error in the following conditions?

- different blktap disk type:
disk = [ 'tap:aio:/xen/root.img,hda1,w', 'tap:sync:/xen/root.img,hdb1,w' ]
^^^ ^^^^
- different device type:
disk = [ 'file:/xen/root.img,hda1,w', 'tap:***:/xen/root.img,hdb1,w' ]
^^^^ ^^^

Please take a look at the attach patch, which uses filename rather than uname for duplicate check of block devices. Thank you for the suggestion.

Yosuke

Quoted 17 lines

Best regards,
Kan

Quoted 11 lines · Yosuke Iwamatsu

Hi,

This patch fixes device duplicate check as follows.

- Add duplicate check for the blktap device
- Do case-insensitve comparison for mac addresses

Regards,
-------------------
Yosuke Iwamatsu
NEC Corporation

Xend: Fix device duplicate check.

tools/python/xen/xend/XendConfig.py +10 -7
diff -r 966a6d3b7408 tools/python/xen/xend/XendConfig.py
@@ -31,7 +31,7 @@ from xen.xend.xenstore.xstransact import
 from xen.xend.xenstore.xstransact import xstransact
 from xen.xend.server.BlktapController import blktap_disk_types
 from xen.xend.server.netif import randomMAC
-from xen.util.blkif import blkdev_name_to_number
+from xen.util.blkif import blkdev_name_to_number, blkdev_uname_to_file
 from xen.util import xsconstants
 import xen.util.auxbin
 
@@ -1023,7 +1023,7 @@ class XendConfig(dict):
     def device_duplicate_check(self, dev_type, dev_info, defined_config):
         defined_devices_sxpr = self.all_devices_sxpr(target = defined_config)
         
-        if dev_type == 'vbd':
+        if dev_type == 'vbd' or dev_type == 'tap':
             dev_uname = dev_info.get('uname')
             blkdev_name = dev_info.get('dev')
             devid = self._blkdev_name_to_number(blkdev_name)
@@ -1031,10 +1031,13 @@ class XendConfig(dict):
                 return
             
             for o_dev_type, o_dev_info in defined_devices_sxpr:
-                if dev_type == o_dev_type:
-                    if dev_uname == sxp.child_value(o_dev_info, 'uname'):
-                        raise XendConfigError('The uname "%s" is already defined' %
-                                              dev_uname)
+                if o_dev_type == 'vbd' or o_dev_type == 'tap':
+                    blkdev_file = blkdev_uname_to_file(dev_uname)
+                    o_dev_uname = sxp.child_value(o_dev_info, 'uname')
+                    o_blkdev_file = blkdev_uname_to_file(o_dev_uname)
+                    if blkdev_file == o_blkdev_file:
+                        raise XendConfigError('The file "%s" is already used' %
+                                              blkdev_file)
                     o_blkdev_name = sxp.child_value(o_dev_info, 'dev')
                     o_devid = self._blkdev_name_to_number(o_blkdev_name)
                     if o_devid != None and devid == o_devid:
@@ -1046,7 +1049,7 @@ class XendConfig(dict):
             
             for o_dev_type, o_dev_info in defined_devices_sxpr:
                 if dev_type == o_dev_type:
-                    if dev_mac == sxp.child_value(o_dev_info, 'mac'):
+                    if dev_mac.lower() == sxp.child_value(o_dev_info, 'mac').lower():
                         raise XendConfigError('The mac "%s" is already defined' %
                                               dev_mac)
     

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel