summaryrefslogtreecommitdiffstats
path: root/sys-utils/fstrim.c
diff options
context:
space:
mode:
authorWang Shilong2019-04-14 05:31:56 +0200
committerKarel Zak2019-04-15 11:12:55 +0200
commit8302b2009a5584c7503ff4c63eaf9f701836b46f (patch)
tree50711892a821bedf20a98ebbb5fbaaa6b0ac9f86 /sys-utils/fstrim.c
parenttests: update lscpu due to 'Vulnerability' fields (diff)
downloadkernel-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/fstrim.c')
-rw-r--r--sys-utils/fstrim.c11
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;
}