[CRIU] [PATCH cr 03/11] pipe: remove old code for restoring pipes

Andrey Vagin avagin at openvz.org
Thu Apr 5 12:02:07 EDT 2012


Signed-off-by: Andrey Vagin <avagin at openvz.org>
---
 cr-restore.c |  441 ----------------------------------------------------------
 1 files changed, 0 insertions(+), 441 deletions(-)

diff --git a/cr-restore.c b/cr-restore.c
index 79e9de7..5621bae 100644
--- a/cr-restore.c
+++ b/cr-restore.c
@@ -39,32 +39,6 @@
 #include "crtools.h"
 #include "namespaces.h"
 
-/*
- * real_pid member formerly served cases when
- * no fork-with-pid functionality were in kernel,
- * so now it is being kept here just in case if
- * we need it again.
- */
-
-#define PIPE_NONE	(0 << 0)
-#define PIPE_RDONLY	(1 << 1)
-#define PIPE_WRONLY	(1 << 2)
-#define PIPE_RDWR	(PIPE_RDONLY | PIPE_WRONLY)
-#define PIPE_MODE_MASK	(0x7)
-#define PIPE_CREATED	(1 << 3)
-
-#define pipe_is_rw(p)	(((p)->status & PIPE_MODE_MASK) == PIPE_RDWR)
-
-struct pipe_info {
-	unsigned int	pipeid;
-	int		pid;
-	int		read_fd;
-	int		write_fd;
-	int		status;
-	futex_t		real_pid;
-	futex_t		users;
-};
-
 struct shmem_id {
 	struct shmem_id *next;
 	unsigned long	addr;
@@ -72,12 +46,6 @@ struct shmem_id {
 	unsigned long	shmid;
 };
 
-struct pipe_list_entry {
-	struct list_head	list;
-	struct pipe_entry	e;
-	off_t			offset;
-};
-
 static struct task_entries *task_entries;
 
 static struct task_pids {
@@ -96,9 +64,6 @@ static struct shmem_id *shmem_ids;
 
 static struct shmems *shmems;
 
-static struct pipe_info *pipes;
-static int nr_pipes;
-
 pid_t pstree_pid;
 struct pstree_item *me;
 
@@ -118,31 +83,6 @@ static void show_saved_shmems(void)
 			shmems->entries[i].pid);
 }
 
-static void show_saved_pipes(void)
-{
-	int i;
-
-	pr_info("\tSaved pipes:\n");
-	for (i = 0; i < nr_pipes; i++)
-		pr_info("\t\tpipeid %x pid %d users %d status %d\n",
-			pipes[i].pipeid, pipes[i].pid,
-			futex_get(&pipes[i].users), pipes[i].status);
-}
-
-static struct pipe_info *find_pipe(unsigned int pipeid)
-{
-	struct pipe_info *pi;
-	int i;
-
-	for (i = 0; i < nr_pipes; i++) {
-		pi = pipes + i;
-		if (pi->pipeid == pipeid)
-			return pi;
-	}
-
-	return NULL;
-}
-
 static int shmem_wait_and_open(int pid, struct shmem_info *si)
 {
 	unsigned long time = 1;
@@ -255,107 +195,6 @@ out:
 	return ret;
 }
 
