aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs/inode.c
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 /fs/nfs/inode.c
parentnfs: introduce mount option '-olocal_lock' to make locks local (diff)
downloadlinux-dev-ef84303ebc77a9041265faaccd56b7fcef151077.tar.xz
linux-dev-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>
Diffstat (limited to 'fs/nfs/inode.c')
-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 2ff814272dcf..702ed096e790 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);