Commit c3c0acfe authored by Tikhomirov Pavel's avatar Tikhomirov Pavel Committed by Pavel Emelyanov

deduplication: make seek_pagemap_page properly handle eof

because eof in restore means that we don't have "must have" data, so
it mean error exit, but in dedup, it's ok not to have data we seek, so
we continue returning normally

also it's used that if off < pr-cvaddr then no eof happened and if eof
happened then off >= pr-cvaddr(then return of seek_pagemap_page is 0)
Signed-off-by: 's avatarTikhomirov Pavel <snorcht@gmail.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 3b7cc1e4
......@@ -114,14 +114,14 @@ int dedup_one_iovec(struct page_read *pr, struct iovec *iov)
struct iovec piov;
unsigned long piov_end;
ret = seek_pagemap_page(pr, off, false);
if (ret == -1) {
if (off < pr->cvaddr) {
if (pr->cvaddr < iov_end)
off = pr->cvaddr;
else
return 0;
} else
return ret;
if (ret == -1)
return -1;
if (ret == 0) {
if (off < pr->cvaddr && pr->cvaddr < iov_end)
off = pr->cvaddr;
else
return 0;
}
if (!pr->pe)
......
......@@ -105,7 +105,7 @@ int seek_pagemap_page(struct page_read *pr, unsigned long vaddr, bool warn)
if (warn)
pr_err("Missing %lu in parent pagemap, current iov: base=%lx,len=%zu\n",
vaddr, (unsigned long)iov.iov_base, iov.iov_len);
return -1;
return 0;
}
iov_end = (unsigned long)iov.iov_base + iov.iov_len;
......@@ -115,13 +115,13 @@ int seek_pagemap_page(struct page_read *pr, unsigned long vaddr, bool warn)
new_pagemap:
ret = get_pagemap(pr, &iov);
if (ret <= 0)
return -1;
return ret;
continue;
}
skip_pagemap_pages(pr, vaddr - pr->cvaddr);
return 0;
return 1;
}
}
......@@ -132,8 +132,8 @@ static int read_pagemap_page(struct page_read *pr, unsigned long vaddr, void *bu
if (pr->pe->in_parent) {
pr_debug("\tpr%u Read page %lx from parent\n", pr->id, vaddr);
ret = seek_pagemap_page(pr->parent, vaddr, true);
if (ret == -1)
return ret;
if (ret <= 0)
return -1;
ret = read_pagemap_page(pr->parent, vaddr, buf);
if (ret == -1)
return ret;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment