* Ken'ichi Ohmichi <[email protected]> [2009-12-02 17:22:45]:
>
> Hi Balbir,
>
> Balbir Singh wrote:
> >> If writing an invalid value on a file of cgroup fs, write(2) returns -1
> >> with a right errno. But fprintf(3) does not return it, because fprintf(3)
> >> write on some buffer. So it is better that we check the return value of
> >> write(2).
> >>
> >
> > Hi, Kenichi,
> >
> > Does the code fragment (diff) below work for you?
> > Please note, it is not an appliable diff, it is a part of bigger
> > patch.
> >
> >
> > static int cg_set_control_value(char *path, char *val)
> > {
> > + int ret = 0;
> > FILE *control_file = NULL;
> > if (!cg_test_mounted_fs())
> > return ECGROUPNOTMOUNTED;
> > @@ -1078,9 +1080,14 @@ static int cg_set_control_value(char *path, char
> > *val)
> > return ECGROUPVALUENOTEXIST;
> > }
> >
> > - fprintf(control_file, "%s", val);
> > + ret = fprintf(control_file, "%s", val);
> > + if (ret < 0 || ret < strlen(val) + 1) {
> > + last_errno = errno;
> > + ret = ECGOTHER;
> > + } else
> > + ret = 0;
> > fclose(control_file);
> > - return 0;
> > + return ret;
> > }
>
> If the following /etc/cgconfig.conf, cgconfig should succeed.
> But it failed after applying your patch:
>
> # cat /etc/cgconfig.conf
> mount {
> cpuset = /mnt/cgroups/cpuset;
> }
> group usergroup {
> cpuset {
> cpuset.cpus = 0;
> cpuset.mems = 0;
> }
> }
>
> # service cgconfig stop
> Stopping cgconfig service: [ OK ]
> # service cgconfig start
> Starting cgconfig service: Loading configuration file /etc/cgconfig.conf
> failed
> Success
> Failed to parse /etc/cgconfig.conf [FAILED]
> #
>
>
> If you want to use fprintf(3), how about the attached patch ?
> The error handling against fclose(3) is added into the patch.
> fclose(3) write the buffer to a file, and it returns -1 if a writing
> error happens.
>
Yes, I missed adding a fflush(), but this should work as well. And oh!
I think my check for ret was not perfect, so this looks OK to me.
I'm perfectly fine applying this patch.
>
> Thanks
> Ken'ichi Ohmichi
>
> ----
> [PATCH-v2] Add the write error handling to cg_set_control_value().
>
> Changelog since v1:
> o Use fopen/fprintf/fclose instead of open/write/close.
> o Add the error handling against fclose.
>
> cg_set_control_value() is the function for setting a value to a file
> of cgroup file system. And current function does not handle the error
> of writing to a file. So we cannot know whether setting value is
> enable or not. This patch add the error handling for knowing it.
>
> Signed-off-by: Ken'ichi Ohmichi <[email protected]>
>
> diff --git a/src/api.c b/src/api.c
> index 28c0c3d..0b1bec0 100644
> --- a/src/api.c
> +++ b/src/api.c
> @@ -1078,8 +1078,15 @@ static int cg_set_control_value(char *path, char *val)
> return ECGROUPVALUENOTEXIST;
> }
>
> - fprintf(control_file, "%s", val);
> - fclose(control_file);
> + if (fprintf(control_file, "%s", val) < 0) {
> + last_errno = errno;
> + fclose(control_file);
> + return ECGOTHER;
> + }
> + if (fclose(control_file) < 0) {
> + last_errno = errno;
> + return ECGOTHER;
> + }
> return 0;
> }
>
>
--
Balbir
------------------------------------------------------------------------------
Join us December 9, 2009 for the Red Hat Virtual Experience,
a free event focused on virtualization and cloud computing.
Attend in-depth sessions from your desk. Your couch. Anywhere.
http://p.sf.net/sfu/redhat-sfdev2dev
_______________________________________________
Libcg-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/libcg-devel