2000-11-04 01:58:08

by Nigel Gamble

[permalink] [raw]
Subject: Locking problem in autofs4_expire(), 2.4.0-test10

dput() is called with dcache_lock already held, resulting in deadlock.

Here is a suggested fix:

===== expire.c 1.3 vs edited =====
--- 1.3/linux/fs/autofs4/expire.c Tue Oct 31 15:14:06 2000
+++ edited/expire.c Fri Nov 3 17:47:47 2000
@@ -223,8 +223,10 @@
mntput(p);
return dentry;
}
+ spin_unlock(&dcache_lock);
dput(d);
mntput(p);
+ spin_lock(&dcache_lock);
}
spin_unlock(&dcache_lock);

Nigel Gamble
MontaVista Software


2000-11-06 00:35:23

by Nigel Gamble

[permalink] [raw]
Subject: Re: Locking problem in autofs4_expire(), 2.4.0-test10

On Fri, 3 Nov 2000, Nigel Gamble wrote:
>
> dput() is called with dcache_lock already held, resulting in deadlock.
>
> Here is a suggested fix:
>
> ===== expire.c 1.3 vs edited =====
> --- 1.3/linux/fs/autofs4/expire.c Tue Oct 31 15:14:06 2000
> +++ edited/expire.c Fri Nov 3 17:47:47 2000
> @@ -223,8 +223,10 @@
> mntput(p);
> return dentry;
> }
> + spin_unlock(&dcache_lock);
> dput(d);
> mntput(p);
> + spin_lock(&dcache_lock);
> }
> spin_unlock(&dcache_lock);

On looking at this code more closely, I don't think it's safe just
to drop the lock, because it looks like the lock is supposed to
protect the loop variable, tmp, and the data structure which
is being traversed. However, I'm not familiar with this code,
so I'm hoping someone who is can come up with a correct solution
to this deadlock problem.

Nigel