diff --git a/cr-dedup.c b/cr-dedup.c index 38f03a637..77586742f 100644 --- a/cr-dedup.c +++ b/cr-dedup.c @@ -67,7 +67,7 @@ static int cr_dedup_one_pagemap(int pid) struct page_read * prp; struct iovec iov; - ret = open_page_read(pid, &pr, O_RDWR); + ret = open_page_read(pid, &pr, O_RDWR, false); if (ret) { ret = -1; goto exit; diff --git a/cr-restore.c b/cr-restore.c index df270760b..b352daa57 100644 --- a/cr-restore.c +++ b/cr-restore.c @@ -340,7 +340,7 @@ static int restore_priv_vma_content(pid_t pid) vma = list_first_entry(vmas, struct vma_area, list); ret = open_page_read(pid, &pr, - opts.auto_dedup ? O_RDWR : O_RSTR); + opts.auto_dedup ? O_RDWR : O_RSTR, false); if (ret) return -1; diff --git a/include/page-read.h b/include/page-read.h index 9078eaa63..7a063e9cd 100644 --- a/include/page-read.h +++ b/include/page-read.h @@ -68,8 +68,8 @@ struct page_read { unsigned id; /* for logging */ }; -extern int open_page_read(int pid, struct page_read *, int flags); -extern int open_page_read_at(int dfd, int pid, struct page_read *pr, 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, bool shmem); extern void pagemap2iovec(PagemapEntry *pe, struct iovec *iov); extern int seek_pagemap_page(struct page_read *pr, unsigned long vaddr, bool warn); diff --git a/page-read.c b/page-read.c index fc51b6ae4..6ed1e6b74 100644 --- a/page-read.c +++ b/page-read.c @@ -195,7 +195,7 @@ static int try_open_parent(int dfd, int pid, struct page_read *pr, int flags) if (!parent) 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) goto err_free; xfree(parent); @@ -214,15 +214,15 @@ err_cl: 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->bunch.iov_len = 0; 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) { - 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) return -1; @@ -233,7 +233,7 @@ int open_page_read_at(int dfd, int pid, struct page_read *pr, int flags) } else { static unsigned ids = 1; - if (try_open_parent(dfd, pid, pr, flags)) { + if (!shmem && try_open_parent(dfd, pid, pr, flags)) { close(pr->fd); return -1; } @@ -258,7 +258,7 @@ int open_page_read_at(int dfd, int pid, struct page_read *pr, int flags) 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); } diff --git a/page-xfer.c b/page-xfer.c index f9e145668..f26be35ef 100644 --- a/page-xfer.c +++ b/page-xfer.c @@ -656,7 +656,7 @@ static int open_page_local_xfer(struct page_xfer *xfer, int fd_type, long id) 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) { pr_perror("Can't dedup old image format"); xfree(xfer->parent);