Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 333140
b: refs/heads/master
c: 57036a3
h: refs/heads/master
v: v3
  • Loading branch information
Trond Myklebust authored and Trond Myklebust committed Sep 28, 2012
1 parent 9b8659f commit 0607c86
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 13 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: bb346f63976823c2959b0c5917928f12cbf96e4a
refs/heads/master: 57036a377600ec0900b13f29814aa19072ad3e52
27 changes: 15 additions & 12 deletions trunk/fs/nfs/pnfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -319,28 +319,30 @@ static void free_lseg(struct pnfs_layout_segment *lseg)
struct inode *ino = lseg->pls_layout->plh_inode;

NFS_SERVER(ino)->pnfs_curr_ld->free_lseg(lseg);
/* Matched by pnfs_get_layout_hdr in pnfs_insert_layout */
/* Matched by pnfs_get_layout_hdr in pnfs_layout_insert_lseg */
pnfs_put_layout_hdr(NFS_I(ino)->layout);
}

static void
pnfs_put_lseg_common(struct pnfs_layout_segment *lseg)
pnfs_layout_remove_lseg(struct pnfs_layout_hdr *lo,
struct pnfs_layout_segment *lseg)
{
struct inode *inode = lseg->pls_layout->plh_inode;
struct inode *inode = lo->plh_inode;

WARN_ON(test_bit(NFS_LSEG_VALID, &lseg->pls_flags));
list_del_init(&lseg->pls_list);
if (list_empty(&lseg->pls_layout->plh_segs)) {
set_bit(NFS_LAYOUT_DESTROYED, &lseg->pls_layout->plh_flags);
if (list_empty(&lo->plh_segs)) {
set_bit(NFS_LAYOUT_DESTROYED, &lo->plh_flags);
/* Matched by initial refcount set in alloc_init_layout_hdr */
pnfs_put_layout_hdr_locked(lseg->pls_layout);
pnfs_put_layout_hdr_locked(lo);
}
rpc_wake_up(&NFS_SERVER(inode)->roc_rpcwaitq);
}

void
pnfs_put_lseg(struct pnfs_layout_segment *lseg)
{
struct pnfs_layout_hdr *lo;
struct inode *inode;

if (!lseg)
Expand All @@ -349,13 +351,14 @@ pnfs_put_lseg(struct pnfs_layout_segment *lseg)
dprintk("%s: lseg %p ref %d valid %d\n", __func__, lseg,
atomic_read(&lseg->pls_refcount),
test_bit(NFS_LSEG_VALID, &lseg->pls_flags));
inode = lseg->pls_layout->plh_inode;
lo = lseg->pls_layout;
inode = lo->plh_inode;
if (atomic_dec_and_lock(&lseg->pls_refcount, &inode->i_lock)) {
LIST_HEAD(free_me);

pnfs_put_lseg_common(lseg);
list_add(&lseg->pls_list, &free_me);
pnfs_layout_remove_lseg(lo, lseg);
spin_unlock(&inode->i_lock);
list_add(&lseg->pls_list, &free_me);
pnfs_free_lseg_list(&free_me);
}
}
Expand Down Expand Up @@ -443,7 +446,7 @@ static int mark_lseg_invalid(struct pnfs_layout_segment *lseg,
dprintk("%s: lseg %p ref %d\n", __func__, lseg,
atomic_read(&lseg->pls_refcount));
if (atomic_dec_and_test(&lseg->pls_refcount)) {
pnfs_put_lseg_common(lseg);
pnfs_layout_remove_lseg(lseg->pls_layout, lseg);
list_add(&lseg->pls_list, tmp_list);
rv = 1;
}
Expand Down Expand Up @@ -861,7 +864,7 @@ cmp_layout(struct pnfs_layout_range *l1,
}

static void
pnfs_insert_layout(struct pnfs_layout_hdr *lo,
pnfs_layout_insert_lseg(struct pnfs_layout_hdr *lo,
struct pnfs_layout_segment *lseg)
{
struct pnfs_layout_segment *lp;
Expand Down Expand Up @@ -1211,7 +1214,7 @@ pnfs_layout_process(struct nfs4_layoutget *lgp)
init_lseg(lo, lseg);
lseg->pls_range = res->range;
pnfs_get_lseg(lseg);
pnfs_insert_layout(lo, lseg);
pnfs_layout_insert_lseg(lo, lseg);

if (res->return_on_close) {
set_bit(NFS_LSEG_ROC, &lseg->pls_flags);
Expand Down

0 comments on commit 0607c86

Please sign in to comment.