aboutsummaryrefslogtreecommitdiffstats
path: root/fs/sysfs/dir.c
diff options
context:
space:
mode:
authorMiklos Szeredi <mszeredi@suse.cz>2013-09-05 05:44:41 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2013-09-05 16:23:53 -0400
commit6497d160f6abf8d1082ff1a4efd841118cb1fddd (patch)
treefc03ca8342fbd7b441198028b9c29cff83533db3 /fs/sysfs/dir.c
parent13caa9fb5b4ce040379523037a0ce4ef867ee0c0 (diff)
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>
Diffstat (limited to 'fs/sysfs/dir.c')
-rw-r--r--fs/sysfs/dir.c20
1 files changed, 8 insertions, 12 deletions
diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c
index 99ec5b40e977..4d83cedb9fcb 100644
--- a/fs/sysfs/dir.c
+++ b/fs/sysfs/dir.c
@@ -297,7 +297,6 @@ static int sysfs_dentry_delete(const struct dentry *dentry)
297static int sysfs_dentry_revalidate(struct dentry *dentry, unsigned int flags) 297static int sysfs_dentry_revalidate(struct dentry *dentry, unsigned int flags)
298{ 298{
299 struct sysfs_dirent *sd; 299 struct sysfs_dirent *sd;
300 int is_dir;
301 int type; 300 int type;
302 301
303 if (flags & LOOKUP_RCU) 302 if (flags & LOOKUP_RCU)
@@ -341,18 +340,15 @@ out_bad:
341 * is performed at its new name the dentry will be readded 340 * is performed at its new name the dentry will be readded
342 * to the dcache hashes. 341 * to the dcache hashes.
343 */ 342 */
344 is_dir = (sysfs_type(sd) == SYSFS_DIR);
345 mutex_unlock(&sysfs_mutex); 343 mutex_unlock(&sysfs_mutex);
346 if (is_dir) { 344
347 /* If we have submounts we must allow the vfs caches 345 /* If we have submounts we must allow the vfs caches
348 * to lie about the state of the filesystem to prevent 346 * to lie about the state of the filesystem to prevent
349 * leaks and other nasty things. 347 * leaks and other nasty things.
350 */ 348 */
351 if (have_submounts(dentry)) 349 if (check_submounts_and_drop(dentry) != 0)
352 goto out_valid; 350 goto out_valid;
353 shrink_dcache_parent(dentry); 351
354 }
355 d_drop(dentry);
356 return 0; 352 return 0;
357} 353}
358 354