[CRIU] [PATCH 3/7] fd: Don't use data from parasite_ctl

Pavel Emelyanov xemul at virtuozzo.com
Wed Sep 28 00:41:52 PDT 2016


The structure will become private to compel, so only
keep one as an opaque pointer for parasite API.s

In particular, use item.pid instead of ctl.pid.

Signed-off-by: Pavel Emelyanov <xemul at virtuozzo.com>
---
 criu/files.c | 27 ++++++++++++++-------------
 1 file changed, 14 insertions(+), 13 deletions(-)

diff --git a/criu/files.c b/criu/files.c
index aa3185b..c1714d5 100644
--- a/criu/files.c
+++ b/criu/files.c
@@ -304,12 +304,12 @@ int fill_fdlink(int lfd, const struct fd_parms *p, struct fd_link *link)
 	return 0;
 }
 
-static int fill_fd_params(struct parasite_ctl *ctl, int fd, int lfd,
+static int fill_fd_params(struct pid *owner_pid, int fd, int lfd,
 				struct fd_opts *opts, struct fd_parms *p)
 {
 	int ret;
 	struct statfs fsbuf;
-	struct fdinfo_common fdinfo = { .mnt_id = -1, .owner = ctl->pid.virt };
+	struct fdinfo_common fdinfo = { .mnt_id = -1, .owner = owner_pid->virt };
 
 	if (fstat(lfd, &p->stat) < 0) {
 		pr_perror("Can't stat fd %d", lfd);
@@ -321,22 +321,21 @@ static int fill_fd_params(struct parasite_ctl *ctl, int fd, int lfd,
 		return -1;
 	}
 
-	if (parse_fdinfo_pid(ctl->pid.real, fd, FD_TYPES__UND, NULL, &fdinfo))
+	if (parse_fdinfo_pid(owner_pid->real, fd, FD_TYPES__UND, NULL, &fdinfo))
 		return -1;
 
 	p->fs_type	= fsbuf.f_type;
-	p->fd_ctl	= ctl;
 	p->fd		= fd;
 	p->pos		= fdinfo.pos;
 	p->flags	= fdinfo.flags;
 	p->mnt_id	= fdinfo.mnt_id;
-	p->pid		= ctl->pid.real;
+	p->pid		= owner_pid->real;
 	p->fd_flags	= opts->flags;
 
 	fown_entry__init(&p->fown);
 
 	pr_info("%d fdinfo %d: pos: %#16"PRIx64" flags: %16o/%#x\n",
-		ctl->pid.real, fd, p->pos, p->flags, (int)p->fd_flags);
+			owner_pid->real, fd, p->pos, p->flags, (int)p->fd_flags);
 
 	ret = fcntl(lfd, F_GETSIG, 0);
 	if (ret < 0) {
@@ -426,21 +425,23 @@ static int dump_chrdev(struct fd_parms *p, int lfd, struct cr_img *img)
 	return do_dump_gen_file(p, lfd, ops, img);
 }
 
-static int dump_one_file(struct parasite_ctl *ctl, int fd, int lfd, struct fd_opts *opts,
-		       struct cr_img *img)
+static int dump_one_file(struct pid *pid, int fd, int lfd, struct fd_opts *opts,
+		       struct cr_img *img, struct parasite_ctl *ctl)
 {
 	struct fd_parms p = FD_PARMS_INIT;
 	const struct fdtype_ops *ops;
 	struct fd_link link;
 
-	if (fill_fd_params(ctl, fd, lfd, opts, &p) < 0) {
+	if (fill_fd_params(pid, fd, lfd, opts, &p) < 0) {
 		pr_err("Can't get stat on %d\n", fd);
 		return -1;
 	}
 
-	if (note_file_lock(&ctl->pid, fd, lfd, &p))
+	if (note_file_lock(pid, fd, lfd, &p))
 		return -1;
 
+	p.fd_ctl = ctl; /* Some dump_opts require this to talk to parasite */
+
 	if (S_ISSOCK(p.stat.st_mode))
 		return dump_socket(&p, lfd, img);
 
@@ -515,7 +516,7 @@ int dump_task_files_seized(struct parasite_ctl *ctl, struct pstree_item *item,
 	int off, nr_fds = min((int) PARASITE_MAX_FDS, dfds->nr_fds);
 
 	pr_info("\n");
-	pr_info("Dumping opened files (pid: %d)\n", ctl->pid.real);
+	pr_info("Dumping opened files (pid: %d)\n", item->pid.real);
 	pr_info("----------------------------------------\n");
 
 	lfds = xmalloc(nr_fds * sizeof(int));
@@ -541,8 +542,8 @@ int dump_task_files_seized(struct parasite_ctl *ctl, struct pstree_item *item,
 			goto err;
 
 		for (i = 0; i < nr_fds; i++) {
-			ret = dump_one_file(ctl, dfds->fds[i + off],
-						lfds[i], opts + i, img);
+			ret = dump_one_file(&item->pid, dfds->fds[i + off],
+						lfds[i], opts + i, img, ctl);
 			close(lfds[i]);
 			if (ret)
 				break;
-- 
2.5.0



More information about the CRIU mailing list