[CRIU] [PATCH 05/28] dump: new fd_entry structure introduced

Kinsbursky Stanislav skinsbursky at openvz.org
Thu Mar 22 13:58:04 EDT 2012


From: Stanislav Kinsbursky <skinsbursky at openvz.org>

This structure represent how fdinfo_entry will look at the end.
I.e. it's temporary. Without it it's impossible to split this huge code pile
into safe-bisectable pieces.

Signed-off-by: Stanislav Kinsbursky <skinsbursky at openvz.org>
---
 cr-dump.c       |   12 +++++++-----
 cr-show.c       |    2 +-
 files.c         |   32 ++++++++++++++++----------------
 include/image.h |    9 +++++++--
 restorer.c      |    2 +-
 5 files changed, 32 insertions(+), 25 deletions(-)
-------------- next part --------------
diff --git a/cr-dump.c b/cr-dump.c
index 10f3ac2..42d0c97 100644
--- a/cr-dump.c
+++ b/cr-dump.c
@@ -120,28 +120,30 @@ static int dump_one_reg_file(const struct fd_parms *p, int lfd,
 	if (do_close_lfd)
 		close(lfd);
 
-	e.type	= p->type;
 	e.len	= len;
 	e.flags = p->flags;
 	e.pos	= p->pos;
 	e.addr	= p->fd_name;
-	e.id	= FD_ID_INVALID;
 
-	if (likely(!fd_is_special(&e))) {
+	e.fde.type	= p->type;
+	e.fde.fd	= (u32)p->fd_name;
+	e.fde.id	= FD_ID_INVALID;
+
+	if (likely(!fd_is_special(&e.fde))) {
 		struct fd_id_entry *entry;
 
 		/*
 		 * Make sure the union is still correlate with structure
 		 * we write to disk.
 		 */
-		BUILD_BUG_ON(sizeof(entry->u.key) != sizeof(e.id));
+		BUILD_BUG_ON(sizeof(entry->u.key) != sizeof(e.fde.id));
 
 		entry = fd_id_entry_collect((u32)p->id, p->pid, p->fd_name);
 		if (!entry)
 			goto err;
 
 		/* Now it might have completely new ID here */
-		e.id	= entry->u.id;
+		e.fde.id = entry->u.id;
 	}
 
 	pr_info("fdinfo: type: %2x len: %2x flags: %4x pos: %8lx addr: %16lx\n",
diff --git a/cr-show.c b/cr-show.c
index 56ff432..ae99e48 100644
--- a/cr-show.c
+++ b/cr-show.c
@@ -69,7 +69,7 @@ static void show_files(int fd_files)
 
 		pr_msg("type: %02x len: %02x flags: %4x pos: %8x "
 		       "addr: %16lx id: %16lx",
-		       e.type, e.len, e.flags, e.pos, e.addr, e.id);
+		       e.fde.type, e.len, e.flags, e.pos, e.addr, e.fde.id);
 
 		if (e.len) {
 			int ret = read(fd_files, local_buf, e.len);
diff --git a/files.c b/files.c
index e9b7496..bacd671 100644
--- a/files.c
+++ b/files.c
@@ -77,7 +77,7 @@ static int collect_fd(int pid, struct fdinfo_entry *e)
 	struct fdinfo_desc *desc;
 
 	pr_info("Collect fdinfo pid=%d fd=%ld id=%16lx\n",
-		pid, e->addr, e->id);
+		pid, e->addr, e->fde.id);
 
 	nr_fdinfo_list++;
 	if ((nr_fdinfo_list) * sizeof(struct fdinfo_list_entry) >= 4096) {
@@ -92,7 +92,7 @@ static int collect_fd(int pid, struct fdinfo_entry *e)
 	for (i = 0; i < nr_fdinfo_descs; i++) {
 		desc = &fdinfo_descs[i];
 
-		if (desc->id != e->id)
+		if (desc->id != e->fde.id)
 			continue;
 
 		fdinfo_descs[i].users++;
@@ -115,8 +115,8 @@ static int collect_fd(int pid, struct fdinfo_entry *e)
 	desc = &fdinfo_descs[nr_fdinfo_descs];
 	memzero(desc, sizeof(*desc));
 
-	desc->id	= e->id;
-	desc->addr	= e->addr;
+	desc->id	= e->fde.id;
+	desc->addr	= e->fde.fd;
 	desc->pid	= pid;
 	desc->users	= 1;
 	INIT_LIST_HEAD(&desc->list);
@@ -150,7 +150,7 @@ int prepare_fd_pid(int pid)
 		if (e.len)
 			lseek(fdinfo_fd, e.len, SEEK_CUR);
 
-		if (fd_is_special(&e))
+		if (fd_is_special(&e.fde))
 			continue;
 
 		ret = collect_fd(pid, &e);
@@ -245,7 +245,7 @@ static int open_transport_fd(int pid, struct fdinfo_entry *fe,
 	*saddr.sun_path = '\0';
 
 	pr_info("\t%d: Create transport fd for %lx type %d namelen %d users %d\n", pid,
-			(unsigned long)fe->addr, fe->type, fe->len, fi->users);
+			(unsigned long)fe->addr, fe->fde.type, fe->len, fi->users);
 
 	fle = find_fdinfo_list_entry(pid, fe->addr, fi);
 
@@ -300,7 +300,7 @@ static int open_fd(int pid, struct fdinfo_entry *fe,
 	cr_wait_set(&fi->real_pid, getpid());
 
 	pr_info("\t%d: Create fd for %lx type %d namelen %d users %d\n", pid,
-			(unsigned long)fe->addr, fe->type, fe->len, fi->users);
+			(unsigned long)fe->addr, fe->fde.type, fe->len, fi->users);
 
 	list_for_each_entry(fle, &fi->list, list) {
 		int len;
@@ -351,7 +351,7 @@ static int receive_fd(int pid, struct fdinfo_entry *fe, struct fdinfo_desc *fi)
 	}
 
 	pr_info("\t%d: Receive fd for %lx type %d namelen %d users %d\n", pid,
-			(unsigned long)fe->addr, fe->type, fe->len, fi->users);
+			(unsigned long)fe->addr, fe->fde.type, fe->len, fi->users);
 
 	tmp = recv_fd(fe->addr);
 	if (tmp < 0) {
@@ -395,15 +395,15 @@ static int open_fdinfo(int pid, struct fdinfo_entry *fe, int *fdinfo_fd, int sta
 	u32 mag;
 	int ret = 0;
 
-	struct fdinfo_desc *fi = find_fd(fe->id);
+	struct fdinfo_desc *fi = find_fd(fe->fde.id);
 
 	if (move_img_fd(fdinfo_fd, (int)fe->addr))
 		return -1;
 
 	pr_info("\t%d: Got fd for %lx type %d namelen %d users %d\n", pid,
-			(unsigned long)fe->addr, fe->type, fe->len, fi->users);
+			(unsigned long)fe->addr, fe->fde.type, fe->len, fi->users);
 
-	BUG_ON(fe->type != FDINFO_REG);
+	BUG_ON(fe->fde.type != FDINFO_REG);
 
 
 	switch (state) {
@@ -429,14 +429,14 @@ static int open_special_fdinfo(int pid, struct fdinfo_entry *fe,
 		return 0;
 	}
 
-	if (fe->type == FDINFO_MAP)
+	if (fe->fde.type == FDINFO_MAP)
 		return open_fmap(pid, fe, fdinfo_fd);
-	if (fe->type == FDINFO_CWD)
+	if (fe->fde.type == FDINFO_CWD)
 		return restore_cwd(fe, fdinfo_fd);
-	if (fe->type == FDINFO_EXE)
+	if (fe->fde.type == FDINFO_EXE)
 		return restore_exe_early(fe, fdinfo_fd);
 
-	pr_info("%d: fe->type: %d\n", pid,  fe->type);
+	pr_info("%d: fe->type: %d\n", pid,  fe->fde.type);
 	BUG_ON(1);
 	return -1;
 }
@@ -474,7 +474,7 @@ int prepare_fds(int pid)
 				goto err;
 			}
 
-			if (fd_is_special(&fe)) {
+			if (fd_is_special(&fe.fde)) {
 				if (open_special_fdinfo(pid, &fe, fdinfo_fd, state))
 					goto err;
 
diff --git a/include/image.h b/include/image.h
index 5bcfffd..6ff984a 100644
--- a/include/image.h
+++ b/include/image.h
@@ -40,13 +40,18 @@
 #define PAGE_RSS	1
 #define PAGE_ANON	2
 
-struct fdinfo_entry {
+struct fd_entry {
+	u64	id;
+	u32	fd;
 	u8	type;
+} __packed;
+
+struct fdinfo_entry {
+	struct fd_entry fde;
 	u8	len;
 	u16	flags;
 	u32	pos;
 	u64	addr;
-	u64	id;
 	u8	name[0];
 } __packed;
 
diff --git a/restorer.c b/restorer.c
index 78b0584..c572025 100644
--- a/restorer.c
+++ b/restorer.c
@@ -249,7 +249,7 @@ static long restore_self_exe_late(struct task_restore_core_args *args)
 			goto err;
 		}
 
-		if (fe.type == FDINFO_EXE)
+		if (fe.fde.type == FDINFO_EXE)
 			break;
 
 		if (fe.len)


More information about the CRIU mailing list