From: Jianpeng Ma Date: Tue, 24 May 2016 11:55:44 +0000 (+0800) Subject: common/blkdev: Let get_block_device_base can handle symbolic link path. X-Git-Tag: v11.0.0~376^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=96ebbe68fce53879b58d9580626c4f28dfa158bd;p=ceph.git common/blkdev: Let get_block_device_base can handle symbolic link path. 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 --- diff --git a/src/common/blkdev.cc b/src/common/blkdev.cc index ec6e849b3ee..056f0cc093c 100644 --- a/src/common/blkdev.cc +++ b/src/common/blkdev.cc @@ -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 == '/')