diff options
Diffstat (limited to 'fs/nfs/write.c')
-rw-r--r-- | fs/nfs/write.c | 8 |
1 files changed, 6 insertions, 2 deletions
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 | ||
480 | static void | 484 | static void |