Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3e217045 authored by Weston Andros Adamson's avatar Weston Andros Adamson Committed by Trond Myklebust
Browse files

nfs: handle multiple reqs in nfs_wb_page_cancel



Use nfs_lock_and_join_requests to merge all subrequests into the head request -
this cancels and dereferences all subrequests.

Signed-off-by: default avatarWeston Andros Adamson <dros@primarydata.com>
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@primarydata.com>
parent d4581383
Loading
Loading
Loading
Loading
+21 −20
Original line number Diff line number Diff line
@@ -1799,13 +1799,19 @@ int nfs_wb_page_cancel(struct inode *inode, struct page *page)
	struct nfs_page *req;
	int ret = 0;

	for (;;) {
	wait_on_page_writeback(page);
		req = nfs_page_find_head_request(page);
		if (req == NULL)
			break;
		if (nfs_lock_request(req)) {
			nfs_clear_request_commit(req);

	/* blocking call to cancel all requests and join to a single (head)
	 * request */
	req = nfs_lock_and_join_requests(page, false);

	if (IS_ERR(req)) {
		ret = PTR_ERR(req);
	} else if (req) {
		/* all requests from this page have been cancelled by
		 * nfs_lock_and_join_requests, so just remove the head
		 * request from the inode / page_private pointer and
		 * release it */
		nfs_inode_remove_request(req);
		/*
		 * In case nfs_inode_remove_request has marked the
@@ -1813,13 +1819,8 @@ int nfs_wb_page_cancel(struct inode *inode, struct page *page)
		 */
		cancel_dirty_page(page, PAGE_CACHE_SIZE);
		nfs_unlock_and_release_request(req);
			break;
		}
		ret = nfs_wait_on_request(req);
		nfs_release_request(req);
		if (ret < 0)
			break;
	}

	return ret;
}