[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |