Commit 670d1ce8 authored by Tikhomirov Pavel's avatar Tikhomirov Pavel Committed by Pavel Emelyanov

v2 page-read: rework open_page_read to use in shmem restore

Signed-off-by: 's avatarTikhomirov Pavel <snorcht@gmail.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 1153f225
...@@ -67,7 +67,7 @@ static int cr_dedup_one_pagemap(int pid) ...@@ -67,7 +67,7 @@ static int cr_dedup_one_pagemap(int pid)
struct page_read * prp; struct page_read * prp;
struct iovec iov; struct iovec iov;
ret = open_page_read(pid, &pr, O_RDWR); ret = open_page_read(pid, &pr, O_RDWR, false);
if (ret) { if (ret) {
ret = -1; ret = -1;
goto exit; goto exit;
......
...@@ -340,7 +340,7 @@ static int restore_priv_vma_content(pid_t pid) ...@@ -340,7 +340,7 @@ static int restore_priv_vma_content(pid_t pid)
vma = list_first_entry(vmas, struct vma_area, list); vma = list_first_entry(vmas, struct vma_area, list);
ret = open_page_read(pid, &pr, ret = open_page_read(pid, &pr,
opts.auto_dedup ? O_RDWR : O_RSTR); opts.auto_dedup ? O_RDWR : O_RSTR, false);
if (ret) if (ret)
return -1; return -1;
......
...@@ -68,8 +68,8 @@ struct page_read { ...@@ -68,8 +68,8 @@ struct page_read {
unsigned id; /* for logging */ unsigned id; /* for logging */
}; };
extern int open_page_read(int pid, struct page_read *, int flags); extern int open_page_read(int pid, struct page_read *, int flags, bool shmem);
extern int open_page_read_at(int dfd, int pid, struct page_read *pr, int flags); extern int open_page_read_at(int dfd, int pid, struct page_read *pr, int flags, bool shmem);
extern void pagemap2iovec(PagemapEntry *pe, struct iovec *iov); extern void pagemap2iovec(PagemapEntry *pe, struct iovec *iov);
extern int seek_pagemap_page(struct page_read *pr, unsigned long vaddr, bool warn); extern int seek_pagemap_page(struct page_read *pr, unsigned long vaddr, bool warn);
......
...@@ -195,7 +195,7 @@ static int try_open_parent(int dfd, int pid, struct page_read *pr, int flags) ...@@ -195,7 +195,7 @@ static int try_open_parent(int dfd, int pid, struct page_read *pr, int flags)
if (!parent) if (!parent)
goto err_cl; goto err_cl;
if (open_page_read_at(pfd, pid, parent, flags)) { if (open_page_read_at(pfd, pid, parent, flags, false)) {
if (errno != ENOENT) if (errno != ENOENT)
goto err_free; goto err_free;
xfree(parent); xfree(parent);
...@@ -214,15 +214,15 @@ err_cl: ...@@ -214,15 +214,15 @@ err_cl:
return -1; return -1;
} }
int open_page_read_at(int dfd, int pid, struct page_read *pr, int flags) int open_page_read_at(int dfd, int pid, struct page_read *pr, int flags, bool shmem)
{ {
pr->pe = NULL; pr->pe = NULL;
pr->bunch.iov_len = 0; pr->bunch.iov_len = 0;
pr->bunch.iov_base = NULL; pr->bunch.iov_base = NULL;
pr->fd = open_image_at(dfd, CR_FD_PAGEMAP, O_RSTR, (long)pid); pr->fd = open_image_at(dfd, shmem ? CR_FD_SHMEM_PAGEMAP : CR_FD_PAGEMAP, O_RSTR, (long)pid);
if (pr->fd < 0) { if (pr->fd < 0) {
pr->fd_pg = open_image_at(dfd, CR_FD_PAGES_OLD, flags, pid); pr->fd_pg = open_image_at(dfd, shmem ? CR_FD_SHM_PAGES_OLD : CR_FD_PAGES_OLD, flags, pid);
if (pr->fd_pg < 0) if (pr->fd_pg < 0)
return -1; return -1;
...@@ -233,7 +233,7 @@ int open_page_read_at(int dfd, int pid, struct page_read *pr, int flags) ...@@ -233,7 +233,7 @@ int open_page_read_at(int dfd, int pid, struct page_read *pr, int flags)
} else { } else {
static unsigned ids = 1; static unsigned ids = 1;
if (try_open_parent(dfd, pid, pr, flags)) { if (!shmem && try_open_parent(dfd, pid, pr, flags)) {
close(pr->fd); close(pr->fd);
return -1; return -1;
} }
...@@ -258,7 +258,7 @@ int open_page_read_at(int dfd, int pid, struct page_read *pr, int flags) ...@@ -258,7 +258,7 @@ int open_page_read_at(int dfd, int pid, struct page_read *pr, int flags)
return 0; return 0;
} }
int open_page_read(int pid, struct page_read *pr, int flags) int open_page_read(int pid, struct page_read *pr, int flags, bool shmem)
{ {
return open_page_read_at(get_service_fd(IMG_FD_OFF), pid, pr, flags); return open_page_read_at(get_service_fd(IMG_FD_OFF), pid, pr, flags, shmem);
} }
...@@ -656,7 +656,7 @@ static int open_page_local_xfer(struct page_xfer *xfer, int fd_type, long id) ...@@ -656,7 +656,7 @@ static int open_page_local_xfer(struct page_xfer *xfer, int fd_type, long id)
return -1; return -1;
} }
ret = open_page_read_at(pfd, id, xfer->parent, O_RDWR); ret = open_page_read_at(pfd, id, xfer->parent, O_RDWR, false);
if (ret) { if (ret) {
pr_perror("Can't dedup old image format"); pr_perror("Can't dedup old image format");
xfree(xfer->parent); xfree(xfer->parent);
......
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