[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] libxc: don't fail domain creation when unpacking initrd fails
At least Linux kernels have been able to work with gzip-ed initrd for quite some time; initrd compressed with other methods aren't even being attempted to unpack. Furthermore the unzip-ing routine used here isn't capable of dealing with various forms of concatenated files, each of which was gzip-ed separately (it is this particular case which has been the source of observed VM creation failures). Hence, if unpacking fails, simply hand the the compressed blob to the guest as is. Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> --- I'm not intending to request this to go into 4.10, but I certainly wouldn't mind. I would appreciate though if I could at least get some initial feedback earlier than when 4.10 branches off, as we will want to use a backport of this in our trees, which I'd prefer to be in line with what is eventually going to go into master. --- a/tools/libxc/include/xc_dom.h +++ b/tools/libxc/include/xc_dom.h @@ -291,7 +291,6 @@ int xc_dom_mem_init(struct xc_dom_image int xc_dom_kernel_check_size(struct xc_dom_image *dom, size_t sz); int xc_dom_kernel_max_size(struct xc_dom_image *dom, size_t sz); -int xc_dom_ramdisk_check_size(struct xc_dom_image *dom, size_t sz); int xc_dom_ramdisk_max_size(struct xc_dom_image *dom, size_t sz); int xc_dom_devicetree_max_size(struct xc_dom_image *dom, size_t sz); --- a/tools/libxc/xc_dom_core.c +++ b/tools/libxc/xc_dom_core.c @@ -314,7 +314,8 @@ int xc_dom_kernel_check_size(struct xc_d return 0; } -int xc_dom_ramdisk_check_size(struct xc_dom_image *dom, size_t sz) +static int xc_dom_ramdisk_check_size(struct xc_dom_image *dom, size_t sz, + size_t raw) { /* No limit */ if ( !dom->max_ramdisk_size ) @@ -322,8 +323,9 @@ int xc_dom_ramdisk_check_size(struct xc_ if ( sz > dom->max_ramdisk_size ) { - xc_dom_panic(dom->xch, XC_INVALID_KERNEL, - "ramdisk image too large"); + if ( raw > dom->max_ramdisk_size ) + xc_dom_panic(dom->xch, XC_INVALID_KERNEL, + "ramdisk image too large"); return 1; } @@ -999,13 +1001,13 @@ static int xc_dom_build_ramdisk(struct x { unziplen = xc_dom_check_gzip(dom->xch, dom->ramdisk_blob, dom->ramdisk_size); - if ( xc_dom_ramdisk_check_size(dom, unziplen) != 0 ) + if ( xc_dom_ramdisk_check_size(dom, unziplen, dom->ramdisk_size) != 0 ) unziplen = 0; } else unziplen = 0; - ramdisklen = unziplen ? unziplen : dom->ramdisk_size; + ramdisklen = max(unziplen, dom->ramdisk_size); if ( xc_dom_alloc_segment(dom, &dom->ramdisk_seg, "ramdisk", dom->ramdisk_seg.vstart, ramdisklen) != 0 ) @@ -1017,14 +1019,15 @@ static int xc_dom_build_ramdisk(struct x __FUNCTION__); goto err; } - if ( unziplen ) + if ( !unziplen || + xc_dom_do_gunzip(dom->xch, dom->ramdisk_blob, dom->ramdisk_size, + ramdiskmap, unziplen) == -1 ) { - if ( xc_dom_do_gunzip(dom->xch, dom->ramdisk_blob, dom->ramdisk_size, - ramdiskmap, ramdisklen) == -1 ) - goto err; - } - else memcpy(ramdiskmap, dom->ramdisk_blob, dom->ramdisk_size); + if ( unziplen > dom->ramdisk_size ) + memset(ramdiskmap + dom->ramdisk_size, 0, + unziplen - dom->ramdisk_size); + } return 0; _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |