aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs/unlink.c
diff options
context:
space:
mode:
authorTrond Myklebust <Trond.Myklebust@netapp.com>2013-08-30 12:24:25 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2013-09-03 15:26:29 -0400
commitba6c05928dcafc7e0a0c8e4ee6a293ba47190fd4 (patch)
tree3b32adfdc8fb978f1933d43591e36ed0b14897d6 /fs/nfs/unlink.c
parenta5250def7c4549a6a1cd8257900bef9c12ffc2fc (diff)
NFS: Ensure that rmdir() waits for sillyrenames to complete
If an NFS client does mkdir("dir"); fd = open("dir/file"); unlink("dir/file"); close(fd); rmdir("dir"); then the asynchronous nature of the sillyrename operation means that we can end up getting EBUSY for the rmdir() in the above test. Fix that by ensuring that we wait for any in-progress sillyrenames before sending the rmdir() to the server. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs/unlink.c')
-rw-r--r--fs/nfs/unlink.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/fs/nfs/unlink.c b/fs/nfs/unlink.c
index 2c1485d18419..bb939edd4c99 100644
--- a/fs/nfs/unlink.c
+++ b/fs/nfs/unlink.c
@@ -207,6 +207,13 @@ out_free:
207 return ret; 207 return ret;
208} 208}
209 209
210void nfs_wait_on_sillyrename(struct dentry *dentry)
211{
212 struct nfs_inode *nfsi = NFS_I(dentry->d_inode);
213
214 wait_event(nfsi->waitqueue, atomic_read(&nfsi->silly_count) <= 1);
215}
216
210void nfs_block_sillyrename(struct dentry *dentry) 217void nfs_block_sillyrename(struct dentry *dentry)
211{ 218{
212 struct nfs_inode *nfsi = NFS_I(dentry->d_inode); 219 struct nfs_inode *nfsi = NFS_I(dentry->d_inode);