On Thu, Oct 05, 2006 at 07:23:15PM +0100, Daniel P. Berrange wrote:
On Wed, Sep 27, 2006 at 06:36:38PM +0100, Daniel P. Berrange wrote:
> Ok, looks like we have total agreement. I'll knock up a patch implementing
> option #4 and post it for review.
Attached is a patch which implements option 4. If no <driver> block is
supplied, then we continue existing behavior of using file: for file backed
disks, and phy: for block backed disks. Any of the following are then valid:
<driver name='file'/> -> file:
<driver name='phy'/> -> phy:
<driver name='tap'/> -> tap:aio:
<driver name='tap' type='aio'/> -> tap:aio:
<driver name='tap' type='qcow'/> -> tap:qcow:
The only supported names are 'file', 'phy' & 'tap'. If the
name is 'tap'
then it is valid to use an additional 'type' attributte. We don't do
any checking on cotents of 'type' attribute, it is just passed straight
through to xend, since the blktap driver has a wide variety of types
available. When fetching XML from libvirt you are now guarenteed to
be given a <driver> block in each disk.
Okay,
The patch was rather tedious, because not only did the blktap stuff
change
the prefix used on file paths in the (uname) SEXPR block, but it actually
changed the entire enclosing block from (vbd ...) to (tap ...) for some
crazy reason.
Oh well ... at some point we will need to look at the new interfaces for
xend too, but one thing at a time :-)
I'm not attaching them here because it would bloat the patch, but
I've written
a tonne more testfiles for the xml <-> sexpr conversions to validate the
patch is operating correctly.
Great !
Index: src/xend_internal.c
===================================================================
RCS file: /data/cvs/libvirt/src/xend_internal.c,v
retrieving revision 1.66
diff -u -r1.66 xend_internal.c
--- src/xend_internal.c 29 Sep 2006 12:00:58 -0000 1.66
+++ src/xend_internal.c 5 Oct 2006 18:12:33 -0000
@@ -1499,7 +1499,7 @@
for (i = 0, j = 0;(i < 32) && (tmp[j] != 0);j++) {
if (((tmp[j] >= '0') && (tmp[j] <= '9')) ||
((tmp[j] >= 'a') && (tmp[j] <= 'f')))
- compact[i++] = tmp[j];
+ compact[i++] = tmp[j];
maybe we should just add the full set of { } for the innner constructs
too if reformatting.
else if ((tmp[j] >= 'A') && (tmp[j] <=
'F'))
compact[i++] = tmp[j] + 'a' - 'A';
}
@@ -1546,95 +1546,116 @@
+ drvName = malloc((offset-src)+1);
I agree that if we OOM there it's gonna be messy anyway but let's catch
NULL returns on allocs as much as possible
+ strncpy(drvName, src, (offset-src));
+ drvName[offset-src] = '\0';
+
+ src = offset + 1;
+
+ if (!strcmp(drvName, "tap")) {
+ offset = strchr(src, ':');
+ if (!offset)
+ goto bad_parse;
+
+ drvType = malloc((offset-src)+1);
Same here. If failing a libvirt error and going to bad_parse should be
sufficient I guess.
+ } else if (!strcmp(offset, ":disk"))
{
+ /* defualt anyway */
/* default */ :-)
+ } else if ((drvName == NULL) &&
+ (xmlStrEqual(cur->name, BAD_CAST "driver"))) {
+ drvName = xmlGetProp(cur, BAD_CAST "name");
testing for NULL would be good, if the attribute is missing we should
not crash
+ if (!strcmp((const char *)drvName,
"tap"))
+ drvType = xmlGetProp(cur, BAD_CAST "type");
} else if (xmlStrEqual(cur->name, BAD_CAST "readonly")) {
ro = 1;
}
@@ -972,14 +979,14 @@
/* Xend (all versions) put the floppy device config
* under the hvm (image (os)) block
*/
- if (hvm &&
+ if (hvm &&
device &&
!strcmp((const char *)device, "floppy")) {
return 0;
}
/* Xend <= 3.0.2 doesn't include cdrom config here */
- if (hvm &&
+ if (hvm &&
device &&
!strcmp((const char *)device, "cdrom")) {
if (xendConfigVersion == 1)
@@ -990,7 +997,14 @@
virBufferAdd(buf, "(device ", 8);
- virBufferAdd(buf, "(vbd ", 5);
+ /* Why, oh why did this need to change as well as the
+ specifying tap in the (uname..) block ??!!?! Crazy
+ Xen formats :-( */
I undestand the frustration, but 3 years from now the comment will lack
relevance, unless you give the full picture :-)
thanks !
Daniel
--
Red Hat Virtualization group
http://redhat.com/virtualization/
Daniel Veillard | virtualization library
http://libvirt.org/
veillard(a)redhat.com | libxml GNOME XML XSLT toolkit
http://xmlsoft.org/
http://veillard.com/ | Rpmfind RPM search engine
http://rpmfind.net/