Commit 4804db00 authored by Pavel Emelyanov's avatar Pavel Emelyanov Committed by Cyrill Gorcunov

restore: Switch code to new R/W API

Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
Signed-off-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
parent 74ad4fb1
...@@ -283,7 +283,7 @@ static int collect_pipe(int pid, struct pipe_entry *e, int p_fd) ...@@ -283,7 +283,7 @@ static int collect_pipe(int pid, struct pipe_entry *e, int p_fd)
static int prepare_shmem_pid(int pid) static int prepare_shmem_pid(int pid)
{ {
int sh_fd; int sh_fd, ret = 0;
sh_fd = open_image_ro(CR_FD_SHMEM, pid); sh_fd = open_image_ro(CR_FD_SHMEM, pid);
if (sh_fd < 0) { if (sh_fd < 0) {
...@@ -295,28 +295,23 @@ static int prepare_shmem_pid(int pid) ...@@ -295,28 +295,23 @@ static int prepare_shmem_pid(int pid)
while (1) { while (1) {
struct shmem_entry e; struct shmem_entry e;
int ret;
ret = read(sh_fd, &e, sizeof(e)); ret = read_img_eof(sh_fd, &e);
if (ret == 0) if (ret <= 0)
break; break;
if (ret != sizeof(e)) { ret = collect_shmem(pid, &e);
pr_perror("%d: Can't read shmem entry\n", pid); if (ret)
return -1; break;
}
if (collect_shmem(pid, &e))
return -1;
} }
close(sh_fd); close(sh_fd);
return 0; return ret;
} }
static int prepare_pipes_pid(int pid) static int prepare_pipes_pid(int pid)
{ {
int p_fd; int p_fd, ret = 0;
p_fd = open_image_ro(CR_FD_PIPES, pid); p_fd = open_image_ro(CR_FD_PIPES, pid);
if (p_fd < 0) { if (p_fd < 0) {
...@@ -328,26 +323,21 @@ static int prepare_pipes_pid(int pid) ...@@ -328,26 +323,21 @@ static int prepare_pipes_pid(int pid)
while (1) { while (1) {
struct pipe_entry e; struct pipe_entry e;
int ret;
ret = read(p_fd, &e, sizeof(e)); ret = read_img_eof(p_fd, &e);
if (ret == 0) if (ret <= 0)
break; break;
if (ret != sizeof(e)) {
pr_perror("%d: Read pipes failed %d (expected %li)\n",
pid, ret, sizeof(e));
return -1;
}
if (collect_pipe(pid, &e, p_fd)) ret = collect_pipe(pid, &e, p_fd);
return -1; if (ret < 0)
break;
if (e.bytes) if (e.bytes)
lseek(p_fd, e.bytes, SEEK_CUR); lseek(p_fd, e.bytes, SEEK_CUR);
} }
close(p_fd); close(p_fd);
return 0; return ret;
} }
static int shmem_remap(void *old_addr, void *new_addr, unsigned long size) static int shmem_remap(void *old_addr, void *new_addr, unsigned long size)
...@@ -378,6 +368,8 @@ static int shmem_remap(void *old_addr, void *new_addr, unsigned long size) ...@@ -378,6 +368,8 @@ static int shmem_remap(void *old_addr, void *new_addr, unsigned long size)
static int prepare_shared(int ps_fd) static int prepare_shared(int ps_fd)
{ {
int ret = 0;
pr_info("Preparing info about shared resources\n"); pr_info("Preparing info about shared resources\n");
shmems = mmap(NULL, SHMEMS_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, 0, 0); shmems = mmap(NULL, SHMEMS_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, 0, 0);
...@@ -409,37 +401,37 @@ static int prepare_shared(int ps_fd) ...@@ -409,37 +401,37 @@ static int prepare_shared(int ps_fd)
struct pstree_entry e; struct pstree_entry e;
int ret; int ret;
ret = read(ps_fd, &e, sizeof(e)); ret = read_img_eof(ps_fd, &e);
if (ret == 0) if (ret <= 0)
break; break;
if (ret != sizeof(e)) { ret = prepare_shmem_pid(e.pid);
pr_perror("Can't read pstree_entry\n"); if (ret < 0)
return -1; break;
}
if (prepare_shmem_pid(e.pid))
return -1;
if (prepare_pipes_pid(e.pid)) ret = prepare_pipes_pid(e.pid);
return -1; if (ret < 0)
break;
if (prepare_fd_pid(e.pid)) ret = prepare_fd_pid(e.pid);
return -1; if (ret < 0)
break;
task_add_entry(e.pid); task_add_entry(e.pid);
lseek(ps_fd, e.nr_children * sizeof(u32) + e.nr_threads * sizeof(u32), SEEK_CUR); lseek(ps_fd, e.nr_children * sizeof(u32) + e.nr_threads * sizeof(u32), SEEK_CUR);
} }
task_entries->nr_in_progress = task_entries->nr; if (!ret) {
task_entries->nr_in_progress = task_entries->nr;
lseek(ps_fd, sizeof(u32), SEEK_SET); lseek(ps_fd, sizeof(u32), SEEK_SET);
show_saved_shmems(); show_saved_shmems();
show_saved_pipes(); show_saved_pipes();
}
return 0; return ret;
} }
static unsigned long find_shmem_id(unsigned long addr) static unsigned long find_shmem_id(unsigned long addr)
...@@ -473,7 +465,7 @@ static int save_shmem_id(struct shmem_entry *e) ...@@ -473,7 +465,7 @@ static int save_shmem_id(struct shmem_entry *e)
static int prepare_shmem(int pid) static int prepare_shmem(int pid)
{ {
int sh_fd; int sh_fd, ret = 0;
sh_fd = open_image_ro(CR_FD_SHMEM, pid); sh_fd = open_image_ro(CR_FD_SHMEM, pid);
if (sh_fd < 0) if (sh_fd < 0)
...@@ -481,22 +473,17 @@ static int prepare_shmem(int pid) ...@@ -481,22 +473,17 @@ static int prepare_shmem(int pid)
while (1) { while (1) {
struct shmem_entry e; struct shmem_entry e;
int ret;
ret = read(sh_fd, &e, sizeof(e)); ret = read_img_eof(sh_fd, &e);
if (ret == 0) if (ret <= 0)
break; break;
if (ret != sizeof(e)) {
pr_perror("%d: Can't read shmem entry\n", pid);
return -1;
}
if (save_shmem_id(&e)) if ((ret = save_shmem_id(&e)) < 0)
return -1; break;
} }
close(sh_fd); close(sh_fd);
return 0; return ret;
} }
static struct shmem_info * static struct shmem_info *
...@@ -972,12 +959,9 @@ static int prepare_sigactions(int pid) ...@@ -972,12 +959,9 @@ static int prepare_sigactions(int pid)
if (sig == SIGKILL || sig == SIGSTOP) if (sig == SIGKILL || sig == SIGSTOP)
continue; continue;
ret = read(fd_sigact, &e, sizeof(e)); ret = read_img(fd_sigact, &e);
if (ret != sizeof(e)) { if (ret < 0)
pr_err("%d: Bad sigaction entry: %d (%m)\n", pid, ret); break;
ret = -1;
goto err;
}
ASSIGN_TYPED(act.rt_sa_handler, e.sigaction); ASSIGN_TYPED(act.rt_sa_handler, e.sigaction);
ASSIGN_TYPED(act.rt_sa_flags, e.flags); ASSIGN_TYPED(act.rt_sa_flags, e.flags);
...@@ -1006,7 +990,7 @@ err: ...@@ -1006,7 +990,7 @@ err:
static int prepare_pipes(int pid) static int prepare_pipes(int pid)
{ {
u32 err = -1, ret; int ret = 0;
int pipes_fd; int pipes_fd;
struct pipe_list_entry *le, *buf; struct pipe_list_entry *le, *buf;
...@@ -1033,15 +1017,10 @@ static int prepare_pipes(int pid) ...@@ -1033,15 +1017,10 @@ static int prepare_pipes(int pid)
le = &buf[nr]; le = &buf[nr];
ret = read(pipes_fd, &le->e, sizeof(le->e)); ret = read_img_eof(pipes_fd, &le->e);
if (ret == 0) if (ret <= 0)
break; break;
if (ret != sizeof(le->e)) {
pr_perror("%d: Bad pipes entry\n", pid);
goto err_free;
}
list_for_each(cur, &head) { list_for_each(cur, &head) {
cur_entry = list_entry(cur, struct pipe_list_entry, list); cur_entry = list_entry(cur, struct pipe_list_entry, list);
if (cur_entry->e.pipeid > le->e.pipeid) if (cur_entry->e.pipeid > le->e.pipeid)
...@@ -1055,22 +1034,24 @@ static int prepare_pipes(int pid) ...@@ -1055,22 +1034,24 @@ static int prepare_pipes(int pid)
nr++; nr++;
if (nr > buf_size / sizeof(*le)) { if (nr > buf_size / sizeof(*le)) {
ret = -1;
pr_err("OOM storing pipes"); pr_err("OOM storing pipes");
goto err_free; break;
} }
} }
list_for_each_entry(le, &head, list) { if (!ret)
lseek(pipes_fd, le->offset, SEEK_SET); list_for_each_entry(le, &head, list) {
if (open_pipe(pid, &le->e, &pipes_fd)) lseek(pipes_fd, le->offset, SEEK_SET);
goto err_free; if (open_pipe(pid, &le->e, &pipes_fd)) {
} ret = -1;
break;
}
}
err = 0;
err_free:
free(buf); free(buf);
close(pipes_fd); close(pipes_fd);
return err; return ret;
} }
static int restore_one_alive_task(int pid) static int restore_one_alive_task(int pid)
...@@ -1353,23 +1334,14 @@ static int restore_task_with_children(void *_arg) ...@@ -1353,23 +1334,14 @@ static int restore_task_with_children(void *_arg)
lseek(fd, sizeof(u32), SEEK_SET); lseek(fd, sizeof(u32), SEEK_SET);
while (1) { while (1) {
ret = read(fd, &e, sizeof(e)); ret = read_img(fd, &e);
if (ret == 0) if (ret < 0)
break;
if (ret != sizeof(e)) {
pr_err("%d: Read returned %d\n", pid, ret);
if (ret < 0)
pr_perror("%d: Can't read pstree\n", pid);
exit(1); exit(1);
}
if (e.pid != pid) { if (e.pid == pid)
lseek(fd, e.nr_children * sizeof(u32) + e.nr_threads * sizeof(u32), SEEK_CUR); break;
continue;
}
break; lseek(fd, e.nr_children * sizeof(u32) + e.nr_threads * sizeof(u32), SEEK_CUR);
} }
if (e.nr_children > 0) { if (e.nr_children > 0) {
......
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