aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenny Halevy <bhalevy@panasas.com>2010-09-23 12:22:09 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2010-09-23 12:22:09 -0400
commitef84303ebc77a9041265faaccd56b7fcef151077 (patch)
tree971755468ab947358ee3d1348a6aca2df08bcc49
parent5eebde23223aeb0ad2d9e3be6590ff8bbfab0fc2 (diff)
downloadmrst-s0i3-test-ef84303ebc77a9041265faaccd56b7fcef151077.tar.gz
mrst-s0i3-test-ef84303ebc77a9041265faaccd56b7fcef151077.tar.xz
mrst-s0i3-test-ef84303ebc77a9041265faaccd56b7fcef151077.zip
NFS: handle inode==NULL in __put_nfs_open_context
inode may be NULL when put_nfs_open_context is called from nfs_atomic_lookup before d_add_unique(dentry, inode) Signed-off-by: Benny Halevy <bhalevy@panasas.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
-rw-r--r--fs/nfs/inode.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
index 2ff814272dc..702ed096e79 100644
--- a/fs/nfs/inode.c
+++ b/fs/nfs/inode.c
@@ -654,11 +654,14 @@ static void __put_nfs_open_context(struct nfs_open_context *ctx, int is_sync)
{
struct inode *inode = ctx->path.dentry->d_inode;
- if (!atomic_dec_and_lock(&ctx->lock_context.count, &inode->i_lock))
+ if (inode) {
+ if (!atomic_dec_and_lock(&ctx->lock_context.count, &inode->i_lock))
+ return;
+ list_del(&ctx->list);
+ spin_unlock(&inode->i_lock);
+ NFS_PROTO(inode)->close_context(ctx, is_sync);
+ } else if (!atomic_dec_and_test(&ctx->lock_context.count))
return;
- list_del(&ctx->list);
- spin_unlock(&inode->i_lock);
- NFS_PROTO(inode)->close_context(ctx, is_sync);
if (ctx->cred != NULL)
put_rpccred(ctx->cred);
path_put(&ctx->path);