mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-29 23:53:32 +00:00
NFS: Fix up nfs_page_group_covers_page()
Fix up the test in nfs_page_group_covers_page(). The simplest implementation is to check that we have a set of intersecting or contiguous subrequests that connect page offset 0 to nfs_page_length(req->wb_page). Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
This commit is contained in:
parent
1344b7ea17
commit
7e8a30f8b4
1 changed files with 6 additions and 12 deletions
|
@ -243,9 +243,6 @@ nfs_page_group_search_locked(struct nfs_page *head, unsigned int page_offset)
|
||||||
{
|
{
|
||||||
struct nfs_page *req;
|
struct nfs_page *req;
|
||||||
|
|
||||||
WARN_ON_ONCE(head != head->wb_head);
|
|
||||||
WARN_ON_ONCE(!test_bit(PG_HEADLOCK, &head->wb_head->wb_flags));
|
|
||||||
|
|
||||||
req = head;
|
req = head;
|
||||||
do {
|
do {
|
||||||
if (page_offset >= req->wb_pgbase &&
|
if (page_offset >= req->wb_pgbase &&
|
||||||
|
@ -273,18 +270,15 @@ static bool nfs_page_group_covers_page(struct nfs_page *req)
|
||||||
|
|
||||||
nfs_page_group_lock(req);
|
nfs_page_group_lock(req);
|
||||||
|
|
||||||
do {
|
for (;;) {
|
||||||
tmp = nfs_page_group_search_locked(req->wb_head, pos);
|
tmp = nfs_page_group_search_locked(req->wb_head, pos);
|
||||||
if (tmp) {
|
if (!tmp)
|
||||||
/* no way this should happen */
|
break;
|
||||||
WARN_ON_ONCE(tmp->wb_pgbase != pos);
|
pos = tmp->wb_pgbase + tmp->wb_bytes;
|
||||||
pos += tmp->wb_bytes - (pos - tmp->wb_pgbase);
|
}
|
||||||
}
|
|
||||||
} while (tmp && pos < len);
|
|
||||||
|
|
||||||
nfs_page_group_unlock(req);
|
nfs_page_group_unlock(req);
|
||||||
WARN_ON_ONCE(pos > len);
|
return pos >= len;
|
||||||
return pos == len;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We can set the PG_uptodate flag if we see that a write request
|
/* We can set the PG_uptodate flag if we see that a write request
|
||||||
|
|
Loading…
Reference in a new issue