Quoting Christian Seiler (christ...@iwakd.de):
> 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.
> ---

(Note - no signed-off-by in this patch.  How are you generating them?
I'd recommend either using git-send-email, or get format-patch...)

Thanks, Christian.  Unfortunately this will clash badly with my cgroup
update which does the same thing, so while I 100% ack the concept,
Stéphane please do not apply this.


>  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

------------------------------------------------------------------------------
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

Reply via email to