Commit 86b9170f authored by rbruno@gsd.inesc-id.pt's avatar rbruno@gsd.inesc-id.pt Committed by Pavel Emelyanov

page-read: Support reading by chunks

This is needed for the case when we get data from image-cache/proxy socket.
Signed-off-by: 's avatarRodrigo Bruno <rbruno@gsd.inesc-id.pt>
Signed-off-by: 's avatarKaterina Koukiou <k.koukiou@gmail.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
parent b43f3f54
...@@ -249,6 +249,7 @@ static int read_local_page(struct page_read *pr, unsigned long vaddr, ...@@ -249,6 +249,7 @@ static int read_local_page(struct page_read *pr, unsigned long vaddr,
{ {
int fd = img_raw_fd(pr->pi); int fd = img_raw_fd(pr->pi);
int ret; int ret;
size_t curr = 0;
/* /*
* Flush any pending async requests if any not to break the * Flush any pending async requests if any not to break the
...@@ -258,11 +259,16 @@ static int read_local_page(struct page_read *pr, unsigned long vaddr, ...@@ -258,11 +259,16 @@ static int read_local_page(struct page_read *pr, unsigned long vaddr,
return -1; return -1;
pr_debug("\tpr%u Read page from self %lx/%"PRIx64"\n", pr->id, pr->cvaddr, pr->pi_off); pr_debug("\tpr%u Read page from self %lx/%"PRIx64"\n", pr->id, pr->cvaddr, pr->pi_off);
ret = pread(fd, buf, len, pr->pi_off); while (1) {
if (ret != len) { ret = pread(fd, buf + curr, len - curr, pr->pi_off + curr);
if (ret < 1) {
pr_perror("Can't read mapping page %d", ret); pr_perror("Can't read mapping page %d", ret);
return -1; return -1;
} }
curr += ret;
if (curr == len)
break;
}
if (opts.auto_dedup) { if (opts.auto_dedup) {
ret = punch_hole(pr, pr->pi_off, len, false); ret = punch_hole(pr, pr->pi_off, len, false);
......
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