diff --git a/SOURCES/0087-findmnt-fix-target-behaviour.patch b/SOURCES/0087-findmnt-fix-target-behaviour.patch new file mode 100644 index 00000000..32c9c7ea --- /dev/null +++ b/SOURCES/0087-findmnt-fix-target-behaviour.patch @@ -0,0 +1,105 @@ +From fbdd962ca187399cab3b0bf78d740e5fb304e0bf Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Fri, 16 Dec 2016 12:19:32 +0100 +Subject: [PATCH] findmnt: fix --target behaviour + +Upstream: https://github.com/karelzak/util-linux/commit/80c31a0b596125b387c6b27c899e8bad4e46680b +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1405238 +Signed-off-by: Karel Zak +--- + libmount/src/mountP.h | 1 + + libmount/src/tab.c | 4 ++++ + libmount/src/utils.c | 9 +++++++++ + misc-utils/findmnt.c | 10 +++------- + 4 files changed, 17 insertions(+), 7 deletions(-) + +diff --git a/libmount/src/mountP.h b/libmount/src/mountP.h +index 7b0848f..6cabced 100644 +--- a/libmount/src/mountP.h ++++ b/libmount/src/mountP.h +@@ -164,6 +164,7 @@ extern int mnt_get_filesystems(char ***filesystems, const char *pattern); + extern void mnt_free_filesystems(char **filesystems); + + extern char *mnt_get_kernel_cmdline_option(const char *name); ++extern int mnt_stat_mountpoint(const char *target, struct stat *st); + + /* tab.c */ + extern int mnt_table_set_parser_fltrcb( struct libmnt_table *tb, +diff --git a/libmount/src/tab.c b/libmount/src/tab.c +index 10ee7ce..5628da6 100644 +--- a/libmount/src/tab.c ++++ b/libmount/src/tab.c +@@ -528,6 +528,7 @@ struct libmnt_fs *mnt_table_find_mountpoint(struct libmnt_table *tb, + int direction) + { + char *mnt; ++ struct stat st; + + if (!tb || !path || !*path) + return NULL; +@@ -536,6 +537,9 @@ struct libmnt_fs *mnt_table_find_mountpoint(struct libmnt_table *tb, + + DBG(TAB, mnt_debug_h(tb, "lookup MOUNTPOINT: '%s'", path)); + ++ if (mnt_stat_mountpoint(path, &st)) ++ return NULL; ++ + mnt = strdup(path); + if (!mnt) + return NULL; +diff --git a/libmount/src/utils.c b/libmount/src/utils.c +index c13fb96..5c374b4 100644 +--- a/libmount/src/utils.c ++++ b/libmount/src/utils.c +@@ -104,6 +104,15 @@ static int fstype_cmp(const void *v1, const void *v2) + return strcmp(s1, s2); + } + ++int mnt_stat_mountpoint(const char *target, struct stat *st) ++{ ++#ifdef AT_NO_AUTOMOUNT ++ return fstatat(-1, target, st, AT_NO_AUTOMOUNT); ++#else ++ return stat(target, st); ++#endif ++} ++ + /* returns basename and keeps dirname in the @path, if @path is "/" (root) + * then returns empty string */ + char *stripoff_last_component(char *path) +diff --git a/misc-utils/findmnt.c b/misc-utils/findmnt.c +index fe899db..79ef12e 100644 +--- a/misc-utils/findmnt.c ++++ b/misc-utils/findmnt.c +@@ -239,16 +239,15 @@ static void set_source_match(const char *data) + /* @tb has to be from kernel (so no fstab or so)! */ + static void enable_extra_target_match(struct libmnt_table *tb) + { +- char *cn = NULL; +- const char *tgt = NULL, *mnt = NULL; ++ const char *tgt, *mnt = NULL; + struct libmnt_fs *fs; + + /* + * Check if match pattern is mountpoint, if not use the + * real mountpoint. + */ +- cn = mnt_resolve_path(get_match(COL_TARGET), cache); +- if (!cn) ++ tgt = mnt_resolve_path(get_match(COL_TARGET), cache); ++ if (!tgt) + return; + + fs = mnt_table_find_mountpoint(tb, tgt, MNT_ITER_BACKWARD); +@@ -256,9 +255,6 @@ static void enable_extra_target_match(struct libmnt_table *tb) + mnt = mnt_fs_get_target(fs); + if (mnt && strcmp(mnt, tgt) != 0) + set_match(COL_TARGET, xstrdup(mnt)); /* replace the current setting */ +- +- /* replace the current setting with the real mountpoint */ +- set_match(COL_TARGET, mnt); + } + + +-- +2.7.4