[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