[libvirt] [PATCH 3/3] Convert remainder of cgroups code to report errors
Eric Blake
eblake at redhat.com
Fri Jul 19 03:59:47 UTC 2013
On 07/18/2013 09:00 AM, Daniel P. Berrange wrote:
> From: "Daniel P. Berrange" <berrange at redhat.com>
>
> Convert the remainiing methods in vircgroup.c to report errors
s/remainiing/remaining/
> instead of returning errno values.
>
> Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
> ---
> src/util/vircgroup.c | 559 +++++++++++++++++++++++++++++----------------------
> 1 file changed, 314 insertions(+), 245 deletions(-)
>
> @@ -645,29 +661,22 @@ static int virCgroupCpuSetInherit(virCgroupPtr parent, virCgroupPtr group)
> for (i = 0; i < ARRAY_CARDINALITY(inherit_values); i++) {
> char *value;
>
> - rc = virCgroupGetValueStr(parent,
> - VIR_CGROUP_CONTROLLER_CPUSET,
> - inherit_values[i],
> - &value);
> - if (rc != 0) {
> - virReportSystemError(-rc,
> - _("Failed to get '%s'"), inherit_values[i]);
> + if (virCgroupGetValueStr(parent,
> + VIR_CGROUP_CONTROLLER_CPUSET,
> + inherit_values[i],
> + &value) < 0)
Aha - this cleans up something I noticed in 1/3.
> @@ -675,33 +684,23 @@ static int virCgroupCpuSetInherit(virCgroupPtr parent, virCgroupPtr group)
>
> -
> - if (rc != 0) {
> - virReportSystemError(-rc,
> - _("Failed to set '%s'"), filename);
> + if (virCgroupSetValueU64(group,
> + VIR_CGROUP_CONTROLLER_MEMORY,
> + filename, 1) < 0)
> return -1;
> - }
>
> return 0;
Can code like this be simplified to:
return virCgroupSetValueU64(group,
VIR_CGROUP_CONTROLLER_MEMORY,
filename, 1);
> @@ -968,11 +964,11 @@ int virCgroupRemove(virCgroupPtr group)
> * @group: The cgroup to add a task to
> * @pid: The pid of the task to add
> *
> - * Returns: 0 on success
> + * Returns: 0 on success, -1 on error
> */
> int virCgroupAddTask(virCgroupPtr group, pid_t pid)
Ouch - at least src/qemu/qemu_cgroup.c calls this function, and still
expects errno values:
rc = virCgroupAddTask(cgroup_vcpu, priv->vcpupids[i]);
if (rc < 0) {
virReportSystemError(-rc,
_("unable to add vcpu %zu task %d to
cgroup"),
i, priv->vcpupids[i]);
goto cleanup;
}
I didn't look elsewhere; all I needed was one counterexample to state
your patch is incomplete until you audit all callers impacted by
semantic changes.
> @@ -1019,22 +1023,28 @@ static int virCgroupAddTaskStrController(virCgroupPtr group,
> + if (virCgroupAddTaskController(group, p, controller) < 0) {
> + virErrorPtr err = virGetLastError();
> + /* A thread that exits between when we first read the source
> + * tasks and now is not fatal. */
> + if (err && err->code == VIR_ERR_SYSTEM_ERROR &&
> + err->int1 == ESRCH) {
shorter as 'if (virLastErrorIsSystemErrno(ESRCH))'
> @@ -1645,18 +1659,30 @@ int virCgroupSetBlkioDeviceWeight(virCgroupPtr group,
> + if (stat(path, &sb) < 0) {
> + virReportSystemError(errno,
> + _("Path '%s' is not accessible"),
> + path);
> + return -1;
> + }
>
> - if (!S_ISBLK(sb.st_mode))
> - return -EINVAL;
> + if (!S_ISBLK(sb.st_mode)) {
> + virReportSystemError(errno,
errno is wrong here - stat() succeeded. You want to explicitly report
EINVAL.
> @@ -2582,8 +2648,9 @@ static char *virCgroupIdentifyRoot(virCgroupPtr group)
> return NULL;
> }
>
> - ignore_value(VIR_STRNDUP_QUIET(ret, group->controllers[i].mountPoint,
> - tmp - group->controllers[i].mountPoint));
> + if (VIR_STRNDUP(ret, group->controllers[i].mountPoint,
> + tmp - group->controllers[i].mountPoint) < 0)
> + return NULL;
> return ret;
You can still use ignore_value() here rather than 'if', if desired,
since ret will be NULL if VIR_STRNDUP fails.
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 621 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20130718/bc99ab70/attachment-0001.sig>
More information about the libvir-list
mailing list