-
-static int collect_pipe(int pid, struct pipe_entry *e, int p_fd)
-{
-	int i;
-
-	/*
-	 * All pipes get collected into the one array,
-	 * note the highest PID is the sign of which
-	 * process pipe should be really created, all other
-	 * processes (if they have pipes with pipeid matched)
-	 * will be attached.
-	 */
-	for (i = 0; i < nr_pipes; i++) {
-		if (pipes[i].pipeid != e->pipeid)
-			continue;
-
-		if (pipes[i].pid > pid && !pipe_is_rw(&pipes[i])) {
-			pipes[i].pid = pid;
-			pipes[i].status = 0;
-			pipes[i].read_fd = -1;
-			pipes[i].write_fd = -1;
-		}
-
-		if (pipes[i].pid == pid) {
-			switch (e->flags & O_ACCMODE) {
-			case O_RDONLY:
-				pipes[i].status |= PIPE_RDONLY;
-				pipes[i].read_fd = e->fd;
-				break;
-			case O_WRONLY:
-				pipes[i].status |= PIPE_WRONLY;
-				pipes[i].write_fd = e->fd;
-				break;
-			}
-		} else
-			futex_inc(&pipes[i].users);
-
-		return 0;
-	}
-
-	if ((nr_pipes + 1) * sizeof(struct pipe_info) >= 4096) {
-		pr_err("OOM storing pipes\n");
-		return -1;
-	}
-
-	memset(&pipes[nr_pipes], 0, sizeof(pipes[nr_pipes]));
-
-	pipes[nr_pipes].pipeid	= e->pipeid;
-	pipes[nr_pipes].pid	= pid;
-	pipes[nr_pipes].read_fd = -1;
-	pipes[nr_pipes].write_fd = -1;
-
-	futex_init(&pipes[nr_pipes].users);
-
-	switch (e->flags & O_ACCMODE) {
-	case O_RDONLY:
-		pipes[nr_pipes].status = PIPE_RDONLY;
-		pipes[i].read_fd = e->fd;
-		break;
-	case O_WRONLY:
-		pipes[nr_pipes].status = PIPE_WRONLY;
-		pipes[i].write_fd = e->fd;
-		break;
-	}
-
-	nr_pipes++;
-
-	return 0;
-}
-
-static int prepare_pipes_pid(int pid)
-{
-	int p_fd, ret = 0;
-
-	p_fd = open_image_ro(CR_FD_PIPES, pid);
-	if (p_fd < 0) {
-		if (errno == ENOENT)
-			return 0;
-		else
-			return -1;
-	}
-
-	while (1) {
-		struct pipe_entry e;
-
-		ret = read_img_eof(p_fd, &e);
-		if (ret <= 0)
-			break;
-
-		ret = collect_pipe(pid, &e, p_fd);
-		if (ret < 0)
-			break;
-
-		if (e.bytes)
-			lseek(p_fd, e.bytes, SEEK_CUR);
-	}
-
-	close(p_fd);
-	return ret;
-}
-
 static int shmem_remap(void *old_addr, void *new_addr, unsigned long size)
 {
 	void *ret;
@@ -402,12 +241,6 @@ static int prepare_shared(int ps_fd)
 	task_entries->nr = 0;
 	futex_set(&task_entries->start, CR_STATE_RESTORE);
 
-	pipes = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, 0, 0);
-	if (pipes == MAP_FAILED) {
-		pr_perror("Can't map pipes");
-		return -1;
-	}
-
 	if (prepare_shared_fdinfo())
 		return -1;
 
@@ -432,10 +265,6 @@ static int prepare_shared(int ps_fd)
 		if (ret < 0)
 			break;
 
-		ret = prepare_pipes_pid(e.pid);
-		if (ret < 0)
-			break;
-
 		ret = prepare_fd_pid(e.pid);
 		if (ret < 0)
 			break;
@@ -453,7 +282,6 @@ static int prepare_shared(int ps_fd)
 		lseek(ps_fd, MAGIC_OFFSET, SEEK_SET);
 
 		show_saved_shmems();
-		show_saved_pipes();
 		show_saved_files();
 	}
 
@@ -606,207 +434,6 @@ static int prepare_and_sigreturn(int pid)
 	return sigreturn_restore(pid, &vma_list, nr_vmas);
 }
 
