From: Sage Weil Date: Tue, 5 Mar 2013 04:57:52 +0000 (-0800) Subject: ceph-disk-prepare: verify device is not in use by device-mapper X-Git-Tag: v0.59~36^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a6196de9e2f3ca9d67691f79d44e9a9f669443e9;p=ceph.git ceph-disk-prepare: verify device is not in use by device-mapper Be nice and tell the user which devices/mappings are consuming the device, too. Signed-off-by: Sage Weil --- diff --git a/src/ceph-disk-prepare b/src/ceph-disk-prepare index ef39a009b5c4..2811a1f70736 100755 --- a/src/ceph-disk-prepare +++ b/src/ceph-disk-prepare @@ -117,15 +117,36 @@ def is_mounted(dev): return True return False +def is_held(dev): + """ + Check if a device is held by another device (e.g., a dm-crypt mapping) + """ + assert os.path.exists(dev) + dev = os.path.realpath(dev) + base = dev[5:] + disk = base + while disk[-1].isdigit(): + disk = disk[:-1] + dir = '/sys/block/{disk}/{base}/holders'.format(disk=disk, base=base) + if not os.path.exists(dir): + return [] + return os.listdir(dir) + def verify_not_in_use(dev): assert os.path.exists(dev) if is_partition(dev): if is_mounted(dev): raise PrepareError('Device is mounted', dev) + holders = is_held(dev) + if holders: + raise PrepareError('Device is in use by a device-mapper mapping (dm-crypt?)' % dev, ','.join(holders)) else: for p in list_partitions(dev): if is_mounted(p): raise PrepareError('Device is mounted', p) + holders = is_held(p) + if holders: + raise PrepareError('Device %s is in use by a device-mapper mapping (dm-crypt?)' % p, ','.join(holders)) def write_one_line(parent, name, text): """