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

Commit 309a1d65 authored by Weston Andros Adamson's avatar Weston Andros Adamson Committed by Tom Haynes
Browse files

nfs: handle overlapping reqs in lock_and_join



This is needed for mirrored DS support, where multuple requests
cover the same range.

Signed-off-by: default avatarWeston Andros Adamson <dros@primarydata.com>
parent 180bb5ec
Loading
Loading
Loading
Loading
+11 −6
Original line number Diff line number Diff line
@@ -473,13 +473,18 @@ nfs_lock_and_join_requests(struct page *page, bool nonblock)
	do {
		/*
		 * Subrequests are always contiguous, non overlapping
		 * and in order. If not, it's a programming error.
		 * and in order - but may be repeated (mirrored writes).
		 */
		WARN_ON_ONCE(subreq->wb_offset !=
		     (head->wb_offset + total_bytes));

		if (subreq->wb_offset == (head->wb_offset + total_bytes)) {
			/* keep track of how many bytes this group covers */
			total_bytes += subreq->wb_bytes;
		} else if (WARN_ON_ONCE(subreq->wb_offset < head->wb_offset ||
			    ((subreq->wb_offset + subreq->wb_bytes) >
			     (head->wb_offset + total_bytes)))) {
			nfs_page_group_unlock(head);
			spin_unlock(&inode->i_lock);
			return ERR_PTR(-EIO);
		}

		if (!nfs_lock_request(subreq)) {
			/* releases page group bit lock and