Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c3724b12 authored by Jeff Mahoney's avatar Jeff Mahoney Committed by Linus Torvalds
Browse files

[PATCH] autofs4: fix race in unhashed dentry code



Commit f50b6f86 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: default avatarJeff Mahoney <jeffm@suse.com>
Acked-by: default avatarIan Kent <raven@themaw.net>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 6d205f12
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -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);
	}
}