Hello,

We received a support request from a customer reporting a hang in the
automount daemon. Analyzing the core dump, it looks like automount
can deadlock if two threads execute in the following order:

(All the line numbers are adjusted to match the latest version from Git)

Thread 7 (Thread 25043):                        Thread 6 (Thread 24007):

#9 start_thread() libpthread.so.0               #3  start_thread() 
libpthread.so.0
#8 do_read_master() at automount.c:1259         #2  do_readmap() at state.c:479
#7 master_read_master() at master.c:853             --> master_mutex_lock() 
[state.c:462]
                                                    --> master_mutex_unlock() 
[state.c:466]
   --> master_mutex_lock() [master.c:836]
   --> cache_writelock() [master.c:838 or :849]
                                                    --> 
master_source_readlock() [state.c:477]
#6 lookup_nss_read_master() at lookup.c:229
#5 do_read_master() at lookup.c:96
#4 lookup_read_master() at lookup_ldap.c:1676
#3 master_parse_entry() at master_parse.y:829
#2 master_add_map_source() at master.c:192
#1 master_source_writelock() at master.c:543    #1  cache_readlock() at 
cache.c:60
#0 pthread_rwlock_wrlock() libpthread.so.0      #0  pthread_rwlock_rdlock() 
libpthread.so.0

At this point:

  Thread 7: locked(master_mutex_lock)
            locked(cache_writelock)             A
            waits(master_source_writelock)      B
  Thread 6: locked(master_source_readlock)      B
            waits(cache_readlock)               A

The AutoFS version is 5.0.5 plus all upstream patches up to
autofs-5.0.5-fix-submount-shutdown-wait.patch plus
autofs-5.0.5-fix-out-of-order-locking-in-readmap.patch
autofs-5.0.5-fix-next-task-list-update.patch
autofs-5.0.5-fix-stale-map-read.patch

At the first sight, moving pthread_cleanup_pop(1) (and consequently
master_mutex_unlock()) to the end of do_readmap() could avoid the
problem, but I didn't test this yet (please see untested patch below).

Any insight would be much appreciated!

Thanks,
Leonardo

Index: autofs/daemon/state.c
===================================================================
--- autofs.orig/daemon/state.c
+++ autofs/daemon/state.c
@@ -463,7 +463,6 @@ static void *do_readmap(void *arg)
        status = lookup_nss_read_map(ap, NULL, now);
        if (!status)
                pthread_exit(NULL);
-       pthread_cleanup_pop(1);
 
        if (ap->type == LKP_INDIRECT) {
                lookup_prune_cache(ap, now);
@@ -504,6 +503,7 @@ static void *do_readmap(void *arg)
        }
 
        pthread_cleanup_pop(1);
+       pthread_cleanup_pop(1);
 
        return NULL;
 }

_______________________________________________
autofs mailing list
autofs@linux.kernel.org
http://linux.kernel.org/mailman/listinfo/autofs

Reply via email to