diff options
-rw-r--r-- | fs/nfs/direct.c | 1 | ||||
-rw-r--r-- | fs/nfs/write.c | 11 | ||||
-rw-r--r-- | include/linux/nfs_page.h | 14 |
3 files changed, 9 insertions, 17 deletions
diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c index 257d0091148b..465ea84a2874 100644 --- a/fs/nfs/direct.c +++ b/fs/nfs/direct.c | |||
@@ -657,6 +657,7 @@ static ssize_t nfs_direct_write_schedule_segment(struct nfs_pageio_descriptor *d | |||
657 | break; | 657 | break; |
658 | } | 658 | } |
659 | nfs_lock_request(req); | 659 | nfs_lock_request(req); |
660 | kref_get(&req->wb_kref); | ||
660 | req->wb_index = pos >> PAGE_SHIFT; | 661 | req->wb_index = pos >> PAGE_SHIFT; |
661 | req->wb_offset = pos & ~PAGE_MASK; | 662 | req->wb_offset = pos & ~PAGE_MASK; |
662 | if (!nfs_pageio_add_request(desc, req)) { | 663 | if (!nfs_pageio_add_request(desc, req)) { |
diff --git a/fs/nfs/write.c b/fs/nfs/write.c index 83823294ffd2..553f7ef1079b 100644 --- a/fs/nfs/write.c +++ b/fs/nfs/write.c | |||
@@ -260,10 +260,10 @@ static struct nfs_page *nfs_find_and_lock_request(struct page *page, bool nonblo | |||
260 | req = nfs_page_find_request_locked(page); | 260 | req = nfs_page_find_request_locked(page); |
261 | if (req == NULL) | 261 | if (req == NULL) |
262 | break; | 262 | break; |
263 | if (nfs_lock_request_dontget(req)) | 263 | if (nfs_lock_request(req)) |
264 | break; | 264 | break; |
265 | /* Note: If we hold the page lock, as is the case in nfs_writepage, | 265 | /* Note: If we hold the page lock, as is the case in nfs_writepage, |
266 | * then the call to nfs_lock_request_dontget() will always | 266 | * then the call to nfs_lock_request() will always |
267 | * succeed provided that someone hasn't already marked the | 267 | * succeed provided that someone hasn't already marked the |
268 | * request as dirty (in which case we don't care). | 268 | * request as dirty (in which case we don't care). |
269 | */ | 269 | */ |
@@ -406,7 +406,7 @@ static void nfs_inode_add_request(struct inode *inode, struct nfs_page *req) | |||
406 | struct nfs_inode *nfsi = NFS_I(inode); | 406 | struct nfs_inode *nfsi = NFS_I(inode); |
407 | 407 | ||
408 | /* Lock the request! */ | 408 | /* Lock the request! */ |
409 | nfs_lock_request_dontget(req); | 409 | nfs_lock_request(req); |
410 | 410 | ||
411 | spin_lock(&inode->i_lock); | 411 | spin_lock(&inode->i_lock); |
412 | if (!nfsi->npages && nfs_have_delegation(inode, FMODE_WRITE)) | 412 | if (!nfsi->npages && nfs_have_delegation(inode, FMODE_WRITE)) |
@@ -651,6 +651,7 @@ nfs_scan_commit_list(struct list_head *src, struct list_head *dst, | |||
651 | list_for_each_entry_safe(req, tmp, src, wb_list) { | 651 | list_for_each_entry_safe(req, tmp, src, wb_list) { |
652 | if (!nfs_lock_request(req)) | 652 | if (!nfs_lock_request(req)) |
653 | continue; | 653 | continue; |
654 | kref_get(&req->wb_kref); | ||
654 | if (cond_resched_lock(cinfo->lock)) | 655 | if (cond_resched_lock(cinfo->lock)) |
655 | list_safe_reset_next(req, tmp, wb_list); | 656 | list_safe_reset_next(req, tmp, wb_list); |
656 | nfs_request_remove_commit_list(req, cinfo); | 657 | nfs_request_remove_commit_list(req, cinfo); |
@@ -741,7 +742,7 @@ static struct nfs_page *nfs_try_to_update_request(struct inode *inode, | |||
741 | || end < req->wb_offset) | 742 | || end < req->wb_offset) |
742 | goto out_flushme; | 743 | goto out_flushme; |
743 | 744 | ||
744 | if (nfs_lock_request_dontget(req)) | 745 | if (nfs_lock_request(req)) |
745 | break; | 746 | break; |
746 | 747 | ||
747 | /* The request is locked, so wait and then retry */ | 748 | /* The request is locked, so wait and then retry */ |
@@ -1717,7 +1718,7 @@ int nfs_wb_page_cancel(struct inode *inode, struct page *page) | |||
1717 | req = nfs_page_find_request(page); | 1718 | req = nfs_page_find_request(page); |
1718 | if (req == NULL) | 1719 | if (req == NULL) |
1719 | break; | 1720 | break; |
1720 | if (nfs_lock_request_dontget(req)) { | 1721 | if (nfs_lock_request(req)) { |
1721 | nfs_clear_request_commit(req); | 1722 | nfs_clear_request_commit(req); |
1722 | nfs_inode_remove_request(req); | 1723 | nfs_inode_remove_request(req); |
1723 | /* | 1724 | /* |
diff --git a/include/linux/nfs_page.h b/include/linux/nfs_page.h index ef7504215446..263f30a5e10d 100644 --- a/include/linux/nfs_page.h +++ b/include/linux/nfs_page.h | |||
@@ -99,24 +99,14 @@ extern void nfs_unlock_request(struct nfs_page *req); | |||
99 | extern void nfs_unlock_request_dont_release(struct nfs_page *req); | 99 | extern void nfs_unlock_request_dont_release(struct nfs_page *req); |
100 | 100 | ||
101 | /* | 101 | /* |
102 | * Lock the page of an asynchronous request without getting a new reference | 102 | * Lock the page of an asynchronous request |
103 | */ | 103 | */ |
104 | static inline int | 104 | static inline int |
105 | nfs_lock_request_dontget(struct nfs_page *req) | ||
106 | { | ||
107 | return !test_and_set_bit(PG_BUSY, &req->wb_flags); | ||
108 | } | ||
109 | |||
110 | static inline int | ||
111 | nfs_lock_request(struct nfs_page *req) | 105 | nfs_lock_request(struct nfs_page *req) |
112 | { | 106 | { |
113 | if (test_and_set_bit(PG_BUSY, &req->wb_flags)) | 107 | return !test_and_set_bit(PG_BUSY, &req->wb_flags); |
114 | return 0; | ||
115 | kref_get(&req->wb_kref); | ||
116 | return 1; | ||
117 | } | 108 | } |
118 | 109 | ||
119 | |||
120 | /** | 110 | /** |
121 | * nfs_list_add_request - Insert a request into a list | 111 | * nfs_list_add_request - Insert a request into a list |
122 | * @req: request | 112 | * @req: request |