[lxc-devel] [PATCH 2/2] lxc_attach: Clean up cgroup attaching code

Christian Seiler christian at iwakd.de
Sun Mar 3 12:55:10 UTC 2013


Since lxc_attach now works with two fork()s anyway due to user
namespaces, the code for attaching to cgroups can be simplified again.

This patch removes the prepare/finish/dispose functions for attaching
to cgroups and just keeps the lxc_cgroup_attach function.
---
 src/lxc/cgroup.c |  154 ++++++-----------------------------------------------
 src/lxc/cgroup.h |    3 -
 2 files changed, 18 insertions(+), 139 deletions(-)

diff --git a/src/lxc/cgroup.c b/src/lxc/cgroup.c
index 6630d6c..8420e08 100644
--- a/src/lxc/cgroup.c
+++ b/src/lxc/cgroup.c
@@ -259,37 +259,12 @@ static int cgroup_enable_clone_children(const char *path)
 	return ret;
 }
 
-static int lxc_one_cgroup_finish_attach(int fd, pid_t pid)
-{
-       char buf[32];
-       int ret;
-
-       snprintf(buf, 32, "%ld", (long)pid);
-
-       ret = write(fd, buf, strlen(buf));
-       if (ret <= 0) {
-               SYSERROR("failed to write pid '%ld' to fd '%d'", (long)pid, fd);
-               ret = -1;
-       } else {
-               ret = 0;
-       }
-
-       close(fd);
-       return ret;
-}
-
-static int lxc_one_cgroup_dispose_attach(int fd)
-{
-       close(fd);
-       return 0;
-}
-
-static int lxc_one_cgroup_prepare_attach(const char *name,
-					 struct mntent *mntent)
+static int lxc_one_cgroup_attach(const char *name, struct mntent *mntent, pid_t pid)
 {
 	int fd;
 	char tasks[MAXPATHLEN], initcgroup[MAXPATHLEN];
 	char *cgmnt = mntent->mnt_dir;
+	char buf[32];
 	int flags;
 	int rc;
 
@@ -310,77 +285,26 @@ static int lxc_one_cgroup_prepare_attach(const char *name,
 		return -1;
 	}
 
-	return fd;
-}
-
-static int lxc_one_cgroup_attach(const char *name, struct mntent *mntent, pid_t pid)
-{
-	int fd;
-
-	fd = lxc_one_cgroup_prepare_attach(name, mntent);
-	if (fd < 0) {
-		return -1;
-	}
-
-	return lxc_one_cgroup_finish_attach(fd, pid);
-}
-
-int lxc_cgroup_dispose_attach(void *data)
-{
-	int *fds = data;
-	int ret, err;
-
-	if (!fds) {
-		return 0;
-	}
-
-	ret = 0;
-
-	for (; *fds >= 0; fds++) {
-		err = lxc_one_cgroup_dispose_attach(*fds);
-		if (err) {
-			ret = err;
-		}
-	}
-
-	free(data);
-
-	return ret;
-}
-
-int lxc_cgroup_finish_attach(void *data, pid_t pid)
-{
-	int *fds = data;
-	int err;
+	snprintf(buf, 32, "%ld", (long)pid);
 
-	if (!fds) {
-		return 0;
+	rc = write(fd, buf, strlen(buf));
+	if (rc <= 0) {
+		SYSERROR("failed to write pid '%ld' to fd '%d'", (long)pid, fd);
+		rc = -1;
+	} else {
+		rc = 0;
 	}
 
-	for (; *fds >= 0; fds++) {
-		err = lxc_one_cgroup_finish_attach(*fds, pid);
-		if (err) {
-			/* get rid of the rest of them */
-			lxc_cgroup_dispose_attach(data);
-			return -1;
-		}
-		*fds = -1;
-	}
-
-	free(data);
-
-	return 0;
+	close(fd);
+	return rc;
 }
 
-int lxc_cgroup_prepare_attach(const char *name, void **data)
+int lxc_cgroup_attach(const char *name, pid_t pid)
 {
 	struct mntent *mntent;
 	FILE *file = NULL;
-	int err = -1;
 	int found = 0;
-	int *fds;
-	int i;
-	static const int MAXFDS = 256;
+	int err = 0;
 
 	file = setmntent(MTAB, "r");
 	if (!file) {
@@ -388,29 +312,7 @@ int lxc_cgroup_prepare_attach(const char *name, void **data)
 		return -1;
 	}
 
-	/* create a large enough buffer for all practical
-	 * use cases
-	 */
-	fds = malloc(sizeof(int) * MAXFDS);
-	if (!fds) {
-		err = -1;
-		goto out;
-	}
-	for (i = 0; i < MAXFDS; i++) {
-		fds[i] = -1;
-	}
-
-	err = 0;
-	i = 0;
 	while ((mntent = getmntent(file))) {
-		if (i >= MAXFDS - 1) {
-			ERROR("too many cgroups to attach to, aborting");
-			lxc_cgroup_dispose_attach(fds);
-			errno = ENOMEM;
-			err = -1;
-			goto out;
-		}
-
 		DEBUG("checking '%s' (%s)", mntent->mnt_dir, mntent->mnt_type);
 
 		if (strcmp(mntent->mnt_type, "cgroup"))
@@ -421,42 +323,22 @@ int lxc_cgroup_prepare_attach(const char *name, void **data)
 		INFO("[%d] found cgroup mounted at '%s',opts='%s'",
 		     ++found, mntent->mnt_dir, mntent->mnt_opts);
 
-		fds[i] = lxc_one_cgroup_prepare_attach(name, mntent);
-		if (fds[i] < 0) {
-			err = fds[i];
-			lxc_cgroup_dispose_attach(fds);
+		err = lxc_one_cgroup_attach(name, mntent, pid);
+		if (err < 0)
 			goto out;
-		}
-		i++;
-	};
+
+		found = 1;
+	}
 
 	if (!found)
 		ERROR("No cgroup mounted on the system");
 
-	*data = fds;
-
 out:
 	endmntent(file);
 	return err;
 }
 
 /*
- * for each mounted cgroup, attach a pid to the cgroup for the container
- */
-int lxc_cgroup_attach(const char *name, pid_t pid)
-{
-	void *data = NULL;
-	int ret;
-
-	ret = lxc_cgroup_prepare_attach(name, &data);
-	if (ret < 0) {
-		return ret;
-	}
-
-	return lxc_cgroup_finish_attach(data, pid);
-}
-
-/*
  * rename cgname, which is under cgparent, to a new name starting
  * with 'cgparent/dead'.  That way cgname can be reused.  Return
  * 0 on success, -1 on failure.
diff --git a/src/lxc/cgroup.h b/src/lxc/cgroup.h
index 8167f39..3c90696 100644
--- a/src/lxc/cgroup.h
+++ b/src/lxc/cgroup.h
@@ -31,8 +31,5 @@ extern int lxc_cgroup_destroy(const char *name);
 extern int lxc_cgroup_path_get(char **path, const char *subsystem, const char *name);
 extern int lxc_cgroup_nrtasks(const char *name);
 extern int lxc_cgroup_attach(const char *name, pid_t pid);
-extern int lxc_cgroup_prepare_attach(const char *name, void **data);
-extern int lxc_cgroup_finish_attach(void *data, pid_t pid);
-extern int lxc_cgroup_dispose_attach(void *data);
 extern int lxc_ns_is_mounted(void);
 #endif
-- 
1.7.8.6





More information about the lxc-devel mailing list