diff --git a/lib/backend.py b/lib/backend.py index 7d92afba2fdae0df1e83b12a4ca6eb7aef3cd6f7..479cea256ad8f4ef9219296b510b3ce8ac35259b 100644 --- a/lib/backend.py +++ b/lib/backend.py @@ -807,12 +807,20 @@ def MirrorRemoveChildren(parent_cdev, new_cdevs): if parent_bdev is None: logger.Error("Can't find parent in remove children: %s" % parent_cdev) return False - new_bdevs = [_RecursiveFindBD(disk) for disk in new_cdevs] - if new_bdevs.count(None) > 0: - logger.Error("Can't find some devices while removing children: %s %s" % - (new_cdevs, new_bdevs)) - return False - parent_bdev.RemoveChildren(new_bdevs) + devs = [] + for disk in new_cdevs: + rpath = disk.StaticDevPath() + if rpath is None: + bd = _RecursiveFindBD(disk) + if bd is None: + logger.Error("Can't find dynamic device %s while removing children" % + disk) + return False + else: + devs.append(bd.dev_path) + else: + devs.append(rpath) + parent_bdev.RemoveChildren(devs) return True diff --git a/lib/bdev.py b/lib/bdev.py index bfa333b7b055cf4fad1595471c7c6da9e0dd8600..8dfa18e2c17f5cf1434ec46a9839401a3290d761 100644 --- a/lib/bdev.py +++ b/lib/bdev.py @@ -744,9 +744,9 @@ class MDRaid1(BlockDev): args = ["mdadm", "-f", self.dev_path] orig_devs = [] for dev in devices: - args.append(dev.dev_path) + args.append(dev) for c in self._children: - if c.dev_path == dev.dev_path: + if c.dev_path == dev: orig_devs.append(c) break else: @@ -1878,13 +1878,16 @@ class DRBD8(BaseDRBD): if len(self._children) != 2: raise errors.BlockDeviceError("We don't have two children: %s" % self._children) - + if self._children.count(None) == 2: # we don't actually have children :) + logger.Error("Requested detach while detached") + return if len(devices) != 2: raise errors.BlockDeviceError("We need two children in RemoveChildren") - for idx, dev in enumerate(devices): - if dev.dev_path != self._children[idx].dev_path: - raise errors.BlockDeviceError("Mismatch in local storage (%d) in" - " RemoveChildren" % idx) + for child, dev in zip(self._children, devices): + if dev != child.dev_path: + raise errors.BlockDeviceError("Mismatch in local storage" + " (%s != %s) in RemoveChildren" % + (dev, child.dev_path)) if not self._ShutdownLocal(self.minor): raise errors.BlockDeviceError("Can't detach from local storage")