Ian Kent c5187b
autofs-5.0.4 - force unlink umount at startup
Ian Kent c5187b
Ian Kent c5187b
From: Ian Kent <raven@themaw.net>
Ian Kent c5187b
Ian Kent c5187b
Version 5.0.3 autofs would unlink existing mounts at startup. This
Ian Kent c5187b
functioned OK most of the time but caused processes whose working
Ian Kent c5187b
directory was within unlinked automounted directories to not get a
Ian Kent c5187b
correct pwd reported by the system.
Ian Kent c5187b
Ian Kent c5187b
There can be situations where the unlink umounting is desirable, such
Ian Kent c5187b
as when the daemon is forceably killed and we want to get rid of any
Ian Kent c5187b
existing mounts at startup. This change provides a way to force this
Ian Kent c5187b
old behavior by passing the "--force" option to the daemon. This can
Ian Kent c5187b
also be done by using the "forcestart" and "forcerestart" actions to
Ian Kent c5187b
the init script.
Ian Kent c5187b
Ian Kent c5187b
Note that the old behavior will always be used if the kernel does not
Ian Kent c5187b
include the iotcl re-implementation which provides the ability to
Ian Kent c5187b
re-connect to existing mounts.
Ian Kent c5187b
---
Ian Kent c5187b
Ian Kent c5187b
 CHANGELOG             |    2 ++
Ian Kent c5187b
 daemon/automount.c    |   14 +++++++++++++-
Ian Kent c5187b
 daemon/direct.c       |    2 +-
Ian Kent c5187b
 daemon/indirect.c     |    2 +-
Ian Kent c5187b
 include/automount.h   |    3 +++
Ian Kent c5187b
 man/automount.8       |   13 +++++++++++++
Ian Kent c5187b
 redhat/autofs.init.in |   10 +++++++++-
Ian Kent c5187b
 samples/rc.autofs.in  |   10 +++++++++-
Ian Kent c5187b
 8 files changed, 51 insertions(+), 5 deletions(-)
Ian Kent c5187b
Ian Kent c5187b
Ian Kent c5187b
diff --git a/CHANGELOG b/CHANGELOG
Ian Kent c5187b
index 7dee674..d4dd70b 100644
Ian Kent c5187b
--- a/CHANGELOG
Ian Kent c5187b
+++ b/CHANGELOG
Ian Kent c5187b
@@ -12,6 +12,8 @@
Ian Kent c5187b
 - fix hosts map use after free.
Ian Kent c5187b
 - fix uri list locking (again).
Ian Kent c5187b
 - check for stale SASL credentials upon connect fail.
Ian Kent c5187b
+- add "forcestart" and "forcerestart" init script options to allow
Ian Kent c5187b
+  use of 5.0.3 strartup behavior if required.
Ian Kent c5187b
 
Ian Kent c5187b
 4/11/2008 autofs-5.0.4
Ian Kent c5187b
 -----------------------
Ian Kent c5187b
diff --git a/daemon/automount.c b/daemon/automount.c
Ian Kent c5187b
index f04273f..e20e7c9 100644
Ian Kent c5187b
--- a/daemon/automount.c
Ian Kent c5187b
+++ b/daemon/automount.c
Ian Kent c5187b
@@ -57,6 +57,7 @@ static char *pid_file = NULL;		/* File in which to keep pid */
Ian Kent c5187b
 unsigned int global_random_selection;	/* use random policy when selecting
Ian Kent c5187b
 					 * which multi-mount host to mount */
Ian Kent c5187b
 long global_negative_timeout = -1;
Ian Kent c5187b
+int do_force_unlink = 0;		/* Forceably unlink mount tree at startup */
Ian Kent c5187b
 
Ian Kent c5187b
 static int start_pipefd[2];
Ian Kent c5187b
 static int st_stat = 0;
Ian Kent c5187b
@@ -1798,6 +1799,7 @@ int main(int argc, char *argv[])
Ian Kent c5187b
 		{"version", 0, 0, 'V'},
Ian Kent c5187b
 		{"set-log-priority", 1, 0, 'l'},
Ian Kent c5187b
 		{"dont-check-daemon", 0, 0, 'C'},
Ian Kent c5187b
+		{"force", 0, 0, 'F'},
Ian Kent c5187b
 		{0, 0, 0, 0}
Ian Kent c5187b
 	};
Ian Kent c5187b
 
Ian Kent c5187b
@@ -1819,7 +1821,7 @@ int main(int argc, char *argv[])
Ian Kent c5187b
 	daemon_check = 1;
Ian Kent c5187b
 
Ian Kent c5187b
 	opterr = 0;
