From 8302b2009a5584c7503ff4c63eaf9f701836b46f Mon Sep 17 00:00:00 2001 From: Wang Shilong Date: Sun, 14 Apr 2019 12:31:56 +0900 Subject: fstrim: get realpath before trim ioctl Original motivation is we want to run fstrim command on Lustre[1] osd server mount point directly, however our server mount point doesn't export osd directory to users, and it will cause following command fail: $fstrim -v /mnt/mds/ But following succeed: $fstrim -v /mnt/mds We could improve this a bit by getting realpath before trapping kernel, this also give benifits to normal use cases. Cc: Andreas Dilger Cc: Shuichi Ihara [1] http://wiki.lustre.org/Main_Page Signed-off-by: Wang Shilong --- sys-utils/fstrim.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'sys-utils/fstrim.c') diff --git a/sys-utils/fstrim.c b/sys-utils/fstrim.c index 175717114..830556458 100644 --- a/sys-utils/fstrim.c +++ b/sys-utils/fstrim.c @@ -67,14 +67,20 @@ struct fstrim_control { /* returns: 0 = success, 1 = unsupported, < 0 = error */ static int fstrim_filesystem(struct fstrim_control *ctl, const char *path, const char *devname) { - int fd, rc; + int fd = -1, rc; struct stat sb; struct fstrim_range range; + char *rpath = realpath(path, NULL); + if (!rpath) { + warn(_("cannot get realpath: %s"), path); + rc = -errno; + goto done; + } /* kernel modifies the range */ memcpy(&range, &ctl->range, sizeof(range)); - fd = open(path, O_RDONLY); + fd = open(rpath, O_RDONLY); if (fd < 0) { warn(_("cannot open %s"), path); rc = -errno; @@ -129,6 +135,7 @@ static int fstrim_filesystem(struct fstrim_control *ctl, const char *path, const done: if (fd >= 0) close(fd); + free(rpath); return rc; } -- cgit v1.2.3-55-g7522