-#define SETFL_MASK (O_APPEND | O_NONBLOCK | O_NDELAY | O_DIRECT | O_NOATIME)
-
-static int set_fd_flags(int fd, int flags)
-{
-	int old;
-
-	old = fcntl(fd, F_GETFL, 0);
-	if (old < 0)
-		return old;
-
-	flags = (SETFL_MASK & flags) | (old & ~SETFL_MASK);
-
-	return fcntl(fd, F_SETFL, flags);
-}
-
-static int reopen_pipe(int src, int *dst, int *other, int *pipes_fd)
-{
-	int tmp;
-
-	if (*dst != -1) {
-		if (move_img_fd(other, *dst))
-			return -1;
-
-		if (move_img_fd(pipes_fd, *dst))
-			return -1;
-
-		return reopen_fd_as(*dst, src);
-	}
-
-	*dst = src;
-	return 0;
-}
-
-static int restore_pipe_data(struct pipe_entry *e, int wfd, int pipes_fd)
-{
-	int ret, size = 0;
-
-	pr_info("\t%x: Splicing data to %d\n", e->pipeid, wfd);
-
-	while (size != e->bytes) {
-		ret = splice(pipes_fd, NULL, wfd, NULL, e->bytes - size, 0);
-		if (ret < 0) {
-			pr_perror("\t%x: Error splicing data", e->pipeid);
-			return -1;
-		}
-		if (ret == 0) {
-			pr_err("\t%x: Wanted to restore %d bytes, but got %d\n",
-			       e->pipeid, e->bytes, size);
-			return -1;
-		}
-
-		size += ret;
-	}
-
-	return 0;
-}
-
-static int create_pipe(int pid, struct pipe_entry *e, struct pipe_info *pi, int *pipes_fd)
-{
-	unsigned long time = 1000;
-	int pfd[2], tmp;
-
-	pr_info("\t%d: Creating pipe %x%s\n", pid, e->pipeid, pipe_is_rw(pi) ? "(rw)" : "");
-
-	if (pipe(pfd) < 0) {
-		pr_perror("%d: Can't create pipe", pid);
-		return -1;
-	}
-
-	if (restore_pipe_data(e, pfd[1], *pipes_fd))
-		return -1;
-
-	if (reopen_pipe(pfd[0], &pi->read_fd, &pfd[1], pipes_fd))
-		return -1;
-	if (reopen_pipe(pfd[1], &pi->write_fd, &pi->read_fd, pipes_fd))
-		return -1;
-
-	futex_set_and_wake(&pi->real_pid, pid);
-
-	pi->status |= PIPE_CREATED;
-
-	pr_info("\t%d: Done, waiting for others (users %d) on %d pid with r:%d w:%d\n",
-		pid, futex_get(&pi->users), futex_get(&pi->real_pid), pi->read_fd, pi->write_fd);
-
-	if (!pipe_is_rw(pi)) {
-		pr_info("\t%d: Waiting for %x pipe to attach (%d users left)\n",
-				pid, e->pipeid, futex_get(&pi->users));
-
-		futex_wait_until(&pi->users, 0);
-
-		if ((e->flags & O_ACCMODE) == O_WRONLY)
-			close_safe(&pi->read_fd);
-		else
-			close_safe(&pi->write_fd);
-	}
-
-	tmp = 0;
-	if (pi->write_fd != e->fd && pi->read_fd != e->fd) {
-		if (move_img_fd(pipes_fd, e->fd))
-			return -1;
-
-		switch (e->flags & O_ACCMODE) {
-		case O_WRONLY:
-			tmp = dup2(pi->write_fd, e->fd);
-			break;
-		case O_RDONLY:
-			tmp = dup2(pi->read_fd, e->fd);
-			break;
-		}
-	}
-	if (tmp < 0)
-		return -1;
-
-	tmp = set_fd_flags(e->fd, e->flags);
-	if (tmp < 0)
-		return -1;
-
-	pr_info("\t%d: All is ok - reopening pipe for %d\n", pid, e->fd);
-
-	return 0;
-}
-
-static int attach_pipe(int pid, struct pipe_entry *e, struct pipe_info *pi, int *pipes_fd)
-{
-	char path[128];
-	int tmp, fd;
-
-	pr_info("\t%d: Waiting for pipe %x to appear\n",
-		pid, e->pipeid);
-
-	futex_wait_while(&pi->real_pid, 0);
-
-	if (move_img_fd(pipes_fd, e->fd))
-			return -1;
-
-	if ((e->flags & O_ACCMODE) == O_WRONLY)
-		tmp = pi->write_fd;
-	else
-		tmp = pi->read_fd;
-
-	if (pid == pi->pid) {
-		if (tmp != e->fd)
-			tmp = dup2(tmp, e->fd);
-
-		if (tmp < 0) {
-			pr_perror("%d: Can't duplicate %d->%d",
-					pid, tmp, e->fd);
-			return -1;
-		}
-
-		goto out;
-	}
-
-	sprintf(path, "/proc/%d/fd/%d", futex_get(&pi->real_pid), tmp);
-	pr_info("\t%d: Attaching pipe %s (%d users left)\n",
-		pid, path, futex_get(&pi->users) - 1);
-
-	fd = open(path, e->flags);
-	if (fd < 0) {
-		pr_perror("%d: Can't attach pipe", pid);
-		return -1;
-	}
-
-	pr_info("\t%d: Done, reopening for %d\n", pid, e->fd);
-	if (reopen_fd_as(e->fd, fd))
-		return -1;
-
-	futex_dec_and_wake(&pi->users);
-out:
-	tmp = set_fd_flags(e->fd, e->flags);
-	if (tmp < 0)
-		return -1;
-
-	return 0;
-
-}
-
-static int open_pipe(int pid, struct pipe_entry *e, int *pipes_fd)
-{
-	struct pipe_info *pi;
-
-	pr_info("\t%d: Opening pipe %x on fd %d\n", pid, e->pipeid, e->fd);
-
-	pi = find_pipe(e->pipeid);
-	if (!pi) {
-		pr_err("BUG: can't find my pipe %x\n", e->pipeid);
-		return -1;
-	}
-
-	/*
-	 * This is somewhat tricky -- in case if a process uses
-	 * both pipe ends the pipe should be created but only one
-	 * pipe end get connected immediately in create_pipe the
-	 * other pipe end should be connected via pipe attaching.
-	 */
-	if (pi->pid == pid && !(pi->status & PIPE_CREATED))
-		return create_pipe(pid, e, pi, pipes_fd);
-	else
-		return attach_pipe(pid, e, pi, pipes_fd);
-}
-
 static rt_sigaction_t sigchld_act;
 static int prepare_sigactions(int pid)
 {
@@ -853,78 +480,10 @@ err:
 	return ret;
 }
 
