Blob Blame History Raw
From 7cc9fe69d3f35038b7b3329fef0cccdbe38ffef6 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Mon, 13 Dec 2021 13:22:56 +0100
Subject: mount: add hint about systemctl daemon-reload

This commit implements an extra hint for systemd based distros to
inform users that units currently used by systemd are older than
fstab.  This situation is usually unwanted, and 'systemctl
daemon-reload' is recommended.

The message is printed only on terminal to avoid extra messages in
logs, etc.

Addresses: https://github.com/systemd/systemd/pull/20476
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=2180413
Upstream: http://github.com/util-linux/util-linux/commit/1db0715169954a8f3898f7ca9d3902cd6c27084d
Signed-off-by: Karel Zak <kzak@redhat.com>
---
 include/pathnames.h |  2 ++
 sys-utils/mount.c   | 23 +++++++++++++++++++++++
 2 files changed, 25 insertions(+)

diff --git a/include/pathnames.h b/include/pathnames.h
index 77f8b6e85..19b117cb9 100644
--- a/include/pathnames.h
+++ b/include/pathnames.h
@@ -76,6 +76,8 @@
 #define _PATH_NUMLOCK_ON	_PATH_RUNSTATEDIR "/numlock-on"
 #define _PATH_LOGINDEFS		"/etc/login.defs"
 
+#define _PATH_SD_UNITSLOAD	_PATH_RUNSTATEDIR "/systemd/systemd-units-load"
+
 /* misc paths */
 #define _PATH_WORDS             "/usr/share/dict/words"
 #define _PATH_WORDS_ALT         "/usr/share/dict/web2"
diff --git a/sys-utils/mount.c b/sys-utils/mount.c
index 83cccf63e..108b55001 100644
--- a/sys-utils/mount.c
+++ b/sys-utils/mount.c
@@ -38,6 +38,7 @@
 #include "strutils.h"
 #include "closestream.h"
 #include "canonicalize.h"
+#include "pathnames.h"
 
 #define XALLOC_EXIT_CODE MNT_EX_SYSERR
 #include "xalloc.h"
@@ -287,6 +288,25 @@ static void selinux_warning(struct libmnt_context *cxt, const char *tgt)
 # define selinux_warning(_x, _y)
 #endif
 
+static void systemd_hint(void)
+{
+	static int fstab_check_done = 0;
+
+	if (fstab_check_done == 0) {
+		struct stat a, b;
+
+		if (isatty(STDERR_FILENO) &&
+		    stat(_PATH_SD_UNITSLOAD, &a) == 0 &&
+		    stat(_PATH_MNTTAB, &b) == 0 &&
+		    cmp_stat_mtime(&a, &b, <))
+			printf(_(
+	"mount: (hint) your fstab has been modified, but systemd still uses\n"
+	"       the old version; use 'systemctl daemon-reload' to reload.\n"));
+
+		fstab_check_done = 1;
+	}
+}
+
 /*
  * Returns exit status (MNT_EX_*) and/or prints error message.
  */
@@ -310,6 +330,9 @@ static int mk_exit_code(struct libmnt_context *cxt, int rc)
 	if (rc == MNT_EX_SUCCESS && mnt_context_get_status(cxt) == 1) {
 		selinux_warning(cxt, tgt);
 	}
+
+	systemd_hint();
+
 	return rc;
 }
 
-- 
2.39.2