On Thu, Jan 24, 2019 at 4:53 AM Tom Hromatka <tom.hroma...@oracle.com> wrote: > > In preparation for adding support for cgroup v2, this > commit moves some cgroup v1 mount logic out of > cgroup_init() and into its own function. > > Signed-off-by: Tom Hromatka <tom.hroma...@oracle.com> > --- > src/api.c | 218 > +++++++++++++++++++++++++++++++++----------------------------- > 1 file changed, 117 insertions(+), 101 deletions(-) > > diff --git a/src/api.c b/src/api.c > index 0bf0615..5003c32 100644 > --- a/src/api.c > +++ b/src/api.c > @@ -970,6 +970,119 @@ int cg_add_duplicate_mount(struct cg_mount_table_s > *item, const char *path) > } > > /** > + * Process a cgroup v1 mount and add it to cg_mount_table if it's not a > + * duplicate. > + * > + * @param controllers List of controllers from /proc/cgroups > + * @param ent File system description of cgroup mount being processed > + * @param found_mnt cg_mount_table index > + */ > +static int process_v1_mnt(char *controllers[], struct mntent *ent, > + int *found_mnt)
cgroup_v1_mount ? We try to prefix all functions inside libcgroup with a cgroup, to have the namespace respected. > +{ > + char *strtok_buffer = NULL, *mntopt = NULL; > + int duplicate = 0; > + int i, j, ret = 0; > + > + for (i = 0; controllers[i] != NULL; i++) { > + mntopt = hasmntopt(ent, controllers[i]); > + > + if (!mntopt) > + continue; > + > + cgroup_dbg("found %s in %s\n", controllers[i], ent->mnt_opts); > + > + /* do not have duplicates in mount table */ > + duplicate = 0; > + for (j = 0; j < *found_mnt; j++) { > + if (strncmp(controllers[i], > + cg_mount_table[j].name, > + FILENAME_MAX) == 0) { > + duplicate = 1; > + break; > + } > + } > + if (duplicate) { > + cgroup_dbg("controller %s is already mounted on %s\n", > + mntopt, cg_mount_table[j].mount.path); > + ret = cg_add_duplicate_mount(&cg_mount_table[j], > + ent->mnt_dir); > + if (ret) > + goto out; > + /* continue with next controller */ > + continue; > + } > + > + strncpy(cg_mount_table[*found_mnt].name, > + controllers[i], FILENAME_MAX); > + cg_mount_table[*found_mnt].name[FILENAME_MAX-1] = '\0'; > + strncpy(cg_mount_table[*found_mnt].mount.path, > + ent->mnt_dir, FILENAME_MAX); > + cg_mount_table[*found_mnt].mount.path[FILENAME_MAX-1] = > + '\0'; > + cg_mount_table[*found_mnt].mount.next = NULL; > + cgroup_dbg("Found cgroup option %s, count %d\n", > + ent->mnt_opts, *found_mnt); > + (*found_mnt)++; > + } > + > + /* > + * Doesn't match the controller. > + * Check if it is a named hierarchy. > + */ > + mntopt = hasmntopt(ent, "name"); > + > + if (mntopt) { > + mntopt = strtok_r(mntopt, ",", &strtok_buffer); > + if (!mntopt) > + goto out; > + /* > + * Check if it is a duplicate > + */ > + duplicate = 0; > + > +#ifdef OPAQUE_HIERARCHY > + /* > + * Ignore the opaque hierarchy. > + */ > + if (strcmp(mntopt, OPAQUE_HIERARCHY) == 0) > + goto out; > +#endif > + > + for (j = 0; j < *found_mnt; j++) { > + if (strncmp(mntopt, cg_mount_table[j].name, > + FILENAME_MAX) == 0) { > + duplicate = 1; > + break; > + } > + } > + > + if (duplicate) { > + cgroup_dbg("controller %s is already mounted on %s\n", > + mntopt, cg_mount_table[j].mount.path); > + ret = cg_add_duplicate_mount(&cg_mount_table[j], > + ent->mnt_dir); > + goto out; > + } > + > + strncpy(cg_mount_table[*found_mnt].name, > + mntopt, FILENAME_MAX); > + cg_mount_table[*found_mnt].name[FILENAME_MAX-1] = '\0'; > + strncpy(cg_mount_table[*found_mnt].mount.path, > + ent->mnt_dir, FILENAME_MAX); > + cg_mount_table[*found_mnt].mount.path[FILENAME_MAX-1] = > + '\0'; > + cg_mount_table[*found_mnt].mount.next = NULL; > + cgroup_dbg("Found cgroup option %s, count %d\n", > + ent->mnt_opts, *found_mnt); > + (*found_mnt)++; > + } > + > +out: > + return ret; > +} > + > +/** > * cgroup_init(), initializes the MOUNT_POINT. > * > * This code is theoretically thread safe now. Its not really tested > @@ -989,13 +1102,9 @@ int cgroup_init(void) > char subsys_name[FILENAME_MAX]; > int hierarchy, num_cgroups, enabled; > int i = 0; > - int j; > - int duplicate = 0; > - char *mntopt = NULL; > int err; > char *buf = NULL; > char mntent_buffer[4 * FILENAME_MAX]; > - char *strtok_buffer = NULL; > > cgroup_set_default_logger(-1); > > @@ -1075,103 +1184,10 @@ int cgroup_init(void) > while ((ent = getmntent_r(proc_mount, temp_ent, > mntent_buffer, > sizeof(mntent_buffer))) != NULL) { > - if (strcmp(ent->mnt_type, "cgroup")) > - continue; > - > - for (i = 0; controllers[i] != NULL; i++) { > - mntopt = hasmntopt(ent, controllers[i]); > - > - if (!mntopt) > - continue; > - > - cgroup_dbg("found %s in %s\n", controllers[i], > ent->mnt_opts); > - > - /* do not have duplicates in mount table */ > - duplicate = 0; > - for (j = 0; j < found_mnt; j++) { > - if (strncmp(controllers[i], > - > cg_mount_table[j].name, > - FILENAME_MAX) == 0) { > - duplicate = 1; > - break; > - } > - } > - if (duplicate) { > - cgroup_dbg("controller %s is already mounted > on %s\n", > - mntopt, cg_mount_table[j].mount.path); > - ret = > cg_add_duplicate_mount(&cg_mount_table[j], > - ent->mnt_dir); > - if (ret) > - goto unlock_exit; > - /* continue with next controller */ > - continue; > - } > - > - strncpy(cg_mount_table[found_mnt].name, > - controllers[i], FILENAME_MAX); > - cg_mount_table[found_mnt].name[FILENAME_MAX-1] = '\0'; > - strncpy(cg_mount_table[found_mnt].mount.path, > - ent->mnt_dir, FILENAME_MAX); > - cg_mount_table[found_mnt].mount.path[FILENAME_MAX-1] = > - '\0'; > - cg_mount_table[found_mnt].mount.next = NULL; > - cgroup_dbg("Found cgroup option %s, count %d\n", > - ent->mnt_opts, found_mnt); > - found_mnt++; > - } > - > - /* > - * Doesn't match the controller. > - * Check if it is a named hierarchy. > - */ > - mntopt = hasmntopt(ent, "name"); > - > - if (mntopt) { > - mntopt = strtok_r(mntopt, ",", &strtok_buffer); > - if (!mntopt) > - continue; > - /* > - * Check if it is a duplicate > - */ > - duplicate = 0; > - > -#ifdef OPAQUE_HIERARCHY > - /* > - * Ignore the opaque hierarchy. > - */ > - if (strcmp(mntopt, OPAQUE_HIERARCHY) == 0) > - continue; > -#endif > - > - for (j = 0; j < found_mnt; j++) { > - if (strncmp(mntopt, cg_mount_table[j].name, > - FILENAME_MAX) == 0) { > - duplicate = 1; > - break; > - } > - } > - > - if (duplicate) { > - cgroup_dbg("controller %s is already mounted > on %s\n", > - mntopt, cg_mount_table[j].mount.path); > - ret = > cg_add_duplicate_mount(&cg_mount_table[j], > - ent->mnt_dir); > - if (ret) > - goto unlock_exit; > - continue; > - } > - > - strncpy(cg_mount_table[found_mnt].name, > - mntopt, FILENAME_MAX); > - cg_mount_table[found_mnt].name[FILENAME_MAX-1] = '\0'; > - strncpy(cg_mount_table[found_mnt].mount.path, > - ent->mnt_dir, FILENAME_MAX); > - cg_mount_table[found_mnt].mount.path[FILENAME_MAX-1] = > - '\0'; > - cg_mount_table[found_mnt].mount.next = NULL; > - cgroup_dbg("Found cgroup option %s, count %d\n", > - ent->mnt_opts, found_mnt); > - found_mnt++; > + if (strcmp(ent->mnt_type, "cgroup") == 0) { > + ret = process_v1_mnt(controllers, ent, &found_mnt); > + if (ret) > + goto unlock_exit; > } > } > > -- > 1.8.3.1 > > > > _______________________________________________ > Libcg-devel mailing list > Libcg-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/libcg-devel _______________________________________________ Libcg-devel mailing list Libcg-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/libcg-devel