aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorMiklos Szeredi <mszeredi@suse.cz>2013-09-05 05:44:40 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2013-09-05 16:23:52 -0400
commit13caa9fb5b4ce040379523037a0ce4ef867ee0c0 (patch)
tree9a11420d61e35fa4f1dcc583e7629fb404369e49 /fs
parent1191a2bdf012147c33e5fa95255974a3f7bf6e2f (diff)
nfs: 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> CC: Trond Myklebust <Trond.Myklebust@netapp.com> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs')
-rw-r--r--fs/nfs/dir.c9
1 files changed, 4 insertions, 5 deletions
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
index e474ca2b2bfe..7468735d299e 100644
--- a/fs/nfs/dir.c
+++ b/fs/nfs/dir.c
@@ -1135,14 +1135,13 @@ out_zap_parent:
1135 if (inode && S_ISDIR(inode->i_mode)) { 1135 if (inode && S_ISDIR(inode->i_mode)) {
1136 /* Purge readdir caches. */ 1136 /* Purge readdir caches. */
1137 nfs_zap_caches(inode); 1137 nfs_zap_caches(inode);
1138 /* If we have submounts, don't unhash ! */
1139 if (have_submounts(dentry))
1140 goto out_valid;
1141 if (dentry->d_flags & DCACHE_DISCONNECTED) 1138 if (dentry->d_flags & DCACHE_DISCONNECTED)
1142 goto out_valid; 1139 goto out_valid;
1143 shrink_dcache_parent(dentry);
1144 } 1140 }
1145 d_drop(dentry); 1141 /* If we have submounts, don't unhash ! */
1142 if (check_submounts_and_drop(dentry) != 0)
1143 goto out_valid;
1144
1146 dput(parent); 1145 dput(parent);
1147 dfprintk(LOOKUPCACHE, "NFS: %s(%s/%s) is invalid\n", 1146 dfprintk(LOOKUPCACHE, "NFS: %s(%s/%s) is invalid\n",
1148 __func__, dentry->d_parent->d_name.name, 1147 __func__, dentry->d_parent->d_name.name,