vc_set_sched_v21(xid_t xid, struct vc_set_sched const *data)
{
struct vcmd_set_sched_v4 k_data;
+ int ret;
- k_data.set_mask = data->set_mask;
k_data.fill_rate = data->fill_rate;
k_data.interval = data->interval;
k_data.tokens = data->tokens;
k_data.cpu_id = data->cpu_id;
k_data.bucket_id = data->bucket_id;
- return vserver(VCMD_set_sched, CTX_USER2KERNEL(xid), &k_data);
+ if ((data->set_mask & VC_VXSM_FILL_RATE2 && data->fill_rate != data->fill_rate2) ||
+ (data->set_mask & VC_VXSM_INTERVAL2 && data->interval != data->interval2)) {
+ /* first set the regular values */
+ k_data.set_mask = data->set_mask & ~(VC_VXSM_FILL_RATE2|VC_VXSM_INTERVAL2|VC_VXSM_FORCE);
+ ret = vserver(VCMD_set_sched, CTX_USER2KERNEL(xid), &k_data);
+ if (ret)
+ return ret;
+ /* then set idle time */
+ k_data.set_mask = data->set_mask & (VC_VXSM_FILL_RATE2|VC_VXSM_INTERVAL2|VC_VXSM_FORCE|VC_VXSM_IDLE_TIME|VC_VXSM_CPU_ID|VC_VXSM_BUCKET_ID);
+ k_data.fill_rate = data->fill_rate2;
+ k_data.interval = data->interval2;
+ return vserver(VCMD_set_sched, CTX_USER2KERNEL(xid), &k_data);
+ }
+ else {
+ k_data.set_mask = data->set_mask;
+ return vserver(VCMD_set_sched, CTX_USER2KERNEL(xid), &k_data);
+ }
}