[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel][PATCH][ioemu] strip tap subtype prefix from image name (restyled)



On Wednesday 30 January 2008 15:14:24 Pat Campbell wrote:
> More readable version
>
> Currently I am not able to mount or boot from an HVM CDROM when it is
> configured for 'tap:aio' instead of 'file'.
>
> disk=[ 'tap:aio:/var/lib/xen/images/sles10-sp2-fv/disk0,hda,w', '
>        tap:aio:/home/iso/sles/SLES10.iso,hdc:cdrom,r', ]
>
> With the attached patch I am able to boot from the CDROM and or mount it.
>
> Patch changes xenstore.c:xenstore_process_event() to strip the tap subtype
> prefix from the image name.
>
> Please apply to xen-unstable tip.
>
> Signed-off-by: Pat Campbell <plc@xxxxxxxxxx>

That looks much better.
See inline for comments.

> xen-blktab-subtype-strip.patch
> diff -r 1c826ea72a80 tools/ioemu/xenstore.c 
> --- a/tools/ioemu/xenstore.c    Wed Jan 23 15:42:52 2008 +0000
> +++ b/tools/ioemu/xenstore.c    Wed Jan 30 07:06:12 2008 -0700
> @@ -418,7 +418,7 @@ void xenstore_record_dm_state(char *stat
>  
> void xenstore_process_event(void *opaque)
>  {
> -    char **vec, *image = NULL;
> +    char **vec, *offset, *bpath = NULL, *buf = NULL, *drv = NULL, *image = 
NULL;
>      unsigned int len, num, hd_index;
>  
>      vec = xs_read_watch(xsh, &num);
> @@ -440,8 +440,28 @@ void xenstore_process_event(void *opaque
>          goto out;
>      hd_index = vec[XS_WATCH_TOKEN][2] - 'a';
>      image = xs_read(xsh, XBT_NULL, vec[XS_WATCH_PATH], &len);
> -    if (image == NULL || !strcmp(image, bs_table[hd_index]->filename))
> -        goto out;  /* gone or identical */
> +    if (image == NULL)
> +        goto out;  /* gone */
> +
> +    /* Strip off blktap sub-type prefix */
> +    bpath = strdup(vec[XS_WATCH_PATH]); 
> +    if (bpath)

I think, you mean if (!bpath)  here.

> +        goto out;
> +    if ((offset = strrchr(bpath, '/')) != NULL) 
> +        *offset = '\0';
> +    if (pasprintf(&buf, "%s/type", bpath) == -1) 
> +        goto out;
> +    drv = xs_read(xsh, XBT_NULL, buf, &len);
> +    if (drv) {

I think, you mean  "if (!drv) goto out;" here.

> +        if (!strcmp(drv, "tap")) {
> +            offset = strchr(image, ':'); 
> +            if (offset) 
> +                memmove(image, offset+1, strlen(offset+1)+1 );
> +        }
> +    }
> +
> +    if (!strcmp(image, bs_table[hd_index]->filename))
> +        goto out;  /* identical */
>  
>      do_eject(0, vec[XS_WATCH_TOKEN]);
>      bs_table[hd_index]->filename[0] = 0;
> @@ -456,6 +476,9 @@ void xenstore_process_event(void *opaque
>      }
>  
>   out:
> +    free(drv);
> +    free(buf);
> +    free(bpath);
>      free(image);
>      free(vec);

That doesn't work. If strdup() fails, then drv and buf are NULL here.
Analagous counts for the other failures.
You need to check for != NULL before calling free().

>  }


-- 
AMD Saxony, Dresden, Germany
Operating System Research Center

Legal Information:
AMD Saxony Limited Liability Company & Co. KG
Sitz (Geschäftsanschrift):
   Wilschdorfer Landstr. 101, 01109 Dresden, Deutschland
Registergericht Dresden: HRA 4896
vertretungsberechtigter Komplementär:
   AMD Saxony LLC (Sitz Wilmington, Delaware, USA)
Geschäftsführer der AMD Saxony LLC:
   Dr. Hans-R. Deppe, Thomas McCoy



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.