diff options
author | Miklos Szeredi <mszeredi@suse.cz> | 2013-09-05 05:44:41 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2013-09-05 16:23:53 -0400 |
commit | 6497d160f6abf8d1082ff1a4efd841118cb1fddd (patch) | |
tree | fc03ca8342fbd7b441198028b9c29cff83533db3 /fs/sysfs/dir.c | |
parent | 13caa9fb5b4ce040379523037a0ce4ef867ee0c0 (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.c | 20 |
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) | |||
297 | static int sysfs_dentry_revalidate(struct dentry *dentry, unsigned int flags) | 297 | static 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 | ||