mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
vircgroup: extract virCgroupV1ValidateMachineGroup
Reviewed-by: Fabiano Fidêncio <fidencio@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com> Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
This commit is contained in:
parent
f60af21594
commit
61629d5be3
@ -212,7 +212,7 @@ virCgroupPartitionNeedsEscaping(const char *path)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
int
|
||||||
virCgroupPartitionEscape(char **path)
|
virCgroupPartitionEscape(char **path)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
@ -231,87 +231,6 @@ virCgroupPartitionEscape(char **path)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static bool
|
|
||||||
virCgroupValidateMachineGroup(virCgroupPtr group,
|
|
||||||
const char *name,
|
|
||||||
const char *drivername,
|
|
||||||
const char *machinename)
|
|
||||||
{
|
|
||||||
size_t i;
|
|
||||||
VIR_AUTOFREE(char *) partname = NULL;
|
|
||||||
VIR_AUTOFREE(char *) scopename_old = NULL;
|
|
||||||
VIR_AUTOFREE(char *) scopename_new = NULL;
|
|
||||||
VIR_AUTOFREE(char *) partmachinename = NULL;
|
|
||||||
|
|
||||||
if (virAsprintf(&partname, "%s.libvirt-%s",
|
|
||||||
name, drivername) < 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (virCgroupPartitionEscape(&partname) < 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (virAsprintf(&partmachinename, "%s.libvirt-%s",
|
|
||||||
machinename, drivername) < 0 ||
|
|
||||||
virCgroupPartitionEscape(&partmachinename) < 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (!(scopename_old = virSystemdMakeScopeName(name, drivername, true)))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (!(scopename_new = virSystemdMakeScopeName(machinename,
|
|
||||||
drivername, false)))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (virCgroupPartitionEscape(&scopename_old) < 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (virCgroupPartitionEscape(&scopename_new) < 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
for (i = 0; i < VIR_CGROUP_CONTROLLER_LAST; i++) {
|
|
||||||
char *tmp;
|
|
||||||
|
|
||||||
if (i == VIR_CGROUP_CONTROLLER_SYSTEMD)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (!group->controllers[i].placement)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
tmp = strrchr(group->controllers[i].placement, '/');
|
|
||||||
if (!tmp)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (i == VIR_CGROUP_CONTROLLER_CPU ||
|
|
||||||
i == VIR_CGROUP_CONTROLLER_CPUACCT ||
|
|
||||||
i == VIR_CGROUP_CONTROLLER_CPUSET) {
|
|
||||||
if (STREQ(tmp, "/emulator"))
|
|
||||||
*tmp = '\0';
|
|
||||||
tmp = strrchr(group->controllers[i].placement, '/');
|
|
||||||
if (!tmp)
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
tmp++;
|
|
||||||
|
|
||||||
if (STRNEQ(tmp, name) &&
|
|
||||||
STRNEQ(tmp, machinename) &&
|
|
||||||
STRNEQ(tmp, partname) &&
|
|
||||||
STRNEQ(tmp, partmachinename) &&
|
|
||||||
STRNEQ(tmp, scopename_old) &&
|
|
||||||
STRNEQ(tmp, scopename_new)) {
|
|
||||||
VIR_DEBUG("Name '%s' for controller '%s' does not match "
|
|
||||||
"'%s', '%s', '%s', '%s' or '%s'",
|
|
||||||
tmp, virCgroupControllerTypeToString(i),
|
|
||||||
name, machinename, partname,
|
|
||||||
scopename_old, scopename_new);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
virCgroupCopyMounts(virCgroupPtr group,
|
virCgroupCopyMounts(virCgroupPtr group,
|
||||||
virCgroupPtr parent)
|
virCgroupPtr parent)
|
||||||
@ -1504,7 +1423,7 @@ virCgroupNewDetectMachine(const char *name,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!virCgroupValidateMachineGroup(*group, name, drivername, machinename)) {
|
if (!(*group)->backend->validateMachineGroup(*group, name, drivername, machinename)) {
|
||||||
VIR_DEBUG("Failed to validate machine name for '%s' driver '%s'",
|
VIR_DEBUG("Failed to validate machine name for '%s' driver '%s'",
|
||||||
name, drivername);
|
name, drivername);
|
||||||
virCgroupFree(group);
|
virCgroupFree(group);
|
||||||
|
@ -35,11 +35,18 @@ typedef enum {
|
|||||||
typedef bool
|
typedef bool
|
||||||
(*virCgroupAvailableCB)(void);
|
(*virCgroupAvailableCB)(void);
|
||||||
|
|
||||||
|
typedef bool
|
||||||
|
(*virCgroupValidateMachineGroupCB)(virCgroupPtr group,
|
||||||
|
const char *name,
|
||||||
|
const char *drivername,
|
||||||
|
const char *machinename);
|
||||||
|
|
||||||
struct _virCgroupBackend {
|
struct _virCgroupBackend {
|
||||||
virCgroupBackendType type;
|
virCgroupBackendType type;
|
||||||
|
|
||||||
/* Mandatory callbacks that need to be implemented for every backend. */
|
/* Mandatory callbacks that need to be implemented for every backend. */
|
||||||
virCgroupAvailableCB available;
|
virCgroupAvailableCB available;
|
||||||
|
virCgroupValidateMachineGroupCB validateMachineGroup;
|
||||||
};
|
};
|
||||||
typedef struct _virCgroupBackend virCgroupBackend;
|
typedef struct _virCgroupBackend virCgroupBackend;
|
||||||
typedef virCgroupBackend *virCgroupBackendPtr;
|
typedef virCgroupBackend *virCgroupBackendPtr;
|
||||||
|
@ -53,6 +53,8 @@ struct _virCgroup {
|
|||||||
virCgroupController controllers[VIR_CGROUP_CONTROLLER_LAST];
|
virCgroupController controllers[VIR_CGROUP_CONTROLLER_LAST];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
int virCgroupPartitionEscape(char **path);
|
||||||
|
|
||||||
int virCgroupNewPartition(const char *path,
|
int virCgroupNewPartition(const char *path,
|
||||||
bool create,
|
bool create,
|
||||||
int controllers,
|
int controllers,
|
||||||
|
@ -35,6 +35,8 @@
|
|||||||
#include "vircgroupv1.h"
|
#include "vircgroupv1.h"
|
||||||
#include "virfile.h"
|
#include "virfile.h"
|
||||||
#include "virlog.h"
|
#include "virlog.h"
|
||||||
|
#include "virstring.h"
|
||||||
|
#include "virsystemd.h"
|
||||||
|
|
||||||
VIR_LOG_INIT("util.cgroup");
|
VIR_LOG_INIT("util.cgroup");
|
||||||
|
|
||||||
@ -76,10 +78,92 @@ virCgroupV1Available(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
virCgroupV1ValidateMachineGroup(virCgroupPtr group,
|
||||||
|
const char *name,
|
||||||
|
const char *drivername,
|
||||||
|
const char *machinename)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
VIR_AUTOFREE(char *) partname = NULL;
|
||||||
|
VIR_AUTOFREE(char *) scopename_old = NULL;
|
||||||
|
VIR_AUTOFREE(char *) scopename_new = NULL;
|
||||||
|
VIR_AUTOFREE(char *) partmachinename = NULL;
|
||||||
|
|
||||||
|
if (virAsprintf(&partname, "%s.libvirt-%s",
|
||||||
|
name, drivername) < 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (virCgroupPartitionEscape(&partname) < 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (virAsprintf(&partmachinename, "%s.libvirt-%s",
|
||||||
|
machinename, drivername) < 0 ||
|
||||||
|
virCgroupPartitionEscape(&partmachinename) < 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!(scopename_old = virSystemdMakeScopeName(name, drivername, true)))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!(scopename_new = virSystemdMakeScopeName(machinename,
|
||||||
|
drivername, false)))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (virCgroupPartitionEscape(&scopename_old) < 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (virCgroupPartitionEscape(&scopename_new) < 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
for (i = 0; i < VIR_CGROUP_CONTROLLER_LAST; i++) {
|
||||||
|
char *tmp;
|
||||||
|
|
||||||
|
if (i == VIR_CGROUP_CONTROLLER_SYSTEMD)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!group->controllers[i].placement)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
tmp = strrchr(group->controllers[i].placement, '/');
|
||||||
|
if (!tmp)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (i == VIR_CGROUP_CONTROLLER_CPU ||
|
||||||
|
i == VIR_CGROUP_CONTROLLER_CPUACCT ||
|
||||||
|
i == VIR_CGROUP_CONTROLLER_CPUSET) {
|
||||||
|
if (STREQ(tmp, "/emulator"))
|
||||||
|
*tmp = '\0';
|
||||||
|
tmp = strrchr(group->controllers[i].placement, '/');
|
||||||
|
if (!tmp)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp++;
|
||||||
|
|
||||||
|
if (STRNEQ(tmp, name) &&
|
||||||
|
STRNEQ(tmp, machinename) &&
|
||||||
|
STRNEQ(tmp, partname) &&
|
||||||
|
STRNEQ(tmp, partmachinename) &&
|
||||||
|
STRNEQ(tmp, scopename_old) &&
|
||||||
|
STRNEQ(tmp, scopename_new)) {
|
||||||
|
VIR_DEBUG("Name '%s' for controller '%s' does not match "
|
||||||
|
"'%s', '%s', '%s', '%s' or '%s'",
|
||||||
|
tmp, virCgroupV1ControllerTypeToString(i),
|
||||||
|
name, machinename, partname,
|
||||||
|
scopename_old, scopename_new);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
virCgroupBackend virCgroupV1Backend = {
|
virCgroupBackend virCgroupV1Backend = {
|
||||||
.type = VIR_CGROUP_BACKEND_TYPE_V1,
|
.type = VIR_CGROUP_BACKEND_TYPE_V1,
|
||||||
|
|
||||||
.available = virCgroupV1Available,
|
.available = virCgroupV1Available,
|
||||||
|
.validateMachineGroup = virCgroupV1ValidateMachineGroup,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user