diff options
| -rw-r--r-- | fs/nfs/pagelist.c | 4 | ||||
| -rw-r--r-- | fs/nfs/write.c | 8 |
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 | ||
| 480 | static void | 484 | static void |
