On Mon, Jan 13, 2014 at 03:26:49PM -0600, Serge Hallyn wrote:
> Some functions which wanted to know about cgroup paths were located
> in other files.  Move them into cgroup.c, so that all knowledge of
> the cgroup backend can be colocated.
> 
> Signed-off-by: Serge Hallyn <[email protected]>

Acked-by: Stéphane Graber <[email protected]>

> ---
>  src/lxc/cgroup.c  | 134 
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  src/lxc/cgroup.h  |   6 +++
>  src/lxc/freezer.c |  91 ------------------------------------
>  src/lxc/state.c   |  38 ----------------
>  4 files changed, 140 insertions(+), 129 deletions(-)
> 
> diff --git a/src/lxc/cgroup.c b/src/lxc/cgroup.c
> index be43c73..ff237fe 100644
> --- a/src/lxc/cgroup.c
> +++ b/src/lxc/cgroup.c
> @@ -48,6 +48,7 @@
>  #include "log.h"
>  #include "cgroup.h"
>  #include "start.h"
> +#include "state.h"
>  
>  #if IS_BIONIC
>  #include <../include/lxcmntent.h>
> @@ -2022,3 +2023,136 @@ int handle_cgroup_settings(struct cgroup_mount_point 
> *mp, char *cgroup_path)
>       }
>       return 0;
>  }
> +
> +extern void lxc_monitor_send_state(const char *name, lxc_state_t state,
> +                         const char *lxcpath);
> +int do_unfreeze(const char *nsgroup, int freeze, const char *name, const 
> char *lxcpath)
> +{
> +     char freezer[MAXPATHLEN], *f;
> +     char tmpf[32];
> +     int fd, ret;
> +
> +     ret = snprintf(freezer, MAXPATHLEN, "%s/freezer.state", nsgroup);
> +     if (ret >= MAXPATHLEN) {
> +             ERROR("freezer.state name too long");
> +             return -1;
> +     }
> +
> +     fd = open(freezer, O_RDWR);
> +     if (fd < 0) {
> +             SYSERROR("failed to open freezer at '%s'", nsgroup);
> +             return -1;
> +     }
> +
> +     if (freeze) {
> +             f = "FROZEN";
> +             ret = write(fd, f, strlen(f) + 1);
> +     } else {
> +             f = "THAWED";
> +             ret = write(fd, f, strlen(f) + 1);
> +
> +             /* compatibility code with old freezer interface */
> +             if (ret < 0) {
> +                     f = "RUNNING";
> +                     ret = write(fd, f, strlen(f) + 1) < 0;
> +             }
> +     }
> +
> +     if (ret < 0) {
> +             SYSERROR("failed to write '%s' to '%s'", f, freezer);
> +             goto out;
> +     }
> +
> +     while (1) {
> +             ret = lseek(fd, 0L, SEEK_SET);
> +             if (ret < 0) {
> +                     SYSERROR("failed to lseek on file '%s'", freezer);
> +                     goto out;
> +             }
> +
> +             ret = read(fd, tmpf, sizeof(tmpf));
> +             if (ret < 0) {
> +                     SYSERROR("failed to read to '%s'", freezer);
> +                     goto out;
> +             }
> +
> +             ret = strncmp(f, tmpf, strlen(f));
> +             if (!ret)
> +             {
> +                     if (name)
> +                             lxc_monitor_send_state(name, freeze ? FROZEN : 
> THAWED, lxcpath);
> +                     break;          /* Success */
> +             }
> +
> +             sleep(1);
> +
> +             ret = lseek(fd, 0L, SEEK_SET);
> +             if (ret < 0) {
> +                     SYSERROR("failed to lseek on file '%s'", freezer);
> +                     goto out;
> +             }
> +
> +             ret = write(fd, f, strlen(f) + 1);
> +             if (ret < 0) {
> +                     SYSERROR("failed to write '%s' to '%s'", f, freezer);
> +                     goto out;
> +             }
> +     }
> +
> +out:
> +     close(fd);
> +     return ret;
> +}
> +
> +int freeze_unfreeze(const char *name, int freeze, const char *lxcpath)
> +{
> +     char *cgabspath;
> +     int ret;
> +
> +     cgabspath = lxc_cgroup_get_hierarchy_abs_path("freezer", name, lxcpath);
> +     if (!cgabspath)
> +             return -1;
> +
> +     ret = do_unfreeze(cgabspath, freeze, name, lxcpath);
> +     free(cgabspath);
> +     return ret;
> +}
> +
> +lxc_state_t freezer_state(const char *name, const char *lxcpath)
> +{
> +     char *cgabspath = NULL;
> +     char freezer[MAXPATHLEN];
> +     char status[MAXPATHLEN];
> +     FILE *file;
> +     int ret;
> +
> +     cgabspath = lxc_cgroup_get_hierarchy_abs_path("freezer", name, lxcpath);
> +     if (!cgabspath)
> +             return -1;
> +
> +     ret = snprintf(freezer, MAXPATHLEN, "%s/freezer.state", cgabspath);
> +     if (ret < 0 || ret >= MAXPATHLEN)
> +             goto out;
> +
> +     file = fopen(freezer, "r");
> +     if (!file) {
> +             ret = -1;
> +             goto out;
> +     }
> +
> +     ret = fscanf(file, "%s", status);
> +     fclose(file);
> +
> +     if (ret == EOF) {
> +             SYSERROR("failed to read %s", freezer);
> +             ret = -1;
> +             goto out;
> +     }
> +
> +     ret = lxc_str2state(status);
> +
> +out:
> +     free(cgabspath);
> +     return ret;
> +}
> +
> diff --git a/src/lxc/cgroup.h b/src/lxc/cgroup.h
> index 0c0a678..3aab12d 100644
> --- a/src/lxc/cgroup.h
> +++ b/src/lxc/cgroup.h
> @@ -26,6 +26,8 @@
>  #include <stdint.h>
>  #include <stddef.h>
>  
> +#include "state.h"
> +
>  struct cgroup_hierarchy;
>  struct cgroup_meta_data;
>  struct cgroup_mount_point;
> @@ -164,4 +166,8 @@ extern int lxc_setup_mount_cgroup(const char *root, 
> struct cgroup_process_info *
>  
>  extern int lxc_cgroup_nrtasks_handler(struct lxc_handler *handler);
>  
> +extern int do_unfreeze(const char *nsgroup, int freeze, const char *name, 
> const char *lxcpath);
> +extern int freeze_unfreeze(const char *name, int freeze, const char 
> *lxcpath);
> +extern const char *lxc_state2str(lxc_state_t state);
> +extern lxc_state_t freezer_state(const char *name, const char *lxcpath);
>  #endif
> diff --git a/src/lxc/freezer.c b/src/lxc/freezer.c
> index 7b9f45f..53e9f64 100644
> --- a/src/lxc/freezer.c
> +++ b/src/lxc/freezer.c
> @@ -39,97 +39,6 @@
>  
>  lxc_log_define(lxc_freezer, lxc);
>  
> -static int do_unfreeze(const char *nsgroup, int freeze, const char *name, 
> const char *lxcpath)
> -{
> -     char freezer[MAXPATHLEN], *f;
> -     char tmpf[32];
> -     int fd, ret;
> -
> -     ret = snprintf(freezer, MAXPATHLEN, "%s/freezer.state", nsgroup);
> -     if (ret >= MAXPATHLEN) {
> -             ERROR("freezer.state name too long");
> -             return -1;
> -     }
> -
> -     fd = open(freezer, O_RDWR);
> -     if (fd < 0) {
> -             SYSERROR("failed to open freezer at '%s'", nsgroup);
> -             return -1;
> -     }
> -
> -     if (freeze) {
> -             f = "FROZEN";
> -             ret = write(fd, f, strlen(f) + 1);
> -     } else {
> -             f = "THAWED";
> -             ret = write(fd, f, strlen(f) + 1);
> -
> -             /* compatibility code with old freezer interface */
> -             if (ret < 0) {
> -                     f = "RUNNING";
> -                     ret = write(fd, f, strlen(f) + 1) < 0;
> -             }
> -     }
> -
> -     if (ret < 0) {
> -             SYSERROR("failed to write '%s' to '%s'", f, freezer);
> -             goto out;
> -     }
> -
> -     while (1) {
> -             ret = lseek(fd, 0L, SEEK_SET);
> -             if (ret < 0) {
> -                     SYSERROR("failed to lseek on file '%s'", freezer);
> -                     goto out;
> -             }
> -
> -             ret = read(fd, tmpf, sizeof(tmpf));
> -             if (ret < 0) {
> -                     SYSERROR("failed to read to '%s'", freezer);
> -                     goto out;
> -             }
> -
> -             ret = strncmp(f, tmpf, strlen(f));
> -             if (!ret)
> -             {
> -                     if (name)
> -                             lxc_monitor_send_state(name, freeze ? FROZEN : 
> THAWED, lxcpath);
> -                     break;          /* Success */
> -             }
> -
> -             sleep(1);
> -
> -             ret = lseek(fd, 0L, SEEK_SET);
> -             if (ret < 0) {
> -                     SYSERROR("failed to lseek on file '%s'", freezer);
> -                     goto out;
> -             }
> -
> -             ret = write(fd, f, strlen(f) + 1);
> -             if (ret < 0) {
> -                     SYSERROR("failed to write '%s' to '%s'", f, freezer);
> -                     goto out;
> -             }
> -     }
> -
> -out:
> -     close(fd);
> -     return ret;
> -}
> -
> -static int freeze_unfreeze(const char *name, int freeze, const char *lxcpath)
> -{
> -     char *cgabspath;
> -     int ret;
> -
> -     cgabspath = lxc_cgroup_get_hierarchy_abs_path("freezer", name, lxcpath);
> -     if (!cgabspath)
> -             return -1;
> -
> -     ret = do_unfreeze(cgabspath, freeze, name, lxcpath);
> -     free(cgabspath);
> -     return ret;
> -}
>  
>  int lxc_freeze(const char *name, const char *lxcpath)
>  {
> diff --git a/src/lxc/state.c b/src/lxc/state.c
> index a47341f..81648e0 100644
> --- a/src/lxc/state.c
> +++ b/src/lxc/state.c
> @@ -67,44 +67,6 @@ lxc_state_t lxc_str2state(const char *state)
>       return -1;
>  }
>  
> -static lxc_state_t freezer_state(const char *name, const char *lxcpath)
> -{
> -     char *cgabspath = NULL;
> -     char freezer[MAXPATHLEN];
> -     char status[MAXPATHLEN];
> -     FILE *file;
> -     int ret;
> -
> -     cgabspath = lxc_cgroup_get_hierarchy_abs_path("freezer", name, lxcpath);
> -     if (!cgabspath)
> -             return -1;
> -
> -     ret = snprintf(freezer, MAXPATHLEN, "%s/freezer.state", cgabspath);
> -     if (ret < 0 || ret >= MAXPATHLEN)
> -             goto out;
> -
> -     file = fopen(freezer, "r");
> -     if (!file) {
> -             ret = -1;
> -             goto out;
> -     }
> -
> -     ret = fscanf(file, "%s", status);
> -     fclose(file);
> -
> -     if (ret == EOF) {
> -             SYSERROR("failed to read %s", freezer);
> -             ret = -1;
> -             goto out;
> -     }
> -
> -     ret = lxc_str2state(status);
> -
> -out:
> -     free(cgabspath);
> -     return ret;
> -}
> -
>  lxc_state_t lxc_getstate(const char *name, const char *lxcpath)
>  {
>       lxc_state_t state = freezer_state(name, lxcpath);
> -- 
> 1.8.5.2
> 
> _______________________________________________
> lxc-devel mailing list
> [email protected]
> http://lists.linuxcontainers.org/listinfo/lxc-devel

-- 
Stéphane Graber
Ubuntu developer
http://www.ubuntu.com

Attachment: signature.asc
Description: Digital signature

_______________________________________________
lxc-devel mailing list
[email protected]
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to