summaryrefslogtreecommitdiffstats
path: root/fs/nfs/pnfs.c
diff options
context:
space:
mode:
authorTrond Myklebust <Trond.Myklebust@netapp.com>2012-10-03 00:41:05 +0200
committerTrond Myklebust <Trond.Myklebust@netapp.com>2012-10-03 00:41:05 +0200
commit251ec410c495cb93c7ae2cb4beda29205d9bd35f (patch)
treed9f971d9ca4f00ed19a6edb1ea9cd563c51ffe65 /fs/nfs/pnfs.c
parentNFSv4: don't put ACCESS in OPEN compound if O_EXCL (diff)
downloadlinux-251ec410c495cb93c7ae2cb4beda29205d9bd35f.tar.xz
linux-251ec410c495cb93c7ae2cb4beda29205d9bd35f.zip
NFSv4.1: Fix another refcount issue in pnfs_find_alloc_layout
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs/pnfs.c')
-rw-r--r--fs/nfs/pnfs.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index d737557747b9..fe9968a62cad 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -907,18 +907,19 @@ pnfs_find_alloc_layout(struct inode *ino,
dprintk("%s Begin ino=%p layout=%p\n", __func__, ino, nfsi->layout);
- if (nfsi->layout) {
- pnfs_get_layout_hdr(nfsi->layout);
- return nfsi->layout;
- }
+ if (nfsi->layout != NULL)
+ goto out_existing;
spin_unlock(&ino->i_lock);
new = alloc_init_layout_hdr(ino, ctx, gfp_flags);
spin_lock(&ino->i_lock);
- if (likely(nfsi->layout == NULL)) /* Won the race? */
+ if (likely(nfsi->layout == NULL)) { /* Won the race? */
nfsi->layout = new;
- else
- pnfs_free_layout_hdr(new);
+ return new;
+ }
+ pnfs_free_layout_hdr(new);
+out_existing:
+ pnfs_get_layout_hdr(nfsi->layout);
return nfsi->layout;
}