Patchwork NetBSD qemu block device support

login
register
mail settings
Submitter haad
Date Sept. 21, 2010, 2:01 p.m.
Message ID <AANLkTi=11Q9uyVyZD-tj-H299s14=4FQJVcCbmoWBivs@mail.gmail.com>
Download mbox | patch
Permalink /patch/65309/
State New
Headers show

Comments

haad - Sept. 21, 2010, 2:01 p.m.
Hi,
On Mar,Thursday 18 2010, at 9:32 PM, Blue Swirl wrote:

> On 3/17/10, haad <haad@netbsd.org> wrote:
>> Hi folks,
>>
>> This patch at [1] add support for NetBSD block ioctl calls to qemu
>> block-raw.c file. It was written for xen version of qemu but basically
>> it will work with vanilla qemu, too. Would anyone like to commit this
>> patch so it can be included into the base xen distribution ?
>
> The patch does not apply to current development repository.
>
> There is no description of the change suitable for changelog without
> any editing.
>
> Signed-off-by: line is missing.
>
> The patch combines formatting (whitespace) changes with functional
> changes. The formatting changes seem useless.
>
> The essence of the patch is twofold, It adds NetBSD specific includes
> and NetBSD specific code to raw_getlength(). These look OK, except
> formatting may be a bit off (no space after if) and currently the code
> probably should be surrounded by
> #ifdef DIOCGWEDGEINFO
> #endif
> or just #ifdef __NetBSD__.

I have written this patch some time ago and then I totally forgot on
it (I'm very sorry about that)

Today I looked at it again and changed it to be clean and to properly
apply against current sources.

Patch

diff --git a/block/raw-posix.c b/block/raw-posix.c
index 72fb8ce..444fb2d 100644
--- a/block/raw-posix.c
+++ b/block/raw-posix.c
@@ -62,6 +62,12 @@ 
 #include <sys/disklabel.h>
 #include <sys/dkio.h>
 #endif
+#if defined(__NetBSD__)
+#include <sys/ioctl.h>
+#include <sys/disklabel.h>
+#include <sys/dkio.h>
+#include <sys/disk.h>
+#endif
 
 #ifdef __DragonFly__
 #include <sys/ioctl.h>
@@ -595,6 +601,28 @@  static int64_t raw_getlength(BlockDriverState *bs)
     } else
         return st.st_size;
 }
+#elif defined(__NetBSD__)
+static int64_t  raw_getlength(BlockDriverState *bs)
+{
+	int fd = ((BDRVRawState*)bs->opaque)->fd;
+	struct stat st;
+	if (fstat(fd, &st))
+		return -1;
+	if (S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode)) {
+		struct dkwedge_info dkw;
+		if (ioctl(fd, DIOCGWEDGEINFO, &dkw) != -1) {
+			/* NetBSD still supports only 512 bytes for disk sector */
+			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;
+		}
+	} else
+		return st.st_size;
+}
 #elif defined(__sun__)
 static int64_t raw_getlength(BlockDriverState *bs)
 {