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

Commit 17089a29 authored by Weston Andros Adamson's avatar Weston Andros Adamson Committed by Trond Myklebust
Browse files

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: default avatarWeston Andros Adamson <dros@primarydata.com>
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@primarydata.com>
parent 74adf83f
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -251,10 +251,12 @@ nfs_page_group_init(struct nfs_page *req, struct nfs_page *prev)
		/* grab extra ref if head request has extra ref from
		 * the write/commit path to handle handoff between write
		 * and commit lists */
		if (test_bit(PG_INODE_REF, &prev->wb_head->wb_flags))
		if (test_bit(PG_INODE_REF, &prev->wb_head->wb_flags)) {
			set_bit(PG_INODE_REF, &req->wb_flags);
			kref_get(&req->wb_kref);
		}
	}
}

/*
 * nfs_page_group_destroy - sync the destruction of page groups
+6 −2
Original line number Diff line number Diff line
@@ -448,7 +448,9 @@ static void nfs_inode_add_request(struct inode *inode, struct nfs_page *req)
		set_page_private(req->wb_page, (unsigned long)req);
	}
	nfsi->npages++;
	set_bit(PG_INODE_REF, &req->wb_flags);
	/* this a head request for a page group - mark it as having an
	 * extra reference so sub groups can follow suit */
	WARN_ON(test_and_set_bit(PG_INODE_REF, &req->wb_flags));
	kref_get(&req->wb_kref);
	spin_unlock(&inode->i_lock);
}
@@ -474,6 +476,8 @@ static void nfs_inode_remove_request(struct nfs_page *req)
		nfsi->npages--;
		spin_unlock(&inode->i_lock);
	}

	if (test_and_clear_bit(PG_INODE_REF, &req->wb_flags))
		nfs_release_request(req);
}