We are comparing tables in other places too, so make the dmraid table equal function a global function named compare_tables. This is a preparation patch for modifying the python code to match the C-code table handling changes. --- device.py | 158 ++++++++++++++++++++++++++----------------------------------- 1 files changed, 67 insertions(+), 91 deletions(-) diff --git a/device.py b/device.py index 34a361a..aae1204 100644 --- a/device.py +++ b/device.py @@ -48,6 +48,69 @@ def removeDeviceMap(map): pass map.remove() +def map_dev(path): + if path[0] != '/': + return path + + try: + statinfo = _os.stat(path) + if not _stat.S_ISBLK(statinfo.st_mode): + return path + + return "%d:%d" % (statinfo.st_rdev/256, statinfo.st_rdev%256, ) + except: + return path + +# Helper function for get_map +# The tables will be considered the same if, everything else being the +# same, they contain the same sets of devices. +def compare_tables(table1, table2): + table1 = str(table1).strip().split(' ') + table2 = str(table2).strip().split(' ') + table1sets = [] + table2sets = [] + + # We do this to avoid the index out of range exception + if len(table1) != len(table2): + return False + + for i in range(len(table1)): + d1 = map_dev(table1[i]) + d2 = map_dev(table2[i]) + + # when at least one changes its a device. + if (table1[i] != d1) or (table2[i] != d2): + # The d{1,2} will always have the major:minor string + # We also need what comes after the dev, the offset. + try: + table1sets.append("%s %s" % (d1, table1[i+1])) + table2sets.append("%s %s" % (d2, table2[i+1])) + i += 1 + except IndexError, msg: + # The device must have an offset, if not its nonesense + return False + continue + + # these are not devices + if d1 == d2: + continue + + if d1 != d2: + return False + + # For mirror sets the devices can be in disorder. + if table1[2] == "mirror": + if set(table1sets) != set(table2sets): + return False + + # For none mirror the devs have to be in order. + else: + for i in range(len(table1sets)): + if table1sets[i] != table2sets[i]: + return False + + return True + class BlockDev: def get_major(self): return self._BlockDev__device.major @@ -370,34 +433,11 @@ class MultiPath: # we get "/dev/hda" from one and "3:0" from the other, so we have to # fix up the device name - def map_dev(path): + def munge_dev(path): if path[0] != '/': return path.strip() - bd = path.strip() - try: - newpath=path.split('/')[-1] - pos = 0 - dev = None - num = None - while pos < len(newpath): - if newpath[pos].isdigit(): - dev = newpath[:pos] - num = newpath[pos:] - break - pos += 1 - if dev is None: - dev = newpath - sysnewpath = None - if num is None: - sysnewpath = '/sys/block/%s/dev' % (dev,) - else: - sysnewpath = '/sys/block/%s/%s%s/dev' % (dev, dev, num) - f = open(sysnewpath, 'r') - l = f.readline() - bd = l.strip() - except: - pass + bd = map_dev(path) # starting with 2.6.17-1.2510.fc6 or so, there's an implicit # minimum IOs of 1000, which gets _added_ to the line "dmsetup ls" # shows. This sucks. @@ -406,7 +446,7 @@ class MultiPath: tableParts = [0, self.size, 'multipath'] params = '0 0 1 1 round-robin 0 %s 1 %s' % (len(self.bdevs), \ - _string.join(map(map_dev, self.bdevs))) + _string.join(map(munge_dev, self.bdevs))) tableParts.append(params) import dm as _dm @@ -658,69 +698,6 @@ class RaidSet: pass bdev = property(get_bdev, None, None, "block.BlockDev") - # Helper function for get_map - # The tables will be considered the same if, everything else being the - # same, they contain the same sets of devices. - def equal(self, table1, table2): - def map_dev(path): - if path[0] != '/': - return path - - try: - statinfo = _os.stat(path) - if not _stat.S_ISBLK(statinfo.st_mode): - return path - - return "%d:%d" % (statinfo.st_rdev/256, statinfo.st_rdev%256, ) - except: - return path - - table1 = table1.strip().split(' ') - table2 = table2.strip().split(' ') - table1sets = [] - table2sets = [] - - # We do this to avoid the index out of range exception - if len(table1) != len(table2): - return False - - for i in range(len(table1)): - d1 = map_dev(table1[i]) - d2 = map_dev(table2[i]) - - # when at least one changes its a device. - if (table1[i] != d1) or (table2[i] != d2): - # The d{1,2} will always have the major:minor string - # We also need what comes after the dev, the offset. - try: - table1sets.append("%s %s" % (d1, table1[i+1])) - table2sets.append("%s %s" % (d2, table2[i+1])) - i += 1 - except IndexError, msg: - # The device must have an offset, if not its nonesense - return False - continue - - # these are not devices - if d1 == d2: - continue - - if d1 != d2: - return False - - # For mirror sets the devices can be in disorder. - if self.rs.type == "mirror": - if set(table1sets) != set(table2sets): - return False - - # For none mirror the devs have to be in order. - else: - for i in range(len(table1sets)): - if table1sets[i] != table2sets[i]: - return False - - return True - def get_map(self): if not self._RaidSet__map is None: return self._RaidSet__map @@ -728,8 +705,7 @@ class RaidSet: import dm as _dm for map in _dm.maps(): - # XXX wtf? why's it have a space at the end sometimes? - if self.equal(str(map.table), str(self.rs.dmTable)): + if compare_tables(map.table, self.rs.dmTable): self._RaidSet__map = map self.active = True del _dm -- 1.6.1.3 _______________________________________________ Anaconda-devel-list mailing list Anaconda-devel-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/anaconda-devel-list