forked from Minki/linux
[PATCH] autofs4: fix race in unhashed dentry code
Commit f50b6f8691
introduced a race in
autofs4 between autofs_lookup_unhashed() and autofs_dentry_release().
autofs_dentry_release() ends up clearing the ->dentry and ->inode members
of autofs_info before removing it from the rehash list. The list is
protected by the rehash lock in both functions, but since
autofs_dentry_release() starts tearing the autofs_info struct down before
removing it from the list, autofs_lookup_unhashed() can get a autofs_info
with a NULL dentry.
This patch moves the clearing of ->dentry and ->inode after the removal
from the rehash list.
Signed-off-by: Jeff Mahoney <jeffm@suse.com>
Acked-by: Ian Kent <raven@themaw.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
6d205f1205
commit
c3724b129b
@ -470,9 +470,6 @@ void autofs4_dentry_release(struct dentry *de)
|
||||
if (inf) {
|
||||
struct autofs_sb_info *sbi = autofs4_sbi(de->d_sb);
|
||||
|
||||
inf->dentry = NULL;
|
||||
inf->inode = NULL;
|
||||
|
||||
if (sbi) {
|
||||
spin_lock(&sbi->rehash_lock);
|
||||
if (!list_empty(&inf->rehash))
|
||||
@ -480,6 +477,9 @@ void autofs4_dentry_release(struct dentry *de)
|
||||
spin_unlock(&sbi->rehash_lock);
|
||||
}
|
||||
|
||||
inf->dentry = NULL;
|
||||
inf->inode = NULL;
|
||||
|
||||
autofs4_free_ino(inf);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user