Ian Kent c5187b
-	while ((opt = getopt_long(argc, argv, "+hp:t:vdD:fVrO:l:n:C", long_options, NULL)) != EOF) {
Ian Kent c5187b
+	while ((opt = getopt_long(argc, argv, "+hp:t:vdD:fVrO:l:n:CF", long_options, NULL)) != EOF) {
Ian Kent c5187b
 		switch (opt) {
Ian Kent c5187b
 		case 'h':
Ian Kent c5187b
 			usage();
Ian Kent c5187b
@@ -1892,6 +1894,10 @@ int main(int argc, char *argv[])
Ian Kent c5187b
 			daemon_check = 0;
Ian Kent c5187b
 			break;
Ian Kent c5187b
 
Ian Kent c5187b
+		case 'F':
Ian Kent c5187b
+			do_force_unlink = 1;
Ian Kent c5187b
+			break;
Ian Kent c5187b
+
Ian Kent c5187b
 		case '?':
Ian Kent c5187b
 		case ':':
Ian Kent c5187b
 			printf("%s: Ambiguous or unknown options\n", program);
Ian Kent c5187b
@@ -2066,6 +2072,12 @@ int main(int argc, char *argv[])
Ian Kent c5187b
 		exit(3);
Ian Kent c5187b
 	}
Ian Kent c5187b
 
Ian Kent c5187b
+	/*
Ian Kent c5187b
+	 * Mmm ... reset force unlink umount so we don't also do this
Ian Kent c5187b
+	 * in future when we receive a HUP signal.
Ian Kent c5187b
+	 */
Ian Kent c5187b
+	do_force_unlink = 0;
Ian Kent c5187b
+
Ian Kent c5187b
 	res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat));
Ian Kent c5187b
 	close(start_pipefd[1]);
Ian Kent c5187b
 
Ian Kent c5187b
diff --git a/daemon/direct.c b/daemon/direct.c
Ian Kent c5187b
index d9dda3d..2d979f1 100644
Ian Kent c5187b
--- a/daemon/direct.c
Ian Kent c5187b
+++ b/daemon/direct.c
Ian Kent c5187b
@@ -335,7 +335,7 @@ int do_mount_autofs_direct(struct autofs_point *ap, struct mnt_list *mnts, struc
Ian Kent c5187b
 	/* Calculate the timeouts */
Ian Kent c5187b
 	ap->exp_runfreq = (timeout + CHECK_RATIO - 1) / CHECK_RATIO;
Ian Kent c5187b
 
Ian Kent c5187b
-	if (ops->version) {
Ian Kent c5187b
+	if (ops->version && !do_force_unlink) {
Ian Kent c5187b
 		ap->flags |= MOUNT_FLAG_REMOUNT;
Ian Kent c5187b
 		ret = try_remount(ap, me, t_direct);
Ian Kent c5187b
 		ap->flags &= ~MOUNT_FLAG_REMOUNT;
Ian Kent c5187b
diff --git a/daemon/indirect.c b/daemon/indirect.c
Ian Kent c5187b
index 0721707..2ccbc53 100644
Ian Kent c5187b
--- a/daemon/indirect.c
Ian Kent c5187b
+++ b/daemon/indirect.c
Ian Kent c5187b
@@ -97,7 +97,7 @@ static int do_mount_autofs_indirect(struct autofs_point *ap, const char *root)
Ian Kent c5187b
 
Ian Kent c5187b
 	ap->exp_runfreq = (timeout + CHECK_RATIO - 1) / CHECK_RATIO;
Ian Kent c5187b
 
Ian Kent c5187b
-	if (ops->version) {
Ian Kent c5187b
+	if (ops->version && !do_force_unlink) {
Ian Kent c5187b
 		ap->flags |= MOUNT_FLAG_REMOUNT;
Ian Kent c5187b
 		ret = try_remount(ap, NULL, t_indirect);
Ian Kent c5187b
 		ap->flags &= ~MOUNT_FLAG_REMOUNT;
Ian Kent c5187b
diff --git a/include/automount.h b/include/automount.h
Ian Kent c5187b
index 46cb6c6..1f14d5b 100644
Ian Kent c5187b
--- a/include/automount.h
Ian Kent c5187b
+++ b/include/automount.h
Ian Kent c5187b
@@ -428,6 +428,9 @@ struct autofs_point {
Ian Kent c5187b
 	struct list_head submounts;	/* List of child submounts */
Ian Kent c5187b
 };
Ian Kent c5187b
 
Ian Kent c5187b
+/* Foreably unlink existing mounts at startup. */
Ian Kent c5187b
+extern int do_force_unlink;
Ian Kent c5187b
+
Ian Kent c5187b
 /* Standard functions used by daemon or modules */
Ian Kent c5187b
 
Ian Kent c5187b
 #define	MOUNT_OFFSET_OK		0
Ian Kent c5187b
diff --git a/man/automount.8 b/man/automount.8
Ian Kent c5187b
index d9285bf..9fcaaf4 100644
Ian Kent c5187b
--- a/man/automount.8
Ian Kent c5187b
+++ b/man/automount.8
Ian Kent c5187b
@@ -84,6 +84,11 @@ path name as specified in the master map.
Ian Kent c5187b
 .TP
Ian Kent c5187b
 .I "\-C, \-\-dont-check-daemon"
Ian Kent c5187b
 Don't check if the daemon is currently running (see NOTES).
Ian Kent c5187b
+.TP
Ian Kent c5187b
+.I "\-F, \-\-force"
Ian Kent c5187b
+Force an unlink umount of existing mounts under autofs managed mount points
Ian Kent c5187b
+during startup. This can cause problems for processes with working directories
Ian Kent c5187b
+within these mounts (see NOTES).
Ian Kent c5187b
 .SH ARGUMENTS
Ian Kent c5187b
 \fBautomount\fP takes one optional argument, the name of the master map to
Ian Kent c5187b
 use.
Ian Kent c5187b
@@ -132,6 +137,14 @@ for certain types of automount maps. The mounts of the seperate daemons
Ian Kent c5187b
 might interfere with one another. The implications of running multiple
Ian Kent c5187b
 daemon instances needs to be checked and tested before we can say this
Ian Kent c5187b
 is supported.
Ian Kent c5187b
+.P
Ian Kent c5187b
+If the option to force an unlink of mounts at startup is used then processes
Ian Kent c5187b
+whose working directory is within unlinked automounted directories will not
Ian Kent c5187b
+get the correct pwd from the system. This is because, after the mount is
Ian Kent c5187b
+unlinked from the mount tree, anything that needs to walk back up the mount
Ian Kent c5187b
+tree to construct a path, such as getcwd(2) and the proc filesystem
Ian Kent c5187b
+/proc/<pid>/cwd, cannot work because the point from which the path is
Ian Kent c5187b
+constructed has been detached from the mount tree.
Ian Kent c5187b
 .SH "SEE ALSO"
Ian Kent c5187b
 .BR autofs (5),
Ian Kent c5187b
 .BR autofs (8),
Ian Kent c5187b
diff --git a/redhat/autofs.init.in b/redhat/autofs.init.in
Ian Kent c5187b
index 65c786e..471667e 100644
Ian Kent c5187b
--- a/redhat/autofs.init.in
Ian Kent c5187b
+++ b/redhat/autofs.init.in
Ian Kent c5187b
@@ -137,6 +137,10 @@ case "$1" in
Ian Kent c5187b
 	start)
Ian Kent c5187b
 		start
Ian Kent c5187b
 		;;
Ian Kent c5187b
+	forcestart)
Ian Kent c5187b
+		OPTIONS="$OPTIONS --force"
Ian Kent c5187b
+		start
Ian Kent c5187b
+		;;
Ian Kent c5187b
 	stop)
Ian Kent c5187b
 		stop
Ian Kent c5187b
 		;;
Ian Kent c5187b
@@ -146,6 +150,10 @@ case "$1" in
Ian Kent c5187b
 	restart)
Ian Kent c5187b
 		restart
Ian Kent c5187b
 		;;
Ian Kent c5187b
+	forcerestart)
Ian Kent c5187b
+		OPTIONS="$OPTIONS --force"
Ian Kent c5187b
+		restart
Ian Kent c5187b
+		;;
Ian Kent c5187b
 	reload)
