diff options
author | Wang Shilong | 2019-04-14 05:31:56 +0200 |
---|---|---|
committer | Karel Zak | 2019-04-15 11:12:55 +0200 |
commit | 8302b2009a5584c7503ff4c63eaf9f701836b46f (patch) | |
tree | 50711892a821bedf20a98ebbb5fbaaa6b0ac9f86 /sys-utils | |
parent | tests: update lscpu due to 'Vulnerability' fields (diff) | |
download | kernel-qcow2-util-linux-8302b2009a5584c7503ff4c63eaf9f701836b46f.tar.gz kernel-qcow2-util-linux-8302b2009a5584c7503ff4c63eaf9f701836b46f.tar.xz kernel-qcow2-util-linux-8302b2009a5584c7503ff4c63eaf9f701836b46f.zip |
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 <adilger@dilger.ca>
Cc: Shuichi Ihara <sihara@ddn.com>
[1] http://wiki.lustre.org/Main_Page
Signed-off-by: Wang Shilong <wshilong@ddn.com>
Diffstat (limited to 'sys-utils')
-rw-r--r-- | sys-utils/fstrim.c | 11 |
1 files changed, 9 insertions, 2 deletions
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; } |