Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/checkpoint-restore/criu.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrbruno@gsd.inesc-id.pt <rbruno@gsd.inesc-id.pt>2017-02-11 06:34:43 +0300
committerPavel Emelyanov <xemul@virtuozzo.com>2017-03-06 11:44:04 +0300
commit86b9170ff3cd5d96ef2b0e9314009d7a30e6eb7d (patch)
treea62e361622bbc2eaac0f45b36c8933c74c25185b
parentb43f3f54be914ee2ab1b94a7a6e8961d072ab19e (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.c14
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) {