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 ------------------------------------------------------------------------------ Everyone hates slow websites. So do we. Make your web apps faster with AppDynamics Download AppDynamics Lite for free today: http://p.sf.net/sfu/appdyn_d2d_feb _______________________________________________ Lxc-devel mailing list Lxc-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lxc-devel