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
signature.asc
Description: Digital signature
_______________________________________________ lxc-devel mailing list [email protected] http://lists.linuxcontainers.org/listinfo/lxc-devel
