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

Commit 6497d160 authored by Miklos Szeredi's avatar Miklos Szeredi Committed by Al Viro
Browse files

sysfs: use check_submounts_and_drop()



Do have_submounts(), shrink_dcache_parent() and d_drop() atomically.

check_submounts_and_drop() can deal with negative dentries and
non-directories as well.

Non-directories can also be mounted on.  And just like directories we don't
want these to disappear with invalidation.

Signed-off-by: default avatarMiklos Szeredi <mszeredi@suse.cz>
Acked-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 13caa9fb
Loading
Loading
Loading
Loading
+8 −12
Original line number Diff line number Diff line
@@ -297,7 +297,6 @@ static int sysfs_dentry_delete(const struct dentry *dentry)
static int sysfs_dentry_revalidate(struct dentry *dentry, unsigned int flags)
{
	struct sysfs_dirent *sd;
	int is_dir;
	int type;

	if (flags & LOOKUP_RCU)
@@ -341,18 +340,15 @@ out_bad:
	 * is performed at its new name the dentry will be readded
	 * to the dcache hashes.
	 */
	is_dir = (sysfs_type(sd) == SYSFS_DIR);
	mutex_unlock(&sysfs_mutex);
	if (is_dir) {

	/* If we have submounts we must allow the vfs caches
	 * to lie about the state of the filesystem to prevent
	 * leaks and other nasty things.
	 */
		if (have_submounts(dentry))
	if (check_submounts_and_drop(dentry) != 0)
		goto out_valid;
		shrink_dcache_parent(dentry);
	}
	d_drop(dentry);

	return 0;
}