diff options
author | Dhaval Giani <dhaval@linux.vnet.ibm.com> | 2008-08-13 13:33:59 +0000 |
---|---|---|
committer | Dhaval Giani <dhaval@linux.vnet.ibm.com> | 2008-08-13 13:33:59 +0000 |
commit | 5c16f4a02dfee006b7fb8a04162ed511e3abc481 (patch) | |
tree | 1cc90011ce99c5a329eb707b25ecd8cc40569c4c | |
parent | 9fe31868a0369e0659872c52c92cf688910593ee (diff) | |
download | libcg-5c16f4a02dfee006b7fb8a04162ed511e3abc481.tar.gz libcg-5c16f4a02dfee006b7fb8a04162ed511e3abc481.tar.xz libcg-5c16f4a02dfee006b7fb8a04162ed511e3abc481.zip |
libcgroup: check for return code of fprintf()
From: Vivek Goyal <vgoyal@redhat.com>
o Adding a task to a particular cgroup currently does fprintf() and never
check the return code. Modify it to check for the return code in case
fprintf() and fflush() did not succeed.
o I ran into the issues when i can't add migration thread to
/container/admingroup/tasks and it will fail silently.
Signed-off-by: Vivek Goyal <vgoyal@redhat.com>
Signed-off-by: Dhaval Giani <dhaval@linux.vnet.ibm.com>
git-svn-id: https://libcg.svn.sourceforge.net/svnroot/libcg/trunk@133 4f4bb910-9a46-0410-90c8-c897d4f1cd53
-rw-r--r-- | api.c | 34 |
1 files changed, 30 insertions, 4 deletions
@@ -309,7 +309,7 @@ int cgroup_attach_task_pid(struct cgroup *cgroup, pid_t tid) { char path[FILENAME_MAX]; FILE *tasks; - int i; + int i, ret = 0; if (!cgroup_initialized) { dbg ("libcgroup is not initialized\n"); @@ -335,7 +335,21 @@ int cgroup_attach_task_pid(struct cgroup *cgroup, pid_t tid) return ECGROUPNOTALLOWED; } } - fprintf(tasks, "%d", tid); + ret = fprintf(tasks, "%d", tid); + if (ret < 0) { + dbg("Error writing tid %d to %s:%s\n", + tid, path, strerror(errno)); + fclose(tasks); + return ECGOTHER; + } + + ret = fflush(tasks); + if (ret) { + dbg("Error writing tid %d to %s:%s\n", + tid, path, strerror(errno)); + fclose(tasks); + return ECGOTHER; + } fclose(tasks); } pthread_rwlock_unlock(&cg_mount_table_lock); @@ -366,12 +380,24 @@ int cgroup_attach_task_pid(struct cgroup *cgroup, pid_t tid) return ECGROUPNOTALLOWED; } } - fprintf(tasks, "%d", tid); + ret = fprintf(tasks, "%d", tid); + if (ret < 0) { + dbg("Error writing tid %d to %s:%s\n", + tid, path, strerror(errno)); + fclose(tasks); + return ECGOTHER; + } + ret = fflush(tasks); + if (ret) { + dbg("Error writing tid %d to %s:%s\n", + tid, path, strerror(errno)); + fclose(tasks); + return ECGOTHER; + } fclose(tasks); } } return 0; - } /** cgroup_attach_task is used to attach the current thread to a cgroup. |