- srv lookup handle endianness. - fix bug introduced by library reload changes which causes autofs to not release mount thread resources when using submounts. - fix notify mount message path. - try harder to work out if we created mount point at remount. - fix double free in do_sasl_bind(). - manual umount recovery fixes. - fix map type info parse error.
101 lines
2.9 KiB
Diff
101 lines
2.9 KiB
Diff
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;
|
|
}
|
|
|