On Thu, 2008-05-15 at 14:59 -0700, Jim Carter wrote:
> Thread 4 (Thread 0x79aeeb90 (LWP 8592)):
> #0 0xffffe410 in __kernel_vsyscall ()
> #1 0xb7ecb817 in poll () from /lib/libc.so.6
> #2 0x8000a343 in handle_mounts (arg=0x800bd540) at automount.c:909
> #3 0xb7f4e192 in start_thread () from /lib/libpthread.so.0
> #4 0xb7ed502e in clone () from /lib/libc.so.6
>
> Thread 3 (Thread 0x78ee9b90 (LWP 11528)):
> #0 0xffffe410 in __kernel_vsyscall ()
> #1 0xb7f52566 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib/libpthread.so.0
> #2 0x800215b7 in master_notify_submount (ap=0x8004e8a8,
> path=0x800a9630 "/net/bamboo45", state=ST_EXPIRE) at master.c:908
> #3 0x8000c90d in expire_proc_indirect (arg=0x800825e8) at indirect.c:468
> #4 0xb7f4e192 in start_thread () from /lib/libpthread.so.0
> #5 0xb7ed502e in clone () from /lib/libc.so.6
This does look like an execution order dependency.
Please try this patch in addition to the ones you're using.
autofs-5.0.3 - take submount submount lock before waiting
From: Ian Kent <[EMAIL PROTECTED]>
Take the submount lock before issuing the nextstate() call to ensure
the child can't signal completion before the parent waits. Also add
cancellation cleanup for both mutexes.
---
lib/master.c | 26 +++++++++++++++++++-------
1 files changed, 19 insertions(+), 7 deletions(-)
diff --git a/lib/master.c b/lib/master.c
index e506661..40441ca 100644
--- a/lib/master.c
+++ b/lib/master.c
@@ -845,6 +845,20 @@ int master_submount_list_empty(struct autofs_point *ap)
return res;
}
+static void mounts_mutex_cleanup(void *arg)
+{
+ struct autofs_point *ap = (struct autofs_point *) arg;
+ mounts_mutex_unlock(ap);
+ return;
+}
+
+static void submount_mutex_cleanup(void *arg)
+{
+ struct autofs_point *ap = (struct autofs_point *) arg;
+ submount_mutex_unlock(ap);
+ return;
+}
+
int master_notify_submount(struct autofs_point *ap, const char *path, enum
states state)
{
struct list_head *head, *p;
@@ -853,6 +867,7 @@ int master_notify_submount(struct autofs_point *ap, const
char *path, enum state
size_t plen = strlen(path);
int status, ret = 1;
+ pthread_cleanup_push(mounts_mutex_cleanup, ap);
mounts_mutex_lock(ap);
head = &ap->submounts;
@@ -889,19 +904,16 @@ int master_notify_submount(struct autofs_point *ap, const
char *path, enum state
}
/* Now we have a submount to expire */
-
+ pthread_cleanup_push(submount_mutex_cleanup, ap);
+ submount_mutex_lock(ap);
state_mutex_lock(this);
-
if (this->state == ST_SHUTDOWN) {
state_mutex_unlock(this);
break;
}
-
nextstate(this->state_pipe[1], state);
-
state_mutex_unlock(this);
- submount_mutex_lock(ap);
thid = this->thid;
ap->submount_signaled = MASTER_SUBMNT_WAIT;
while (ap->submount_signaled == MASTER_SUBMNT_WAIT) {
@@ -916,12 +928,12 @@ int master_notify_submount(struct autofs_point *ap, const
char *path, enum state
fatal(status);
} else
ret = 0;
- submount_mutex_unlock(ap);
+ pthread_cleanup_pop(1);
break;
}
- mounts_mutex_unlock(ap);
+ pthread_cleanup_pop(1);
return ret;
}
_______________________________________________
autofs mailing list
[email protected]
http://linux.kernel.org/mailman/listinfo/autofs