NFSv4: Ensure that we wait for the CLOSE request to complete
Otherwise, we do end up breaking close-to-open semantics. We also end up breaking some of the silly-rename tests in Connectathon on some setups. Please refer to the bug-report at http://bugzilla.linux-nfs.org/show_bug.cgi?id=150 Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
@@ -514,7 +514,7 @@ struct nfs_open_context *get_nfs_open_context(struct nfs_open_context *ctx)
|
||||
return ctx;
|
||||
}
|
||||
|
||||
void put_nfs_open_context(struct nfs_open_context *ctx)
|
||||
static void __put_nfs_open_context(struct nfs_open_context *ctx, int wait)
|
||||
{
|
||||
struct inode *inode = ctx->path.dentry->d_inode;
|
||||
|
||||
@@ -522,8 +522,12 @@ void put_nfs_open_context(struct nfs_open_context *ctx)
|
||||
return;
|
||||
list_del(&ctx->list);
|
||||
spin_unlock(&inode->i_lock);
|
||||
if (ctx->state != NULL)
|
||||
nfs4_close_state(&ctx->path, ctx->state, ctx->mode);
|
||||
if (ctx->state != NULL) {
|
||||
if (wait)
|
||||
nfs4_close_sync(&ctx->path, ctx->state, ctx->mode);
|
||||
else
|
||||
nfs4_close_state(&ctx->path, ctx->state, ctx->mode);
|
||||
}
|
||||
if (ctx->cred != NULL)
|
||||
put_rpccred(ctx->cred);
|
||||
dput(ctx->path.dentry);
|
||||
@@ -531,6 +535,16 @@ void put_nfs_open_context(struct nfs_open_context *ctx)
|
||||
kfree(ctx);
|
||||
}
|
||||
|
||||
void put_nfs_open_context(struct nfs_open_context *ctx)
|
||||
{
|
||||
__put_nfs_open_context(ctx, 0);
|
||||
}
|
||||
|
||||
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
|
||||
@@ -577,7 +591,7 @@ static 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);
|
||||
put_nfs_open_context_sync(ctx);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user