1
1
/*---------------------------------------------------------------------------*/
2
/* Copyright (c) 2011 SUSE LINUX Products GmbH, Nuernberg, Germany.
2
/* Copyright (C) 2006-2012 Red Hat, Inc.
3
* Copyright (c) 2011 SUSE LINUX Products GmbH, Nuernberg, Germany.
3
4
* Copyright (C) 2011 Univention GmbH.
4
* Copyright (C) 2006-2011 Red Hat, Inc.
6
6
* This library is free software; you can redistribute it and/or
7
7
* modify it under the terms of the GNU Lesser General Public
115
libxlDomainEventDispatchFunc(virConnectPtr conn, virDomainEventPtr event,
116
virConnectDomainEventGenericCallback cb,
117
void *cbopaque, void *opaque)
119
libxlDriverPrivatePtr driver = opaque;
121
/* Drop the lock whle dispatching, for sake of re-entrancy */
122
libxlDriverUnlock(driver);
123
virDomainEventDispatchDefaultFunc(conn, event, cb, cbopaque, NULL);
124
libxlDriverLock(driver);
128
libxlDomainEventFlush(int timer ATTRIBUTE_UNUSED, void *opaque)
130
libxlDriverPrivatePtr driver = opaque;
132
libxlDriverLock(driver);
133
virDomainEventStateFlush(driver->domainEventState,
134
libxlDomainEventDispatchFunc,
136
libxlDriverUnlock(driver);
139
116
/* driver must be locked before calling */
240
217
libxlSavefileHeader hdr;
241
218
char *xml = NULL;
243
if ((fd = virFileOpenAs(from, O_RDONLY, 0, getuid(), getgid(), 0)) < 0) {
220
if ((fd = virFileOpenAs(from, O_RDONLY, 0, -1, -1, 0)) < 0) {
244
221
libxlError(VIR_ERR_OPERATION_FAILED,
245
222
"%s", _("cannot read domain image"));
916
894
goto out_of_memory;
918
896
if (virFileMakePath(libxl_driver->logDir) < 0) {
920
897
VIR_ERROR(_("Failed to create log dir '%s': %s"),
921
libxl_driver->logDir, virStrerror(errno, ebuf, sizeof ebuf));
898
libxl_driver->logDir, virStrerror(errno, ebuf, sizeof(ebuf)));
924
901
if (virFileMakePath(libxl_driver->stateDir) < 0) {
926
902
VIR_ERROR(_("Failed to create state dir '%s': %s"),
927
libxl_driver->stateDir, virStrerror(errno, ebuf, sizeof ebuf));
903
libxl_driver->stateDir, virStrerror(errno, ebuf, sizeof(ebuf)));
930
906
if (virFileMakePath(libxl_driver->libDir) < 0) {
932
907
VIR_ERROR(_("Failed to create lib dir '%s': %s"),
933
libxl_driver->libDir, virStrerror(errno, ebuf, sizeof ebuf));
908
libxl_driver->libDir, virStrerror(errno, ebuf, sizeof(ebuf)));
936
911
if (virFileMakePath(libxl_driver->saveDir) < 0) {
938
912
VIR_ERROR(_("Failed to create save dir '%s': %s"),
939
libxl_driver->saveDir, virStrerror(errno, ebuf, sizeof ebuf));
913
libxl_driver->saveDir, virStrerror(errno, ebuf, sizeof(ebuf)));
1071
1041
if (libxl_driver == NULL)
1072
1042
return VIR_DRV_OPEN_DECLINED;
1074
conn->uri = xmlParseURI("xen:///");
1076
virReportOOMError();
1044
if (!(conn->uri = virURIParse("xen:///")))
1077
1045
return VIR_DRV_OPEN_ERROR;
1080
1047
/* Only xen scheme */
1081
1048
if (conn->uri->scheme == NULL || STRNEQ(conn->uri->scheme, "xen"))
1115
1082
libxlDriverPrivatePtr driver = conn->privateData;
1117
1084
libxlDriverLock(driver);
1118
virDomainEventCallbackListRemoveConn(conn,
1119
driver->domainEventState->callbacks);
1085
virDomainEventStateDeregisterConn(conn,
1086
driver->domainEventState);
1120
1087
libxlDriverUnlock(driver);
1121
1088
conn->privateData = NULL;
1443
libxlDomainShutdown(virDomainPtr dom)
1410
libxlDomainShutdownFlags(virDomainPtr dom, unsigned int flags)
1445
1412
libxlDriverPrivatePtr driver = dom->conn->privateData;
1446
1413
virDomainObjPtr vm;
1448
1415
libxlDomainObjPrivatePtr priv;
1417
virCheckFlags(0, -1);
1450
1419
libxlDriverLock(driver);
1451
1420
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
1456
libxlDomainShutdown(virDomainPtr dom)
1458
return libxlDomainShutdownFlags(dom, 0);
1487
1463
libxlDomainReboot(virDomainPtr dom, unsigned int flags)
1489
1465
libxlDriverPrivatePtr driver = dom->conn->privateData;
1613
static unsigned long
1589
static unsigned long long
1614
1590
libxlDomainGetMaxMemory(virDomainPtr dom)
1616
1592
libxlDriverPrivatePtr driver = dom->conn->privateData;
1617
1593
virDomainObjPtr vm;
1618
unsigned long ret = 0;
1594
unsigned long long ret = 0;
1620
1596
libxlDriverLock(driver);
1621
1597
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
1857
1833
if ((fd = virFileOpenAs(to, O_CREAT|O_TRUNC|O_WRONLY, S_IRUSR|S_IWUSR,
1858
getuid(), getgid(), 0)) < 0) {
1859
1835
virReportSystemError(-fd,
1860
1836
_("Failed to create domain save file '%s'"), to);
3108
3084
libxlDomainDetachDeviceConfig(virDomainDefPtr vmdef, virDomainDeviceDefPtr dev)
3110
virDomainDiskDefPtr disk;
3086
virDomainDiskDefPtr disk, detach;
3113
3089
switch (dev->type) {
3114
3090
case VIR_DOMAIN_DEVICE_DISK:
3115
3091
disk = dev->data.disk;
3116
if (virDomainDiskRemoveByName(vmdef, disk->dst)) {
3092
if (!(detach = virDomainDiskRemoveByName(vmdef, disk->dst))) {
3117
3093
libxlError(VIR_ERR_INVALID_ARG,
3118
3094
_("no target device %s"), disk->dst);
3097
virDomainDiskDefFree(detach);
3264
if (!(dev = virDomainDeviceDefParse(driver->caps, vm->def, xml,
3265
VIR_DOMAIN_XML_INACTIVE)))
3268
3241
priv = vm->privateData;
3270
3243
if (flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG) {
3406
3379
libxlDriverLock(driver);
3407
ret = virDomainEventCallbackListAdd(conn,
3408
driver->domainEventState->callbacks,
3409
callback, opaque, freecb);
3380
ret = virDomainEventStateRegister(conn,
3381
driver->domainEventState,
3382
callback, opaque, freecb);
3410
3383
libxlDriverUnlock(driver);
3641
params[0].value.ui = sc_info.weight;
3642
params[0].type = VIR_TYPED_PARAM_UINT;
3643
if (virStrcpyStatic(params[0].field,
3644
VIR_DOMAIN_SCHEDULER_WEIGHT) == NULL) {
3645
libxlError(VIR_ERR_INTERNAL_ERROR,
3646
_("Field name '%s' too long"),
3647
VIR_DOMAIN_SCHEDULER_WEIGHT);
3614
if (virTypedParameterAssign(¶ms[0], VIR_DOMAIN_SCHEDULER_WEIGHT,
3615
VIR_TYPED_PARAM_UINT, sc_info.weight) < 0)
3651
3618
if (*nparams > 1) {
3652
params[1].value.ui = sc_info.cap;
3653
params[1].type = VIR_TYPED_PARAM_UINT;
3654
if (virStrcpyStatic(params[1].field,
3655
VIR_DOMAIN_SCHEDULER_CAP) == NULL) {
3656
libxlError(VIR_ERR_INTERNAL_ERROR,
3657
_("Field name '%s' too long"),
3658
VIR_DOMAIN_SCHEDULER_CAP);
3619
if (virTypedParameterAssign(¶ms[0], VIR_DOMAIN_SCHEDULER_CAP,
3620
VIR_TYPED_PARAM_UINT, sc_info.cap) < 0)
3663
3624
if (*nparams > XEN_SCHED_CREDIT_NPARAM)
3694
3655
virCheckFlags(0, -1);
3656
if (virTypedParameterArrayValidate(params, nparams,
3657
VIR_DOMAIN_SCHEDULER_WEIGHT,
3658
VIR_TYPED_PARAM_UINT,
3659
VIR_DOMAIN_SCHEDULER_CAP,
3660
VIR_TYPED_PARAM_UINT,
3696
3664
libxlDriverLock(driver);
3697
3665
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
3733
3701
virTypedParameterPtr param = ¶ms[i];
3735
3703
if (STREQ(param->field, VIR_DOMAIN_SCHEDULER_WEIGHT)) {
3736
if (param->type != VIR_TYPED_PARAM_UINT) {
3737
libxlError(VIR_ERR_INVALID_ARG, "%s",
3738
_("invalid type for weight tunable, expected a 'uint'"));
3741
3704
sc_info.weight = params[i].value.ui;
3743
3705
} else if (STREQ(param->field, VIR_DOMAIN_SCHEDULER_CAP)) {
3744
if (param->type != VIR_TYPED_PARAM_UINT) {
3745
libxlError(VIR_ERR_INVALID_ARG, "%s",
3746
_("invalid type for cap tunable, expected a 'uint'"));
3749
3706
sc_info.cap = params[i].value.ui;
3751
libxlError(VIR_ERR_INVALID_ARG,
3752
_("Invalid parameter '%s'"), param->field);
3853
3806
libxlDriverLock(driver);
3854
ret = virDomainEventCallbackListAddID(conn,
3855
driver->domainEventState->callbacks,
3856
dom, eventID, callback, opaque,
3807
if (virDomainEventStateRegisterID(conn,
3808
driver->domainEventState,
3809
dom, eventID, callback, opaque,
3858
3812
libxlDriverUnlock(driver);
3870
3824
libxlDriverLock(driver);
3871
ret = virDomainEventStateDeregisterAny(conn,
3872
driver->domainEventState,
3825
ret = virDomainEventStateDeregisterID(conn,
3826
driver->domainEventState,
3874
3828
libxlDriverUnlock(driver);
3904
3858
.domainSuspend = libxlDomainSuspend, /* 0.9.0 */
3905
3859
.domainResume = libxlDomainResume, /* 0.9.0 */
3906
3860
.domainShutdown = libxlDomainShutdown, /* 0.9.0 */
3861
.domainShutdownFlags = libxlDomainShutdownFlags, /* 0.9.10 */
3907
3862
.domainReboot = libxlDomainReboot, /* 0.9.0 */
3908
3863
.domainDestroy = libxlDomainDestroy, /* 0.9.0 */
3909
3864
.domainDestroyFlags = libxlDomainDestroyFlags, /* 0.9.4 */