From e3f72275ca2fa65b51f8183af925a5541eed8a7a Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Mon, 16 Feb 2015 12:49:49 +0100 Subject: [PATCH] libmount: add --enable-libmount-force-mountinfo The default libmount mtab management depends on mtan symlink. If the symlink exists than libmount parses /proc/self/mountinfo, otherwise it parses regular classic /etc/mtab. This is backwardly compatible and transparent solution. Unfortunately, this is not robust enough because some broken init scripts or 3-party mount helpers may remove the symlink and create regular mtab file. This is pretty bad if initd (systemd) depends on libmount. Fortunately we known that mtab is absolutely unwanted on some distros, so it's fine too ignore mtab at all and don't care about the symlink. Reported-by: Martin Pitt Signed-off-by: Karel Zak --- configure.ac | 9 +++++++++ libmount/src/context.c | 4 ++++ libmount/src/tab_parse.c | 5 ++++- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 118dcb777c..c846efbdaf 100644 --- a/configure.ac +++ b/configure.ac @@ -851,6 +851,15 @@ AC_SUBST([LIBMOUNT_PATCH_VERSION], $PACKAGE_VERSION_RELEASE) AC_SUBST([LIBMOUNT_VERSION_INFO]) AC_DEFINE_UNQUOTED([LIBMOUNT_VERSION], ["$LIBMOUNT_VERSION"], [libmount version string]) +AC_ARG_ENABLE([libmount-force-mountinfo], + AS_HELP_STRING([--enable-libmount-force-mountinfo], [ignore /etc/mtab in all situations (recommended for systemd)]), + [], [enable_libmount_force_mountinfo=no] +) + +AS_IF([test "x$enable_libmount_force_mountinfo" == xyes], [ + AC_DEFINE([USE_LIBMOUNT_FORCE_MOUNTINFO], [1], [Define to 1 if want to ignore mtab in all situations.]) +]) + dnl dnl libsmartcols diff --git a/libmount/src/context.c b/libmount/src/context.c index c902f396e0..0fb9f6f804 100644 --- a/libmount/src/context.c +++ b/libmount/src/context.c @@ -219,7 +219,11 @@ static int context_init_paths(struct libmnt_context *cxt, int writable) DBG(CXT, ul_debugobj(cxt, "checking for writable tab files")); +#ifdef USE_LIBMOUNT_FORCE_MOUNTINFO + cxt->mtab_writable = 0; +#else mnt_has_regular_mtab(&cxt->mtab_path, &cxt->mtab_writable); +#endif if (!cxt->mtab_writable) /* use /run/mount/utab if /etc/mtab is useless */ diff --git a/libmount/src/tab_parse.c b/libmount/src/tab_parse.c index 2757d0fee0..0f87730ee5 100644 --- a/libmount/src/tab_parse.c +++ b/libmount/src/tab_parse.c @@ -1052,6 +1052,9 @@ int __mnt_table_parse_mtab(struct libmnt_table *tb, const char *filename, assert(tb); +#ifdef USE_LIBMOUNT_FORCE_MOUNTINFO + DBG(TAB, ul_debugobj(tb, "mtab parse: ignore %s", filename ? filename : "mtab")); +#else if (mnt_has_regular_mtab(&filename, NULL)) { DBG(TAB, ul_debugobj(tb, "force mtab usage [filename=%s]", filename)); @@ -1069,7 +1072,7 @@ int __mnt_table_parse_mtab(struct libmnt_table *tb, const char *filename, return 0; filename = NULL; /* failed */ } - +#endif DBG(TAB, ul_debugobj(tb, "mtab parse: #1 read mountinfo")); /* -- 2.47.2