diff options
author | Miklos Szeredi <mszeredi@suse.cz> | 2013-09-05 11:44:41 +0200 |
---|---|---|
committer | Maciej Wereski <m.wereski@partner.samsung.com> | 2015-03-18 09:47:15 +0100 |
commit | 4893f8c2cc5ba823528c61709842f4f6918c564c (patch) | |
tree | 399054a89946f839a801620428f855f60de988c4 | |
parent | daaa50491f1758d5437dd390167fbeab227c8280 (diff) | |
download | linux-3.10-4893f8c2cc5ba823528c61709842f4f6918c564c.tar.gz linux-3.10-4893f8c2cc5ba823528c61709842f4f6918c564c.tar.bz2 linux-3.10-4893f8c2cc5ba823528c61709842f4f6918c564c.zip |
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: Miklos Szeredi <mszeredi@suse.cz>
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | fs/sysfs/dir.c | 20 |
1 files changed, 8 insertions, 12 deletions
diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c index e8e0e71b29d..33f1a02ab78 100644 --- a/fs/sysfs/dir.c +++ b/fs/sysfs/dir.c @@ -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)) - goto out_valid; - shrink_dcache_parent(dentry); - } - d_drop(dentry); + + /* 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 (check_submounts_and_drop(dentry) != 0) + goto out_valid; + return 0; } |