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

v3 page-read: add print error in case of bad or corrupted image

1. add it instead of BUG_ON
we should print error if warn is assigned to true
2. correct use of read_pagemap_page_from_parent, provide warn = true
Signed-off-by: 's avatarTikhomirov Pavel <snorcht@gmail.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 164bc4bd
...@@ -83,7 +83,7 @@ static void skip_pagemap_pages(struct page_read *pr, unsigned long len) ...@@ -83,7 +83,7 @@ static void skip_pagemap_pages(struct page_read *pr, unsigned long len)
pr->cvaddr += len; pr->cvaddr += len;
} }
static int read_pagemap_page_from_parent(struct page_read *pr, unsigned long vaddr, void *buf) static int read_pagemap_page_from_parent(struct page_read *pr, unsigned long vaddr, void *buf, bool warn)
{ {
int ret; int ret;
struct iovec iov; struct iovec iov;
...@@ -96,7 +96,12 @@ static int read_pagemap_page_from_parent(struct page_read *pr, unsigned long vad ...@@ -96,7 +96,12 @@ static int read_pagemap_page_from_parent(struct page_read *pr, unsigned long vad
while (1) { while (1) {
unsigned long iov_end; unsigned long iov_end;
BUG_ON(vaddr < pr->cvaddr); if (vaddr < pr->cvaddr) {
if (warn)
pr_err("Missing %lu in parent pagemap, current iov: base=%lu,len=%lu\n",
vaddr, (unsigned long)iov.iov_base, iov.iov_len);
return -1;
}
iov_end = (unsigned long)iov.iov_base + iov.iov_len; iov_end = (unsigned long)iov.iov_base + iov.iov_len;
if (iov_end <= vaddr) { if (iov_end <= vaddr) {
...@@ -121,7 +126,7 @@ static int read_pagemap_page(struct page_read *pr, unsigned long vaddr, void *bu ...@@ -121,7 +126,7 @@ static int read_pagemap_page(struct page_read *pr, unsigned long vaddr, void *bu
if (pr->pe->in_parent) { if (pr->pe->in_parent) {
pr_debug("\tpr%u Read page %lx from parent\n", pr->id, vaddr); pr_debug("\tpr%u Read page %lx from parent\n", pr->id, vaddr);
ret = read_pagemap_page_from_parent(pr->parent, vaddr, buf); ret = read_pagemap_page_from_parent(pr->parent, vaddr, buf, true);
if (ret == -1) if (ret == -1)
return ret; return ret;
} else { } else {
......
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