Ian Kent c5187b
 		reload
Ian Kent c5187b
 		;;
Ian Kent c5187b
@@ -155,7 +163,7 @@ case "$1" in
Ian Kent c5187b
 		fi
Ian Kent c5187b
 		;;
Ian Kent c5187b
 	*)
Ian Kent c5187b
-		echo $"Usage: $0 {start|stop|status|restart|reload|condrestart}"
Ian Kent c5187b
+		echo $"Usage: $0 {start|forcestart|stop|status|restart|orcerestart|reload|condrestart}"
Ian Kent c5187b
 		exit 1;
Ian Kent c5187b
 		;;
Ian Kent c5187b
 esac
Ian Kent c5187b
diff --git a/samples/rc.autofs.in b/samples/rc.autofs.in
Ian Kent c5187b
index 51f5b02..2877fe2 100644
Ian Kent c5187b
--- a/samples/rc.autofs.in
Ian Kent c5187b
+++ b/samples/rc.autofs.in
Ian Kent c5187b
@@ -117,17 +117,25 @@ case "$1" in
Ian Kent c5187b
 	start)
Ian Kent c5187b
 		start
Ian Kent c5187b
 		;;
Ian Kent c5187b
+	forcestart)
Ian Kent c5187b
+		OPTIONS="$OPTIONS --force"
Ian Kent c5187b
+		start
Ian Kent c5187b
+		;;
Ian Kent c5187b
 	stop)
Ian Kent c5187b
 		stop
Ian Kent c5187b
 		;;
Ian Kent c5187b
 	restart)
Ian Kent c5187b
 		restart
Ian Kent c5187b
 		;;
Ian Kent c5187b
+	forcerestart)
Ian Kent c5187b
+		OPTIONS="$OPTIONS --force"
Ian Kent c5187b
+		restart
Ian Kent c5187b
+		;;
Ian Kent c5187b
 	reload)
Ian Kent c5187b
 		reload
Ian Kent c5187b
 		;;
Ian Kent c5187b
 	*)
Ian Kent c5187b
-		echo $"Usage: $0 {start|stop|restart|reload}"
Ian Kent c5187b
+		echo $"Usage: $0 {start|forcestart|stop|restart|forcerestart|reload}"
Ian Kent c5187b
 		exit 1;
Ian Kent c5187b
 		;;
Ian Kent c5187b
 esac