summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarel Zak <kzak@redhat.com>2015-03-10 12:51:44 +0100
committerKarel Zak <kzak@redhat.com>2015-03-12 10:21:47 +0100
commit48367e2d9921d696dda937038cf2da6052590794 (patch)
treebf1f84e211068fdbf3e6453b96137fc9b3ac021f
parent14e6f4a5397de4b688315f6177d9f0ac8c8af774 (diff)
downloadutil-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.c4
-rw-r--r--misc-utils/findmnt.88
-rw-r--r--misc-utils/findmnt.c18
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);
}
}