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: Tikhomirov Pavel <snorcht@gmail.com>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
This commit is contained in:
Tikhomirov Pavel 2014-01-24 15:50:24 +04:00 committed by Pavel Emelyanov
parent 3b7cc1e45e
commit c3c0acfe76
2 changed files with 13 additions and 13 deletions

View file

@ -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)

View file

@ -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;