]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
common/blkdev: Let get_block_device_base can handle symbolic link path.
authorJianpeng Ma <jianpeng.ma@intel.com>
Tue, 24 May 2016 11:55:44 +0000 (19:55 +0800)
committerJianpeng Ma <jianpeng.ma@intel.com>
Tue, 24 May 2016 11:55:44 +0000 (19:55 +0800)
In bluestore, it create symbolic link for block/db/wal path.
So we hope get_block_device_base can handle symbolic link.

Signed-off-by: Jianpeng Ma <jianpeng.ma@intel.com>
src/common/blkdev.cc

index ec6e849b3eeaf80e9544e15205f4f96be4f28e0f..056f0cc093c5a785ac77b9c0ef7ef0cfa82d3d82 100644 (file)
@@ -58,6 +58,7 @@ int get_block_device_size(int fd, int64_t *psize)
  *  e.g.,
  *   /dev/sda3 -> sda
  *   /dev/cciss/c0d1p2 -> cciss/c0d1
+ *  dev can a symbolic link.
  */
 int get_block_device_base(const char *dev, char *out, size_t out_len)
 {
@@ -68,11 +69,18 @@ int get_block_device_base(const char *dev, char *out, size_t out_len)
   DIR *dir;
   char devname[PATH_MAX], fn[PATH_MAX];
   char *p;
+  char realname[PATH_MAX] = {0};
 
-  if (strncmp(dev, "/dev/", 5) != 0)
-    return -EINVAL;
+  if (strncmp(dev, "/dev/", 5) != 0) {
+    if ((readlink(dev, realname, sizeof(realname)) == -1) || (strncmp(realname, "/dev/", 5) != 0))
+      return -EINVAL;
+  }
+
+  if (strlen(realname))
+    strncpy(devname, realname + 5, PATH_MAX -1);
+  else
+    strncpy(devname, dev + 5, PATH_MAX-1);
 
-  strncpy(devname, dev + 5, PATH_MAX-1);
   devname[PATH_MAX-1] = '\0';
   for (p = devname; *p; ++p)
     if (*p == '/')