On 05/13/2011 03:17 PM, Michal Hocko wrote:
> We cannot setup file or directory permissions in (/etc/cgconfig.conf)
> configuration file while we can do this with available tools.
> This patch adds new two options fperm, dperm.
> Task section supports only fperm, because there are no directories
> involved while admin section supports both of them.
> 
> Example:
> /etc/cgconfig.conf:
> mount {
>       cpu = /dev/cpuctl;
> }
> group devel {
>       perm {
>               task {
>                       uid = root;
>                       gid = cgroup;
>                       fperm = 660;
>               }
>               admin {
>                       uid = root;
>                       gid = cgroup;
>                       dperm = 775;
>               }
>       }
>       cpu {
>               cpu.shares = 5120;
>       }
> }
> 
> $ tools/cgconfigparser -l /etc/cgconfig.conf
> $ ls -la /dev/cpuctl/devel/
> total 0
> drwxrwxr-x 2 root cgroup 0 May 13 15:22 .
> drwxr-xr-x 3 root root   0 May 13 15:22 ..
> -rw-r--r-- 1 root cgroup 0 May 13 15:22 cgroup.clone_children
> --w--w--w- 1 root cgroup 0 May 13 15:22 cgroup.event_control
> -r--r--r-- 1 root cgroup 0 May 13 15:22 cgroup.procs
> -rw-r--r-- 1 root cgroup 0 May 13 15:22 cpu.rt_period_us
> -rw-r--r-- 1 root cgroup 0 May 13 15:22 cpu.rt_runtime_us
> -rw-r--r-- 1 root cgroup 0 May 13 15:22 cpu.shares
> -rw-r--r-- 1 root cgroup 0 May 13 15:22 notify_on_release
> -rw-rw---- 1 root cgroup 0 May 13 15:22 tasks
> 
> This patch enhances parser callbacks to initialize cgroup->task_fperm
> and cgroup->control_[fd]perm and forces chmod at general
> cgroup_create_cgroup level. This is safe because everybody who uses
> cgroup has those values initialized to -1 unless they are set and then
> they should be used.
> 
> Signed-off-by: Michal Hocko <mho...@suse.cz>
> ---
>  src/api.c    |   11 +++++++++++
>  src/config.c |   24 ++++++++++++++++++++++++
>  2 files changed, 35 insertions(+), 0 deletions(-)
> 
> diff --git a/src/api.c b/src/api.c
> index 53c76e8..eb9f902 100644
> --- a/src/api.c
> +++ b/src/api.c
> @@ -1456,6 +1456,13 @@ int cgroup_create_cgroup(struct cgroup *cgroup, int 
> ignore_ownership)
>                       cgroup_dbg("Changing ownership of %s\n", fts_path[0]);
>                       error = cg_chown_recursive(fts_path,
>                               cgroup->control_uid, cgroup->control_gid);
> +                     if (!error) {
> +                             error = cg_chmod_recursive(cgroup,
> +                                             cgroup->control_dperm,
> +                                             cgroup->control_dperm != 
> NO_PERMS,
> +                                             cgroup->control_fperm,
> +                                             cgroup->control_fperm != 
> NO_PERMS);
> +                     }

cg_chmod_recursive works on entire cgroup, while cg_chown_recursive
works per controller.

And when looking at cg_chmod_recursive, it is badly broken, it changes
permissions only in the first hierarchy the cgroup is in. There is
simple way how to fix it, I've already sent a patch. With my patch, you
can then use cg_chmod_recursive_controller() here + add new argument
owner_is_umask to it in your patch 3/3, you don't need
__cg_chmod_recursive() then.


>               }
>  
>               if (error)
> @@ -1502,11 +1509,15 @@ int cgroup_create_cgroup(struct cgroup *cgroup, int 
> ignore_ownership)
>                       }
>                       error = chown(path, cgroup->tasks_uid,
>                                                       cgroup->tasks_gid);
> +                     if (!error && cgroup->task_fperm != NO_PERMS)
> +                             error = chmod(path, cgroup->task_fperm);
> +
>                       if (error) {
>                               last_errno = errno;
>                               error = ECGOTHER;
>                               goto err;
>                       }
> +
>               }
>               free(base);
>               base = NULL;
> diff --git a/src/config.c b/src/config.c
> index 4f5d04a..5c57eee 100644
> --- a/src/config.c
> +++ b/src/config.c
> @@ -236,6 +236,14 @@ int cgroup_config_group_task_perm(char *perm_type, char 
> *value)
>               config_cgroup->tasks_gid = val;
>       }
>  
> +     if(!strcmp(perm_type, "fperm")) {
> +             char *endptr;
> +             val = strtol(value, &endptr, 8);
> +             if (*endptr)
> +                     goto group_task_error;
> +             config_cgroup->task_fperm = val;
> +     }
> +
>       free(perm_type);
>       free(value);
>       return 1;
> @@ -302,6 +310,22 @@ int cgroup_config_group_admin_perm(char *perm_type, char 
> *value)
>               config_cgroup->control_gid = val;
>       }
>  
> +     if(!strcmp(perm_type, "fperm")) {
> +             char *endptr;
> +             val = strtol(value, &endptr, 8);
> +             if (*endptr)
> +                     goto admin_error;
> +             config_cgroup->control_fperm = val;
> +     }
> +
> +     if(!strcmp(perm_type, "dperm")) {
> +             char *endptr;
> +             val = strtol(value, &endptr, 8);
> +             if (*endptr)
> +                     goto admin_error;
> +             config_cgroup->control_dperm = val;
> +     }
> +
>       free(perm_type);
>       free(value);
>       return 1;


------------------------------------------------------------------------------
vRanger cuts backup time in half-while increasing security.
With the market-leading solution for virtual backup and recovery, 
you get blazing-fast, flexible, and affordable data protection.
Download your free trial now. 
http://p.sf.net/sfu/quest-d2dcopy1
_______________________________________________
Libcg-devel mailing list
Libcg-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/libcg-devel

Reply via email to