|
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
|