aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/nfs/pagelist.c4
-rw-r--r--fs/nfs/write.c8
2 files changed, 9 insertions, 3 deletions
diff --git a/fs/nfs/pagelist.c b/fs/nfs/pagelist.c
index b6ee3a6ee96d..7368b2130a41 100644
--- a/fs/nfs/pagelist.c
+++ b/fs/nfs/pagelist.c
@@ -251,8 +251,10 @@ nfs_page_group_init(struct nfs_page *req, struct nfs_page *prev)
251 /* grab extra ref if head request has extra ref from 251 /* grab extra ref if head request has extra ref from
252 * the write/commit path to handle handoff between write 252 * the write/commit path to handle handoff between write
253 * and commit lists */ 253 * and commit lists */
254 if (test_bit(PG_INODE_REF, &prev->wb_head->wb_flags)) 254 if (test_bit(PG_INODE_REF, &prev->wb_head->wb_flags)) {
255 set_bit(PG_INODE_REF, &req->wb_flags);
255 kref_get(&req->wb_kref); 256 kref_get(&req->wb_kref);
257 }
256 } 258 }
257} 259}
258 260
diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index 98ff061ccaf3..8e5745a4deff 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -448,7 +448,9 @@ static void nfs_inode_add_request(struct inode *inode, struct nfs_page *req)
448 set_page_private(req->wb_page, (unsigned long)req); 448 set_page_private(req->wb_page, (unsigned long)req);
449 } 449 }
450 nfsi->npages++; 450 nfsi->npages++;
451 set_bit(PG_INODE_REF, &req->wb_flags); 451 /* this a head request for a page group - mark it as having an
452 * extra reference so sub groups can follow suit */
453 WARN_ON(test_and_set_bit(PG_INODE_REF, &req->wb_flags));
452 kref_get(&req->wb_kref); 454 kref_get(&req->wb_kref);
453 spin_unlock(&inode->i_lock); 455 spin_unlock(&inode->i_lock);
454} 456}
@@ -474,7 +476,9 @@ static void nfs_inode_remove_request(struct nfs_page *req)
474 nfsi->npages--; 476 nfsi->npages--;
475 spin_unlock(&inode->i_lock); 477 spin_unlock(&inode->i_lock);
476 } 478 }
477 nfs_release_request(req); 479
480 if (test_and_clear_bit(PG_INODE_REF, &req->wb_flags))
481 nfs_release_request(req);
478} 482}
479 483
480static void 484static void