Revert "NFS: Make close(2) asynchronous when closing NFS O_DIRECT files"
authorTrond Myklebust <trond.myklebust@primarydata.com>
Fri, 4 Sep 2015 19:17:53 +0000 (15:17 -0400)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Fri, 4 Sep 2015 20:54:29 +0000 (16:54 -0400)
This reverts commit f895c53f8ace3c3e49ebf9def90e63fc6d46d2bf.

This commit causes a NFSv4 regression in that close()+unlink() can end
up failing. The reason is that we no longer have a guarantee that the
CLOSE has completed on the server, meaning that the subsequent call to
REMOVE may fail with NFS4ERR_FILE_OPEN if the server implements Windows
unlink() semantics.

Reported-by: <Olga Kornievskaia <aglo@umich.edu>
Cc: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
fs/nfs/inode.c

index 6307d8de103d037568dbfa488239aa8b34f96f7f..326d9e10d83370f56061220c51e72a42de0595b2 100644 (file)
@@ -853,6 +853,11 @@ void put_nfs_open_context(struct nfs_open_context *ctx)
 }
 EXPORT_SYMBOL_GPL(put_nfs_open_context);
 
+static void put_nfs_open_context_sync(struct nfs_open_context *ctx)
+{
+       __put_nfs_open_context(ctx, 1);
+}
+
 /*
  * Ensure that mmap has a recent RPC credential for use when writing out
  * shared pages
@@ -908,7 +913,7 @@ void nfs_file_clear_open_context(struct file *filp)
                spin_lock(&inode->i_lock);
                list_move_tail(&ctx->list, &NFS_I(inode)->open_files);
                spin_unlock(&inode->i_lock);
-               __put_nfs_open_context(ctx, filp->f_flags & O_DIRECT ? 0 : 1);
+               put_nfs_open_context_sync(ctx);
        }
 }