diff options
author | Weston Andros Adamson <dros@primarydata.com> | 2014-07-11 10:20:45 -0400 |
---|---|---|
committer | Trond Myklebust <trond.myklebust@primarydata.com> | 2014-07-12 16:51:41 -0400 |
commit | 17089a29a25a3bfe8d14520cd866b7d635ffe5ba (patch) | |
tree | 9f95e42cf5a06bd36089d7f81f47d23ba2b6530d /fs | |
parent | 74adf83f5d7720925499b4938f930591f947b660 (diff) |
nfs: mark nfs_page reqs with flag for extra ref
Change the use of PG_INODE_REF - set it when taking extra reference on
subrequests and take care to only release once for each request.
Signed-off-by: Weston Andros Adamson <dros@primarydata.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Diffstat (limited to 'fs')
-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 |