diff options
author | Karel Zak <kzak@redhat.com> | 2015-03-10 12:51:44 +0100 |
---|---|---|
committer | Karel Zak <kzak@redhat.com> | 2015-03-12 10:21:47 +0100 |
commit | 48367e2d9921d696dda937038cf2da6052590794 (patch) | |
tree | bf1f84e211068fdbf3e6453b96137fc9b3ac021f | |
parent | 14e6f4a5397de4b688315f6177d9f0ac8c8af774 (diff) | |
download | util-linux-48367e2d9921d696dda937038cf2da6052590794.tar.gz |
findmnt: don't rely on st_dev for --target
The overlay filesystem does not provide usable st_dev (in traditional
UNIX way). It's necessary to search in /proc/self/mountinfo to detect
which path element is mountpoint.
$ findmnt --target /mnt/merged/dir-a/foo
TARGET SOURCE FSTYPE OPTIONS
/mnt/merged overlay overlay rw,relatime,lowerdir=/mnt/low,upperdir=/mnt/high/data,workdir=/mnt/high/work
Signed-off-by: Karel Zak <kzak@redhat.com>
-rw-r--r-- | libmount/src/utils.c | 4 | ||||
-rw-r--r-- | misc-utils/findmnt.8 | 8 | ||||
-rw-r--r-- | misc-utils/findmnt.c | 18 |
3 files changed, 20 insertions, 10 deletions
diff --git a/libmount/src/utils.c b/libmount/src/utils.c index 25c762fdd..6f4d1a19f 100644 --- a/libmount/src/utils.c +++ b/libmount/src/utils.c @@ -960,6 +960,10 @@ int mnt_open_uniq_filename(const char *filename, char **name) * This function finds the mountpoint that a given path resides in. @path * should be canonicalized. The returned pointer should be freed by the caller. * + * WARNING: the function compares st_dev of the @path elements. This traditional + * way maybe be insufficient on filesystems like Linux "overlay". See also + * mnt_table_find_target(). + * * Returns: allocated string with the target of the mounted device or NULL on error */ char *mnt_get_mountpoint(const char *path) diff --git a/misc-utils/findmnt.8 b/misc-utils/findmnt.8 index 45cb49b4a..31c614ae1 100644 --- a/misc-utils/findmnt.8 +++ b/misc-utils/findmnt.8 @@ -185,8 +185,12 @@ Search in .IR /etc/fstab . The output is in the list format (see \fB--list\fR). .TP -.BR \-T , " \-\-target \fIdir\fP" -Explicitly define the mount target (mountpoint directory). +.BR \-T , " \-\-target \fIpath\fP" +Explicitly define the mount target (mountpoint directory). If the \fIpath\fR +is not a mountpoint file or directory than +.B findmnt +checks \fIpath\fR elements in reverse order for get the mountpoint (this feature is +supported only if search in kernel files and unsupported for \fB\-\-fstab\fP). .TP .BR \-t , " \-\-types \fIlist\fP" Limit the set of printed filesystems. More than one type may be diff --git a/misc-utils/findmnt.c b/misc-utils/findmnt.c index 968512355..1adc23124 100644 --- a/misc-utils/findmnt.c +++ b/misc-utils/findmnt.c @@ -259,10 +259,12 @@ static void set_source_match(const char *data) set_match(COL_SOURCE, data); } -static void enable_extra_target_match(void) +/* @tb has to be from kernel (so no fstab or so)! */ +static void enable_extra_target_match(struct libmnt_table *tb) { - char *cn = NULL, *mnt = NULL; - const char *tgt = NULL; + char *cn = NULL; + const char *tgt = NULL, *mnt = NULL; + struct libmnt_fs *fs; /* * Check if match pattern is mountpoint, if not use the @@ -276,11 +278,11 @@ static void enable_extra_target_match(void) return; } - mnt = mnt_get_mountpoint(tgt); + fs = mnt_table_find_mountpoint(tb, tgt, MNT_ITER_BACKWARD); + if (fs) + mnt = mnt_fs_get_target(fs); if (mnt && strcmp(mnt, tgt) != 0) - set_match(COL_TARGET, mnt); /* replace the current setting */ - else - free(mnt); + set_match(COL_TARGET, xstrdup(mnt)); /* replace the current setting */ if (!cache) free(cn); @@ -1606,7 +1608,7 @@ int main(int argc, char *argv[]) * try it again with extra functionality for target * match */ - enable_extra_target_match(); + enable_extra_target_match(tb); rc = add_matching_lines(tb, table, direction); } } |