[Libvir] [PATCH]OpenVZ Enhancements - Cleaned up
Daniel Veillard
veillard at redhat.com
Mon Sep 3 16:22:45 UTC 2007
On Mon, Sep 03, 2007 at 08:39:27AM -0400, Daniel Veillard wrote:
> On Mon, Sep 03, 2007 at 08:01:00AM -0400, Shuveb Hussain wrote:
> > Hi,
> >
> > Attached are the OpenVZ driver enhancements. Cleanups have been done
> > according to Daniel .V's suggestions. Please see my previous mail for
> > summary.
>
> Okay, that looks better, thanks a lot !
> I will apply them but there is a few things I still have issues with,
> I will try to fix them before commiting the patches:
Okay I commited to CVS earlier today
> - some really bizare changes of an xmlDoc name field:
> + if (!(xml->name = calloc(1, PATH_MAX))) {
> + openvzLog(OPENVZ_ERR, "Error in allocating memory to store xml URI");
> + xmlFreeDoc(xml);
> + return NULL;
> + }
> + if (displayName)
> + strncpy(xml->name, displayName, PATH_MAX - 1);
> + else
> + strncpy(xml->name, "domain.xml", PATH_MAX - 1);
> that's bad because:
> + it will probably leak the previous value of xml->name
> + xml->name should be allocated using xmlMalloc
> + why allocate MAX_PATH when you can allocate just the size
> so I will cleanup that part, still I don't undertsand what you
> tried to do there.
I removed that part. The URI information passed to the xmlDocRead earlier
should result in the same xml->URI being set, so I don't see the point
of that duplication, dropped for now.
> This should hit CVS later today when I cleaned up those things and possibly
> a couple of warnings,
I am also applying that second patch to clean thing up, this removes most
warnings at compile time, fix a serious deallocation problem on error when
listing the domains, and change strtoI to indicate it does not change the
input string.
There is still 3 serious warnings in openvz_conf.c around line 700, where
the return value of write is not checked and as I indicated previously we
should use a wrapper function handling interrupted calls at least. But that
can be done later,
thanks,
Daniel
--
Red Hat Virtualization group http://redhat.com/virtualization/
Daniel Veillard | virtualization library http://libvirt.org/
veillard at redhat.com | libxml GNOME XML XSLT toolkit http://xmlsoft.org/
http://veillard.com/ | Rpmfind RPM search engine http://rpmfind.net/
-------------- next part --------------
Index: src/openvz_conf.c
===================================================================
RCS file: /data/cvs/libxen/src/openvz_conf.c,v
retrieving revision 1.5
diff -u -r1.5 openvz_conf.c
--- src/openvz_conf.c 3 Sep 2007 15:37:07 -0000 1.5
+++ src/openvz_conf.c 3 Sep 2007 16:18:08 -0000
@@ -59,9 +59,6 @@
static struct openvz_vm_def *openvzParseXML(virConnectPtr conn, xmlDocPtr xml);
static int openvzGetVPSUUID(int vpsid, char *uuidstr);
static int openvzSetUUID(int vpsid);
-static struct openvz_vm *openvzLoadConfig(struct openvz_driver *driver,
- const char *path,
- const char *xmlStr);
/* For errors internal to this library. */
static void
@@ -117,7 +114,7 @@
}
int
-strtoI(char *str)
+strtoI(const char *str)
{
int base = 10;
char *endptr;
@@ -340,7 +337,7 @@
}
/* rejecting VPS ID <= OPENVZ_RSRV_VM_LIMIT for they are reserved */
- if (strtoI(BAD_CAST obj->stringval) <= OPENVZ_RSRV_VM_LIMIT) {
+ if (strtoI((const char *) obj->stringval) <= OPENVZ_RSRV_VM_LIMIT) {
error(conn, VIR_ERR_INTERNAL_ERROR,
"VPS ID Error (must be an integer greater than 100");
goto bail_out;
@@ -531,13 +528,18 @@
*pnext = calloc(1, sizeof(struct openvz_vm));
if(!*pnext) {
error(conn, VIR_ERR_INTERNAL_ERROR, "calloc failed");
- return NULL;
+ goto error;
}
if(!vm)
vm = *pnext;
- fscanf(fp, "%d %s\n", &veid, status);
+ if (fscanf(fp, "%d %s\n", &veid, status) != 2) {
+ error(conn, VIR_ERR_INTERNAL_ERROR,
+ "Failed to parse vzlist output");
+ free(*pnext);
+ goto error;
+ }
if(strcmp(status, "stopped")) {
(*pnext)->status = VIR_DOMAIN_RUNNING;
driver->num_active ++;
@@ -546,14 +548,18 @@
else {
(*pnext)->status = VIR_DOMAIN_SHUTOFF;
driver->num_inactive ++;
- (*pnext)->vpsid = -1; /* inactive domains don't have their ID set in libvirt,
- thought this doesn't make sense for OpenVZ */
+ /*
+ * inactive domains don't have their ID set in libvirt,
+ * thought this doesn't make sense for OpenVZ
+ */
+ (*pnext)->vpsid = -1;
}
vmdef = calloc(1, sizeof(struct openvz_vm_def));
if(!vmdef) {
error(conn, VIR_ERR_INTERNAL_ERROR, "calloc failed");
- return NULL;
+ free(*pnext);
+ goto error;
}
snprintf(vmdef->name, OPENVZ_NAME_MAX, "%i", veid);
@@ -561,14 +567,27 @@
ret = virUUIDParse(uuidstr, vmdef->uuid);
if(ret == -1) {
- error(conn, VIR_ERR_INTERNAL_ERROR, "UUID in config file malformed");
- return NULL;
+ error(conn, VIR_ERR_INTERNAL_ERROR,
+ "UUID in config file malformed");
+ free(*pnext);
+ free(vmdef);
+ goto error;
}
(*pnext)->vmdef = vmdef;
pnext = &(*pnext)->next;
}
return vm;
+error:
+ while (vm != NULL) {
+ struct openvz_vm *next;
+
+ next = vm->next;
+ free(vm->vmdef);
+ free(vm);
+ vm = next;
+ }
+ return NULL;
}
static char
@@ -579,7 +598,7 @@
while(conf_dir_list[i]) {
if(!access(conf_dir_list[i], F_OK))
- return strdup(conf_dir_list[i]);
+ return strdup(conf_dir_list[i]);
i ++;
}
@@ -660,7 +679,7 @@
char uuidstr[VIR_UUID_STRING_BUFLEN];
unsigned char uuid[VIR_UUID_BUFLEN];
char *conf_dir;
- int fd, ret, i;
+ int fd, ret;
conf_dir = openvzLocateConfDir();
sprintf(conf_file, "%s/%d.conf", conf_dir, vpsid);
Index: src/openvz_conf.h
===================================================================
RCS file: /data/cvs/libxen/src/openvz_conf.h,v
retrieving revision 1.4
diff -u -r1.4 openvz_conf.h
--- src/openvz_conf.h 3 Sep 2007 15:37:07 -0000 1.4
+++ src/openvz_conf.h 3 Sep 2007 16:18:08 -0000
@@ -129,5 +129,5 @@
void openvzFreeDriver(struct openvz_driver *driver);
void openvzFreeVM(struct openvz_driver *driver, struct openvz_vm *vm, int checkCallee);
void openvzFreeVMDef(struct openvz_vm_def *def);
-int strtoI(char *str);
+int strtoI(const char *str);
#endif /* OPENVZ_CONF_H */
Index: src/openvz_driver.c
===================================================================
RCS file: /data/cvs/libxen/src/openvz_driver.c,v
retrieving revision 1.5
diff -u -r1.5 openvz_driver.c
--- src/openvz_driver.c 3 Sep 2007 15:37:07 -0000 1.5
+++ src/openvz_driver.c 3 Sep 2007 16:18:08 -0000
@@ -164,7 +164,7 @@
return dom;
}
-static char *openvzGetOSType(virDomainPtr dom)
+static char *openvzGetOSType(virDomainPtr dom ATTRIBUTE_UNUSED)
{
/* OpenVZ runs on Linux and runs only Linux */
return strdup("linux");
@@ -275,7 +275,8 @@
return ret;
}
-static int openvzDomainReboot(virDomainPtr dom, unsigned int flags) {
+static int openvzDomainReboot(virDomainPtr dom,
+ unsigned int flags ATTRIBUTE_UNUSED) {
char cmdbuf[CMDBUF_LEN];
int ret;
char *cmdExec[OPENVZ_MAX_ARG];
@@ -631,7 +632,7 @@
return got;
}
-static int openvzNumDomains(virConnectPtr conn) {
+static int openvzNumDomains(virConnectPtr conn ATTRIBUTE_UNUSED) {
return ovz_driver.num_active;
}
@@ -662,7 +663,7 @@
return got;
}
-static int openvzNumDefinedDomains(virConnectPtr conn) {
+static int openvzNumDefinedDomains(virConnectPtr conn ATTRIBUTE_UNUSED) {
return ovz_driver.num_inactive;
}
@@ -687,11 +688,11 @@
return 1;
}
-static int openvzCloseNetwork(virConnectPtr conn) {
+static int openvzCloseNetwork(virConnectPtr conn ATTRIBUTE_UNUSED) {
return 0;
}
-static virDrvOpenStatus openvzOpenNetwork(virConnectPtr conn,
+static virDrvOpenStatus openvzOpenNetwork(virConnectPtr conn ATTRIBUTE_UNUSED,
const char *name ATTRIBUTE_UNUSED,
int flags ATTRIBUTE_UNUSED) {
return VIR_DRV_OPEN_SUCCESS;
@@ -747,6 +748,11 @@
NULL, /* domainGetSchedulerType */
NULL, /* domainGetSchedulerParameters */
NULL, /* domainSetSchedulerParameters */
+ NULL, /* domainMigratePrepare */
+ NULL, /* domainMigratePerform */
+ NULL, /* domainMigrateFinish */
+ NULL, /* domainBlockStats */
+ NULL, /* domainInterfaceStats */
};
static virNetworkDriver openvzNetworkDriver = {
More information about the libvir-list
mailing list