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

Re: [Xen-devel] [PATCH] qemu-xen-trad/block: add support for NetBSD phy interfaces



On Wed, 30 May 2012, Roger Pau Monne wrote:
> Add support for NetBSD to get the correct size for phy block devices,
> and use character devices instead of block devices.
> 
> This has been in pkgsrc tree for a long time, and is present in upstream qemu.

Could you please include the upstream QEMU commit id in the description
of this patch?


> It is not pretty, but I'm fairly confident that it doesn't break anything on
> the Linux side.
> 
> Signed-off-by: Roger Pau Monne <roger.pau@xxxxxxxxxx>
> ---
>  block-raw-posix.c |   51 +++++++++++++++++++++++++++++++++++++++++++++++++--
>  1 files changed, 49 insertions(+), 2 deletions(-)
> 
> diff --git a/block-raw-posix.c b/block-raw-posix.c
> index 9a02d4f..7429c7b 100644
> --- a/block-raw-posix.c
> +++ b/block-raw-posix.c
> @@ -66,6 +66,13 @@
>  #include <sys/disklabel.h>
>  #include <sys/dkio.h>
>  #endif
> +#if defined(__NetBSD__)
> +#include <sys/ioctl.h>
> +#include <sys/disklabel.h>
> +#include <sys/dkio.h>
> +#define SLIST_ENTRY(x) int /*XXXX !*/
> +#include <sys/disk.h>
> +#endif
>  
>  //#define DEBUG_FLOPPY
>  
> @@ -120,6 +127,33 @@ static int raw_open(BlockDriverState *bs, const char 
> *filename, int flags)
>  {
>      BDRVRawState *s = bs->opaque;
>      int fd, open_flags, ret;
> +#ifdef __NetBSD__
> +    struct stat sb;
> +    static char namebuf[MAXPATHLEN];
> +    const char *dp;
> +
> +    if (lstat(filename, &sb) < 0) {
> +        fprintf(stderr, "%s: stat failed: %s\n", filename, strerror(errno));
> +        return -errno;
> +    }
> +    if (S_ISLNK(sb.st_mode)) {
> +        fprintf(stderr, "%s: symolink links not supported by qemu-dm\n",
> +                        filename);
> +        return -EINVAL;
> +    }
> +    if (S_ISBLK(sb.st_mode)) {
> +        dp = strrchr(filename, '/');
> +        if (dp == NULL) {
> +            snprintf(namebuf, MAXPATHLEN, "r%s", filename);
> +        } else {
> +            snprintf(namebuf, MAXPATHLEN, "%.*s/r%s",
> +                     (int)(dp - filename), filename, dp + 1);
> +        }
> +        fprintf(stderr, "%s is a block device", filename);
> +        filename = namebuf;
> +        fprintf(stderr, ", using %s\n", filename);
> +    }
> +#endif

maybe you could refactor it in a separate raw_normalize_devicepath
function, like in upstream QEMU


>      posix_aio_init();
>  
> @@ -749,7 +783,7 @@ static int raw_truncate(BlockDriverState *bs, int64_t 
> offset)
>      return 0;
>  }
>  
> -#ifdef __OpenBSD__
> +#if defined(__OpenBSD__) || defined(__NetBSD__)
>  static int64_t raw_getlength(BlockDriverState *bs)
>  {
>      BDRVRawState *s = bs->opaque;
> @@ -759,16 +793,29 @@ static int64_t raw_getlength(BlockDriverState *bs)
>      if (fstat(fd, &st))
>          return -1;
>      if (S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode)) {
> +#if defined(__OpenBSD__)
>          struct disklabel dl;
>  
>          if (ioctl(fd, DIOCGDINFO, &dl))
>              return -1;
>          return (uint64_t)dl.d_secsize *
>              dl.d_partitions[DISKPART(st.st_rdev)].p_size;
> +#else
> +        struct dkwedge_info dkw;
> +        if (ioctl(fd, DIOCGWEDGEINFO, &dkw) != -1) {
> +            return dkw.dkw_size * 512;
> +        }  else {
> +            struct disklabel dl;
> +            if(ioctl(fd, DIOCGDINFO, &dl))
> +                return -1;
> +            return (uint64_t)dl.d_secsize *
> +                   dl.d_partitions[DISKPART(st.st_rdev)].p_size;
> +        }
> +#endif

similarly this could be in a separate raw_getlength function


>      } else
>          return st.st_size;
>  }
> -#else /* !__OpenBSD__ */
> +#else /* !__OpenBSD__ && ! __NetBSD__  */
>  static int64_t  raw_getlength(BlockDriverState *bs)
>  {
>      BDRVRawState *s = bs->opaque;
> -- 
> 1.7.7.5 (Apple Git-26)
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxx
> http://lists.xen.org/xen-devel
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

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