[2/5] ns: Pack functionality of storing ns fd to store_self_ns()

Submitted by Kirill Tkhai on March 24, 2017, 9:34 a.m.

Details

Message ID 149034807484.30232.5774086805190667240.stgit@localhost.localdomain
State New
Series "Restore of "/proc/self/ns/net" fixes"
Headers show

Commit Message

Kirill Tkhai March 24, 2017, 9:34 a.m.
We have the same code in several places. Pack it into separate function.

Signed-off-by: Kirill Tkhai <ktkhai@virtuozzo.com>
---
 criu/include/namespaces.h |    1 +
 criu/namespaces.c         |   24 ++++++++++++++++--------
 criu/net.c                |   23 ++---------------------
 3 files changed, 19 insertions(+), 29 deletions(-)

Patch hide | download patch | download mbox

diff --git a/criu/include/namespaces.h b/criu/include/namespaces.h
index f3278787..fb39ce9c 100644
--- a/criu/include/namespaces.h
+++ b/criu/include/namespaces.h
@@ -163,6 +163,7 @@  extern int predump_task_ns_ids(struct pstree_item *);
 extern struct ns_id *rst_new_ns_id(unsigned int id, pid_t pid, struct ns_desc *nd, enum ns_type t);
 extern int rst_add_ns_id(unsigned int id, pid_t pid, struct ns_desc *nd);
 extern struct ns_id *lookup_ns_by_id(unsigned int id, struct ns_desc *nd);
+extern int store_self_ns(struct ns_id *ns);
 
 extern int collect_user_namespaces(bool for_dump);
 extern int prepare_userns(pid_t real_pid, UsernsEntry *e);
diff --git a/criu/namespaces.c b/criu/namespaces.c
index d75c1dc1..b6780633 100644
--- a/criu/namespaces.c
+++ b/criu/namespaces.c
@@ -2152,6 +2152,20 @@  int join_namespaces(void)
 	return ret;
 }
 
+int store_self_ns(struct ns_id *ns)
+{
+	int fd, id;
+
+	/* Pin one with a file descriptor */
+	fd = open_proc(PROC_SELF, "ns/%s", ns->nd->str);
+	if (fd < 0)
+		return -1;
+
+	id = fdstore_add(fd);
+	close(fd);
+	return id;
+}
+
 enum {
 	NS__CREATED = 1,
 	NS__MAPS_POPULATED,
@@ -2171,8 +2185,8 @@  static int create_user_ns_hierarhy_fn(void *in_arg)
 	char stack[128] __stack_aligned__;
 	struct ns_arg *arg = NULL, *p_arg = in_arg;
 	futex_t *p_futex = NULL, *futex = NULL;
-	int status, fd, ret = -1;
 	struct ns_id *me, *child;
+	int status, ret = -1;
 	pid_t pid = -1;
 
 	if (p_arg->me != root_user_ns)
@@ -2183,13 +2197,7 @@  static int create_user_ns_hierarhy_fn(void *in_arg)
 		/* Set self pid to allow parent restore user_ns maps */
 		p_arg->pid = get_self_real_pid();
 		futex_set_and_wake(p_futex, NS__CREATED);
-		fd = open("/proc/self/ns/user", O_RDONLY);
-		if (fd < 0) {
-			pr_perror("Can't get self user ns");
-			goto out;
-		}
-		me->user.nsfd_id = fdstore_add(fd);
-		close(fd);
+		me->user.nsfd_id = store_self_ns(me);
 		if (me->user.nsfd_id < 0) {
 			pr_err("Can't add fd to fdstore\n");
 			goto out;
diff --git a/criu/net.c b/criu/net.c
index ab74e918..a5d3df6b 100644
--- a/criu/net.c
+++ b/criu/net.c
@@ -1701,26 +1701,6 @@  static int prepare_net_ns(int nsid)
 	return ret;
 }
 
-static int open_net_ns(struct ns_id *nsid)
-{
-	int fd, id;
-
-	/* Pin one with a file descriptor */
-	fd = open_proc(PROC_SELF, "ns/net");
-	if (fd < 0)
-		return -1;
-
-	id = fdstore_add(fd);
-	close(fd);
-	if (id < 0) {
-		return -1;
-	}
-
-	nsid->net.nsfd_id = id;
-
-	return 0;
-}
-
 static int do_create_net_ns(struct ns_id *ns)
 {
 	if (unshare(CLONE_NEWNET)) {
@@ -1729,7 +1709,8 @@  static int do_create_net_ns(struct ns_id *ns)
 	}
 	if (prepare_net_ns(ns->id))
 		return -1;
-	if (open_net_ns(ns))
+	ns->net.nsfd_id = store_self_ns(ns);
+	if (ns->net.nsfd_id < 0)
 		return -1;
 	return 0;
 }