summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDhaval Giani <dhaval@linux.vnet.ibm.com>2008-08-13 13:33:59 +0000
committerDhaval Giani <dhaval@linux.vnet.ibm.com>2008-08-13 13:33:59 +0000
commit5c16f4a02dfee006b7fb8a04162ed511e3abc481 (patch)
tree1cc90011ce99c5a329eb707b25ecd8cc40569c4c
parent9fe31868a0369e0659872c52c92cf688910593ee (diff)
downloadlibcg-5c16f4a02dfee006b7fb8a04162ed511e3abc481.zip
libcg-5c16f4a02dfee006b7fb8a04162ed511e3abc481.tar.gz
libcg-5c16f4a02dfee006b7fb8a04162ed511e3abc481.tar.xz
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.c34
1 files changed, 30 insertions, 4 deletions
diff --git a/api.c b/api.c
index 39703ac..41e0c6d 100644
--- a/api.c
+++ b/api.c
@@ -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.