-static int prepare_pipes(int pid)
-{
-	int ret = -1;
-	int pipes_fd;
-
-	struct pipe_list_entry *le, *buf;
-	int buf_size = PAGE_SIZE;
-	int nr = 0;
-
-	LIST_HEAD(head);
-
-	pr_info("%d: Opening pipes\n", pid);
-
-	pipes_fd = open_image_ro(CR_FD_PIPES, pid);
-	if (pipes_fd < 0)
-		return -1;
-
-	buf = xmalloc(buf_size);
-	if (!buf)
-		goto out;
-
-	while (1) {
-		struct list_head *cur;
-		struct pipe_list_entry *cur_entry;
-
-		le = &buf[nr];
-
-		ret = read_img_eof(pipes_fd, &le->e);
-		if (ret <= 0)
-			break;
-
-		list_for_each(cur, &head) {
-			cur_entry = list_entry(cur, struct pipe_list_entry, list);
-			if (cur_entry->e.pipeid > le->e.pipeid)
-				break;
-		}
-
-		list_add_tail(&le->list, cur);
-
-		le->offset = lseek(pipes_fd, 0, SEEK_CUR);
-		lseek(pipes_fd, le->e.bytes, SEEK_CUR);
-
-		nr++;
-		if (nr > buf_size / sizeof(*le)) {
-			ret = -1;
-			pr_err("OOM storing pipes");
-			break;
-		}
-	}
-
-	if (!ret)
-		list_for_each_entry(le, &head, list) {
-			lseek(pipes_fd, le->offset, SEEK_SET);
-			if (open_pipe(pid, &le->e, &pipes_fd)) {
-				ret = -1;
-				break;
-			}
-		}
-
-	free(buf);
-out:
-	close_safe(&pipes_fd);
-	return ret;
-}
-
 static int restore_one_alive_task(int pid)
 {
 	pr_info("%d: Restoring resources\n", pid);
 
-	if (prepare_pipes(pid))
-		return -1;
-
 	if (prepare_sockets(pid))
 		return -1;
 
-- 
1.7.1



More information about the CRIU mailing list