File lxcvirsh.patch of Package libvirt

Add generic parameter=value support for virsh's schedinfo command

This patch maintains the two Xen-specific --weight and --cap options,
but adds support for setting arbitrary parameters by specifying them in
param=value syntax.

Changes to the virsh manual are included.

Changes:
 - Replace use of 'a' conversion modifier with pre-alloc

Index: libvirt-0.4.6/docs/virsh.pod
===================================================================
--- libvirt-0.4.6.orig/docs/virsh.pod
+++ libvirt-0.4.6/docs/virsh.pod
@@ -322,12 +322,14 @@ This is roughly equivalent to doing a hi
 with all the same limitations.  Open network connections may be
 severed upon restore, as TCP timeouts may have expired.
 
+=item B<schedinfo> optional I<--set> B<parameter=value> I<domain-id>
+
 =item B<schedinfo> optional I<--weight> B<number> optional I<--cap> B<number> I<domain-id>
 
-Allows to show (and set) the domain scheduler parameters. This is currently
-only defined for XEN_CREDIT scheduler, and the optional weight and cap
-arguments allows to set the associated parameters in that scheduler if
-provided.
+Allows to show (and set) the domain scheduler parameters.
+
+B<Note>: The weight and cap parameters are defined only for the
+XEN_CREDIT scheduler and are now I<DEPRECATED>.
 
 =item B<setmem> I<domain-id> B<kilobytes>
 
Index: libvirt-0.4.6/src/virsh.c
===================================================================
--- libvirt-0.4.6.orig/src/virsh.c
+++ libvirt-0.4.6/src/virsh.c
@@ -1295,6 +1295,7 @@ static const vshCmdInfo info_schedinfo[]
 
 static const vshCmdOptDef opts_schedinfo[] = {
     {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("domain name, id or uuid")},
+    {"set", VSH_OT_STRING, VSH_OFLAG_NONE, gettext_noop("parameter=value")},
     {"weight", VSH_OT_INT, VSH_OFLAG_NONE, gettext_noop("weight for XEN_CREDIT")},
     {"cap", VSH_OT_INT, VSH_OFLAG_NONE, gettext_noop("cap for XEN_CREDIT")},
     {NULL, 0, 0, NULL}
@@ -1304,6 +1305,9 @@ static int
 cmdSchedinfo(vshControl *ctl, const vshCmd *cmd)
 {
     char *schedulertype;
+    char *set;
+    char *param_name = NULL;
+    long long int param_value = 0;
     virDomainPtr dom;
     virSchedParameterPtr params = NULL;
     int i, ret;
@@ -1311,6 +1315,7 @@ cmdSchedinfo(vshControl *ctl, const vshC
     int nr_inputparams = 0;
     int inputparams = 0;
     int weightfound = 0;
+    int setfound = 0;
     int weight = 0;
     int capfound = 0;
     int cap = 0;
@@ -1324,7 +1329,7 @@ cmdSchedinfo(vshControl *ctl, const vshC
     if (!(dom = vshCommandOptDomain(ctl, cmd, "domain", NULL)))
         return FALSE;
 
-    /* Currently supports Xen Credit only */
+    /* Deprecated Xen-only options */
     if(vshCommandOptBool(cmd, "weight")) {
         weight = vshCommandOptInt(cmd, "weight", &weightfound);
         if (!weightfound) {
@@ -1345,6 +1350,25 @@ cmdSchedinfo(vshControl *ctl, const vshC
         }
     }
 
+    if(vshCommandOptBool(cmd, "set")) {
+        set = vshCommandOptString(cmd, "set", &setfound);
+        if (!setfound) {
+            vshError(ctl, FALSE, "%s", _("Error getting param"));
+            goto cleanup;
+        }
+
+        param_name = vshMalloc(ctl, strlen(set) + 1);
+        if (param_name == NULL)
+            goto cleanup;
+
+        if (sscanf(set, "%[^=]=%i", param_name, &param_value) != 2) {
+            vshError(ctl, FALSE, "%s", _("Invalid value of param"));
+            goto cleanup;
+        }
+
+        nr_inputparams++;
+    }
+
     params = vshMalloc(ctl, sizeof (virSchedParameter) * nr_inputparams);
     if (params == NULL) {
         goto cleanup;
@@ -1363,7 +1387,14 @@ cmdSchedinfo(vshControl *ctl, const vshC
          params[inputparams].value.ui = cap;
          inputparams++;
     }
-    /* End Currently supports Xen Credit only */
+    /* End Deprecated Xen-only options */
+
+    if (setfound) {
+        strncpy(params[inputparams].field,param_name,sizeof(params[0].field));
+        params[inputparams].type = VIR_DOMAIN_SCHED_FIELD_LLONG;
+        params[inputparams].value.l = param_value;
+        inputparams++;
+    }
 
     assert (inputparams == nr_inputparams);
 
@@ -1430,6 +1461,7 @@ cmdSchedinfo(vshControl *ctl, const vshC
     }
  cleanup:
     free(params);
+    free(param_name);
     virDomainFree(dom);
     return ret_val;
 }
openSUSE Build Service is sponsored by