mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
Add some functions allowing to retrieve and set Xenstore quota (either global or domain specific). Signed-off-by: Juergen Gross <jgross@suse.com> Acked-by: Nick Rosbrook <enr0n@ubuntu.com> # golang stuff Reviewed-by: Anthony PERARD <anthony.perard@vates.tech>
117 lines
2.9 KiB
C
117 lines
2.9 KiB
C
/* SPDX-License-Identifier: LGPL-2.1-only */
|
|
|
|
/* Xenstore quota handling functions. */
|
|
|
|
#include "libxl_internal.h"
|
|
|
|
static int get_quota(libxl_ctx *ctx, unsigned int domid,
|
|
libxl_xs_quota_list *q_out,
|
|
bool (func)(struct xs_handle *h, unsigned int domid,
|
|
const char *quota, unsigned int *value))
|
|
{
|
|
const char **names;
|
|
unsigned int num, i;
|
|
bool ok;
|
|
int rc;
|
|
GC_INIT(ctx);
|
|
|
|
libxl_xs_quota_list_init(q_out);
|
|
names = xs_get_quota_names(ctx->xsh, &num);
|
|
if (!names) {
|
|
/* Xenstore quota support is optional! */
|
|
if (errno != ENOSYS) {
|
|
libxl_xs_quota_list_dispose(q_out);
|
|
rc = ERROR_FAIL;
|
|
} else {
|
|
rc = 0;
|
|
}
|
|
goto out;
|
|
}
|
|
|
|
q_out->num_quota = num;
|
|
q_out->quota = libxl__calloc(NOGC, num, sizeof(*q_out->quota));
|
|
for (i = 0; i < num; i++) {
|
|
q_out->quota[i].name = libxl__strdup(NOGC, names[i]);
|
|
ok = func(ctx->xsh, domid, q_out->quota[i].name, &q_out->quota[i].val);
|
|
if (!ok) {
|
|
libxl_xs_quota_list_dispose(q_out);
|
|
rc = ERROR_FAIL;
|
|
goto out;
|
|
}
|
|
}
|
|
|
|
rc = 0;
|
|
|
|
out:
|
|
free(names);
|
|
|
|
GC_FREE;
|
|
return rc;
|
|
}
|
|
|
|
static int set_quota(libxl_ctx *ctx, unsigned int domid, libxl_xs_quota_list *q,
|
|
bool (func)(struct xs_handle *h, unsigned int domid,
|
|
const char *quota, unsigned int value))
|
|
{
|
|
unsigned int i;
|
|
bool ok;
|
|
int rc;
|
|
GC_INIT(ctx);
|
|
|
|
for (i = 0; i < q->num_quota; i++) {
|
|
ok = func(ctx->xsh, domid, q->quota[i].name, q->quota[i].val);
|
|
if (!ok) {
|
|
rc = ERROR_FAIL;
|
|
goto out;
|
|
}
|
|
}
|
|
|
|
rc = 0;
|
|
|
|
out:
|
|
GC_FREE;
|
|
return rc;
|
|
}
|
|
|
|
static bool get_global_quota(struct xs_handle *h, unsigned int domid,
|
|
const char *quota, unsigned int *value)
|
|
{
|
|
return xs_get_global_quota(h, quota, value);
|
|
}
|
|
|
|
int libxl_xs_quota_global_get(libxl_ctx *ctx, libxl_xs_quota_list *q_out)
|
|
{
|
|
return get_quota(ctx, 0, q_out, get_global_quota);
|
|
}
|
|
|
|
static bool set_global_quota(struct xs_handle *h, unsigned int domid,
|
|
const char *quota, unsigned int value)
|
|
{
|
|
return xs_set_global_quota(h, quota, value);
|
|
}
|
|
|
|
int libxl_xs_quota_global_set(libxl_ctx *ctx, libxl_xs_quota_list *q)
|
|
{
|
|
return set_quota(ctx, 0, q, set_global_quota);;
|
|
}
|
|
|
|
int libxl_xs_quota_domain_get(libxl_ctx *ctx, uint32_t domid,
|
|
libxl_xs_quota_list *q_out)
|
|
{
|
|
return get_quota(ctx, domid, q_out, xs_get_domain_quota);
|
|
}
|
|
|
|
int libxl_xs_quota_domain_set(libxl_ctx *ctx, uint32_t domid,
|
|
libxl_xs_quota_list *q)
|
|
{
|
|
return set_quota(ctx, domid, q, xs_set_domain_quota);
|
|
}
|
|
|
|
/*
|
|
* Local variables:
|
|
* mode: C
|
|
* c-basic-offset: 4
|
|
* indent-tabs-mode: nil
|
|
* End:
|
|
*/
|