]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ceph-disk: reimplement is_partition
authorSage Weil <sage@inktank.com>
Thu, 28 Mar 2013 01:43:59 +0000 (18:43 -0700)
committerSage Weil <sage@inktank.com>
Fri, 26 Apr 2013 20:40:06 +0000 (13:40 -0700)
Previously we were assuming any device that ended in a digit was a
partition, but this is not at all correct (e.g., /dev/sr0, /dev/rbd1).
Instead, look in /dev/disk/by-id and see if there is a symlink that ends in
-partNN that links to our device.

There is probably still a better way...

Signed-off-by: Sage Weil <sage@inktank.com>
(cherry picked from commit 20d594a889d62110ad03b761d8703f79f8eea6ad)

src/ceph-disk

index 5c5f82ad00725891787544480e094f7ddc00dae3..6b3145131fa721ceb9b3298ff8d37eded82f2cd1 100755 (executable)
@@ -180,9 +180,22 @@ def is_partition(dev):
     if not stat.S_ISBLK(os.lstat(dev).st_mode):
         raise Error('not a block device', dev)
 
-    # if the device ends in a number, it is a partition (e.g., /dev/sda3)
-    if dev[-1].isdigit():
-        return True
+    # we can't tell just from the name of the device if it is a
+    # partition or not.  look in the by-path dir and see if the
+    # referring symlink ends in -partNNN.
+    name = dev.split('/')[-1]
+    for name in os.listdir('/dev/disk/by-path'):
+        target = os.readlink(os.path.join('/dev/disk/by-path', name))
+        cdev = target.split('/')[-1]
+        if '/dev/' + cdev != dev:
+            continue
+        (baser) = re.search('(.*)-part\d+$', name)
+        if baser is not None:
+            return True
+        else:
+            return False
+
+    # hrm, don't know...
     return False