Blob Blame History Raw
autofs-5.0.4 - mannual umount recovery fixes

From: Ian Kent <raven@themaw.net>

Check for the absence of a mount before doing the manual umount
checks and check ioctlfd is valid seperately. Take a write lock
on the map entry mutex to ensure any mount request is complete
before checking.
---

 CHANGELOG         |    1 +
 daemon/direct.c   |    4 ++--
 daemon/indirect.c |   37 +++++++++++++++++++++++--------------
 3 files changed, 26 insertions(+), 16 deletions(-)


diff --git a/CHANGELOG b/CHANGELOG
index f0d0e58..05e0206 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -54,6 +54,7 @@
 - fix notify mount message path.
 - remount we created mount point fix.
 - fix double free in sasl_bind().
+- mannual umount recovery fixes.
 
 4/11/2008 autofs-5.0.4
 -----------------------
diff --git a/daemon/direct.c b/daemon/direct.c
index 74a9acc..7b02c7a 100644
--- a/daemon/direct.c
+++ b/daemon/direct.c
@@ -889,9 +889,9 @@ void *expire_proc_direct(void *arg)
 			/* Check for manual umount */
 			cache_writelock(me->mc);
 			if (me->ioctlfd != -1 && 
-			    fstat(ioctlfd, &st) != -1 &&
+			    fstat(me->ioctlfd, &st) != -1 &&
 			    !count_mounts(ap->logopt, next->path, st.st_dev)) {
-				ops->close(ap->logopt, ioctlfd);
+				ops->close(ap->logopt, me->ioctlfd);
 				me->ioctlfd = -1;
 				cache_unlock(me->mc);
 				pthread_setcancelstate(cur_state, NULL);
diff --git a/daemon/indirect.c b/daemon/indirect.c
index 463b39c..8025ee4 100644
--- a/daemon/indirect.c
+++ b/daemon/indirect.c
@@ -437,7 +437,19 @@ void *expire_proc_indirect(void *arg)
 				struct mapent *me = NULL;
 				struct stat st;
 
-				master_source_readlock(ap->entry);
+				/* It's got a mount, deal with in the outer loop */
+				if (is_mounted(_PATH_MOUNTED, next->path, MNTS_REAL)) {
+					pthread_setcancelstate(cur_state, NULL);
+					continue;
+				}
+
+				/* Don't touch submounts */
+				if (master_find_submount(ap, next->path)) {
+					pthread_setcancelstate(cur_state, NULL);
+					continue;
+				}
+
+				master_source_writelock(ap->entry);
 
 				map = ap->entry->maps;
 				while (map) {
@@ -456,20 +468,17 @@ void *expire_proc_indirect(void *arg)
 					continue;
 				}
 
+				if (me->ioctlfd == -1) {
+					cache_unlock(mc);
+					master_source_unlock(ap->entry);
+					pthread_setcancelstate(cur_state, NULL);
+					continue;
+				}
+
 				/* Check for manual umount */
-				if (me->ioctlfd != -1 &&
-				    (fstat(me->ioctlfd, &st) == -1 ||
-				     !count_mounts(ap->logopt, me->key, st.st_dev))) {
-					if (is_mounted(_PROC_MOUNTS, me->key, MNTS_REAL)) {
-						error(ap->logopt,
-						      "error: possible mtab mismatch %s",
-						      me->key);
-						cache_unlock(mc);
-						master_source_unlock(ap->entry);
-						pthread_setcancelstate(cur_state, NULL);
-						continue;
-					}
-					close(me->ioctlfd);
+				if (fstat(me->ioctlfd, &st) == -1 ||
+				    !count_mounts(ap->logopt, me->key, st.st_dev)) {
+					ops->close(ap->logopt, me->ioctlfd);
 					me->ioctlfd = -1;
 				}