diff options
author | rbruno@gsd.inesc-id.pt <rbruno@gsd.inesc-id.pt> | 2017-02-11 06:34:43 +0300 |
---|---|---|
committer | Pavel Emelyanov <xemul@virtuozzo.com> | 2017-03-06 11:44:04 +0300 |
commit | 86b9170ff3cd5d96ef2b0e9314009d7a30e6eb7d (patch) | |
tree | a62e361622bbc2eaac0f45b36c8933c74c25185b | |
parent | b43f3f54be914ee2ab1b94a7a6e8961d072ab19e (diff) |
page-read: Support reading by chunks
This is needed for the case when we get data from image-cache/proxy socket.
Signed-off-by: Rodrigo Bruno <rbruno@gsd.inesc-id.pt>
Signed-off-by: Katerina Koukiou <k.koukiou@gmail.com>
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
-rw-r--r-- | criu/pagemap.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/criu/pagemap.c b/criu/pagemap.c index 5c672dc08..991d92e81 100644 --- a/criu/pagemap.c +++ b/criu/pagemap.c @@ -249,6 +249,7 @@ static int read_local_page(struct page_read *pr, unsigned long vaddr, { int fd = img_raw_fd(pr->pi); int ret; + size_t curr = 0; /* * Flush any pending async requests if any not to break the @@ -258,10 +259,15 @@ static int read_local_page(struct page_read *pr, unsigned long vaddr, return -1; 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); - if (ret != len) { - pr_perror("Can't read mapping page %d", ret); - return -1; + while (1) { + ret = pread(fd, buf + curr, len - curr, pr->pi_off + curr); + if (ret < 1) { + pr_perror("Can't read mapping page %d", ret); + return -1; + } + curr += ret; + if (curr == len) + break; } if (opts.auto_dedup) { |