mirror of
https://github.com/checkpoint-restore/criu.git
synced 2026-07-25 19:14:04 +00:00
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:
parent
3b7cc1e45e
commit
c3c0acfe76
2 changed files with 13 additions and 13 deletions
16
cr-dedup.c
16
cr-dedup.c
|
|
@ -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)
|
||||
|
|
|
|||
10
page-read.c
10
page-read.c
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue