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

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



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.
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
 
     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
     } 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


 


Rackspace

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