All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH] block/raw-posix: get right partition size
@ 2011-05-23 10:05 Christoph Egger
  2011-05-23 10:34 ` [Qemu-devel] [PATCH] block/raw-posix: get right size of " Christoph Egger
  0 siblings, 1 reply; 4+ messages in thread
From: Christoph Egger @ 2011-05-23 10:05 UTC (permalink / raw)
  To: qemu-devel

[-- Attachment #1: Type: text/plain, Size: 602 bytes --]


This does 2 things:
- use the correct way to get the size of a disk device or partition
   (from haad@NetBSD.org)
- if given a block device, use the character device instead.
   (from bouyer@NetBSD.org)

From: Adam Hamsik <haad@netbsd.org>
From: Manuel Bouyer <bouyer@netbsd.org>
Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>

-- 
---to satisfy European Law for business letters:
Advanced Micro Devices GmbH
Einsteinring 24, 85689 Dornach b. Muenchen
Geschaeftsfuehrer: Alberto Bozzo, Andrew Bowd
Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen
Registergericht Muenchen, HRB Nr. 43632

[-- Attachment #2: qemu_block_raw_posix.diff --]
[-- Type: text/plain, Size: 2596 bytes --]

diff --git a/block/raw-posix.c b/block/raw-posix.c
index 6b72470..7cf6461 100644
--- a/block/raw-posix.c
+++ b/block/raw-posix.c
@@ -64,6 +64,13 @@
 #include <sys/dkio.h>
 #endif
 
+#ifdef __NetBSD__
+#include <sys/ioctl.h>
+#include <sys/disklabel.h>
+#include <sys/dkio.h>
+#include <sys/disk.h>
+#endif
+
 #ifdef __DragonFly__
 #include <sys/ioctl.h>
 #include <sys/diskslice.h>
@@ -141,7 +148,32 @@ static int raw_open_common(BlockDriverState *bs, const char *filename,
 {
     BDRVRawState *s = bs->opaque;
     int fd, ret;
+    struct stat sb;
 
+    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: symbolic link not supported\n", filename);
+        return -EINVAL;
+    }
+#if defined(__NetBSD__)
+    if (S_ISBLK(sb.st_mode)) {
+        static char namebuf[PATH_MAX];
+        const char *dp = strrchr(filename, '/');
+
+        if (dp == NULL) {
+            snprintf(namebuf, PATH_MAX, "r%s", filename);
+        } else {
+            snprintf(namebuf, PATH_MAX, "%.*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
     s->open_flags = open_flags | O_BINARY;
     s->open_flags &= ~O_ACCMODE;
     if (bdrv_flags & BDRV_O_RDWR) {
@@ -603,7 +635,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;
@@ -613,12 +645,22 @@ static int64_t raw_getlength(BlockDriverState *bs)
     if (fstat(fd, &st))
         return -1;
     if (S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode)) {
-        struct disklabel dl;
+#if defined(__NetBSD__)
+        struct dkwedge_info dkw;
 
-        if (ioctl(fd, DIOCGDINFO, &dl))
-            return -1;
-        return (uint64_t)dl.d_secsize *
-            dl.d_partitions[DISKPART(st.st_rdev)].p_size;
+        if (ioctl(fd, DIOCGWEDGEINFO, &dkw) != -1) {
+            return dkw.dkw_size * 512;
+        } else {
+#endif
+            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;
+#if defined(__NetBSD__)
+        }
+#endif
     } else
         return st.st_size;
 }

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [Qemu-devel] [PATCH] block/raw-posix: get right size of partition size
  2011-05-23 10:05 [Qemu-devel] [PATCH] block/raw-posix: get right partition size Christoph Egger
@ 2011-05-23 10:34 ` Christoph Egger
  2011-05-23 11:06   ` Christoph Hellwig
  0 siblings, 1 reply; 4+ messages in thread
From: Christoph Egger @ 2011-05-23 10:34 UTC (permalink / raw)
  To: qemu-devel


This does 2 things:
- use the correct way to get the size of a disk device or partition
     (from haad@NetBSD.org)
- if given a block device, use the character device instead.
     (from bouyer@NetBSD.org)

From: Adam Hamsik <haad@netbsd.org>
From: Manuel Bouyer <bouyer@netbsd.org>
Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>

diff --git a/block/raw-posix.c b/block/raw-posix.c
index 6b72470..7cf6461 100644
--- a/block/raw-posix.c
+++ b/block/raw-posix.c
@@ -64,6 +64,13 @@
  #include <sys/dkio.h>
  #endif

+#ifdef __NetBSD__
+#include <sys/ioctl.h>
+#include <sys/disklabel.h>
+#include <sys/dkio.h>
+#include <sys/disk.h>
+#endif
+
  #ifdef __DragonFly__
  #include <sys/ioctl.h>
  #include <sys/diskslice.h>
@@ -141,7 +148,32 @@ static int raw_open_common(BlockDriverState *bs, 
const char *filename,
  {
      BDRVRawState *s = bs->opaque;
      int fd, ret;
+    struct stat sb;

+    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: symbolic link not supported\n", filename);
+        return -EINVAL;
+    }
+#if defined(__NetBSD__)
+    if (S_ISBLK(sb.st_mode)) {
+        static char namebuf[PATH_MAX];
+        const char *dp = strrchr(filename, '/');
+
+        if (dp == NULL) {
+            snprintf(namebuf, PATH_MAX, "r%s", filename);
+        } else {
+            snprintf(namebuf, PATH_MAX, "%.*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
      s->open_flags = open_flags | O_BINARY;
      s->open_flags &= ~O_ACCMODE;
      if (bdrv_flags & BDRV_O_RDWR) {
@@ -603,7 +635,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;
@@ -613,12 +645,22 @@ static int64_t raw_getlength(BlockDriverState *bs)
      if (fstat(fd, &st))
          return -1;
      if (S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode)) {
-        struct disklabel dl;
+#if defined(__NetBSD__)
+        struct dkwedge_info dkw;

-        if (ioctl(fd, DIOCGDINFO, &dl))
-            return -1;
-        return (uint64_t)dl.d_secsize *
-            dl.d_partitions[DISKPART(st.st_rdev)].p_size;
+        if (ioctl(fd, DIOCGWEDGEINFO, &dkw) != -1) {
+            return dkw.dkw_size * 512;
+        } else {
+#endif
+            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;
+#if defined(__NetBSD__)
+        }
+#endif
      } else
          return st.st_size;
  }



-- 
---to satisfy European Law for business letters:
Advanced Micro Devices GmbH
Einsteinring 24, 85689 Dornach b. Muenchen
Geschaeftsfuehrer: Alberto Bozzo, Andrew Bowd
Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen
Registergericht Muenchen, HRB Nr. 43632

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [Qemu-devel] [PATCH] block/raw-posix: get right size of partition size
  2011-05-23 10:34 ` [Qemu-devel] [PATCH] block/raw-posix: get right size of " Christoph Egger
@ 2011-05-23 11:06   ` Christoph Hellwig
  2011-05-23 12:26     ` Christoph Egger
  0 siblings, 1 reply; 4+ messages in thread
From: Christoph Hellwig @ 2011-05-23 11:06 UTC (permalink / raw)
  To: Christoph Egger; +Cc: qemu-devel

On Mon, May 23, 2011 at 12:34:39PM +0200, Christoph Egger wrote:
>
> This does 2 things:
> - use the correct way to get the size of a disk device or partition
>     (from haad@NetBSD.org)
> - if given a block device, use the character device instead.
>     (from bouyer@NetBSD.org)

Please split that into two independent patches.

> +    if (S_ISLNK(sb.st_mode)) {
> +        fprintf(stderr, "%s: symbolic link not supported\n", filename);
> +        return -EINVAL;
> +    }

Why not, it's a pretty clear regression from current code, and will
break various Linux setups where there are lots of symlinks under /dev,
as well as users using symlinks for their image files.

> +#if defined(__NetBSD__)
> +    if (S_ISBLK(sb.st_mode)) {
> +        static char namebuf[PATH_MAX];
> +        const char *dp = strrchr(filename, '/');
> +
> +        if (dp == NULL) {
> +            snprintf(namebuf, PATH_MAX, "r%s", filename);
> +        } else {
> +            snprintf(namebuf, PATH_MAX, "%.*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

Please split this out into a helper, which has a no-op version
for other operating systems.  It probably should also be enabled
for other operating systems having char and block nodes for disk
devices.  That's at least OpenBSD and Solaris, not sure about
Darwin.

> -#ifdef __OpenBSD__
> +#if defined(__OpenBSD__) || defined(__NetBSD__)
>  static int64_t raw_getlength(BlockDriverState *bs)
>  {
>      BDRVRawState *s = bs->opaque;
> @@ -613,12 +645,22 @@ static int64_t raw_getlength(BlockDriverState *bs)
>      if (fstat(fd, &st))
>          return -1;
>      if (S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode)) {
> -        struct disklabel dl;
> +#if defined(__NetBSD__)
> +        struct dkwedge_info dkw;
>
> -        if (ioctl(fd, DIOCGDINFO, &dl))
> -            return -1;
> -        return (uint64_t)dl.d_secsize *
> -            dl.d_partitions[DISKPART(st.st_rdev)].p_size;
> +        if (ioctl(fd, DIOCGWEDGEINFO, &dkw) != -1) {
> +            return dkw.dkw_size * 512;
> +        } else {
> +#endif

Please provide a completely separate raw_getlength for NetBSD instead
of creating this ifdef mess for almost no shared code.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Qemu-devel] [PATCH] block/raw-posix: get right size of partition size
  2011-05-23 11:06   ` Christoph Hellwig
@ 2011-05-23 12:26     ` Christoph Egger
  0 siblings, 0 replies; 4+ messages in thread
From: Christoph Egger @ 2011-05-23 12:26 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: qemu-devel

On 05/23/11 13:06, Christoph Hellwig wrote:
> On Mon, May 23, 2011 at 12:34:39PM +0200, Christoph Egger wrote:
>>
>> This does 2 things:
>> - use the correct way to get the size of a disk device or partition
>>      (from haad@NetBSD.org)
>> - if given a block device, use the character device instead.
>>      (from bouyer@NetBSD.org)
>
> Please split that into two independent patches.

ok.

>
>> +    if (S_ISLNK(sb.st_mode)) {
>> +        fprintf(stderr, "%s: symbolic link not supported\n", filename);
>> +        return -EINVAL;
>> +    }
>
> Why not, it's a pretty clear regression from current code, and will
> break various Linux setups where there are lots of symlinks under /dev,
> as well as users using symlinks for their image files.

there's no easy way to find the real target of a symlink, to find the 
corresponding character device (this could be refinded, because this 
restriction only applies if the target is a block device).

>
>> +#if defined(__NetBSD__)
>> +    if (S_ISBLK(sb.st_mode)) {
>> +        static char namebuf[PATH_MAX];
>> +        const char *dp = strrchr(filename, '/');
>> +
>> +        if (dp == NULL) {
>> +            snprintf(namebuf, PATH_MAX, "r%s", filename);
>> +        } else {
>> +            snprintf(namebuf, PATH_MAX, "%.*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
>
> Please split this out into a helper, which has a no-op version
> for other operating systems.  It probably should also be enabled
> for other operating systems having char and block nodes for disk
> devices.  That's at least OpenBSD and Solaris, not sure about
> Darwin.

Yes, but don't have a test machine right now.

>> -#ifdef __OpenBSD__
>> +#if defined(__OpenBSD__) || defined(__NetBSD__)
>>   static int64_t raw_getlength(BlockDriverState *bs)
>>   {
>>       BDRVRawState *s = bs->opaque;
>> @@ -613,12 +645,22 @@ static int64_t raw_getlength(BlockDriverState *bs)
>>       if (fstat(fd,&st))
>>           return -1;
>>       if (S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode)) {
>> -        struct disklabel dl;
>> +#if defined(__NetBSD__)
>> +        struct dkwedge_info dkw;
>>
>> -        if (ioctl(fd, DIOCGDINFO,&dl))
>> -            return -1;
>> -        return (uint64_t)dl.d_secsize *
>> -            dl.d_partitions[DISKPART(st.st_rdev)].p_size;
>> +        if (ioctl(fd, DIOCGWEDGEINFO,&dkw) != -1) {
>> +            return dkw.dkw_size * 512;
>> +        } else {
>> +#endif
>
> Please provide a completely separate raw_getlength for NetBSD instead
> of creating this ifdef mess for almost no shared code.

Ok.


-- 
---to satisfy European Law for business letters:
Advanced Micro Devices GmbH
Einsteinring 24, 85689 Dornach b. Muenchen
Geschaeftsfuehrer: Alberto Bozzo, Andrew Bowd
Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen
Registergericht Muenchen, HRB Nr. 43632

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2011-05-23 13:08 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-05-23 10:05 [Qemu-devel] [PATCH] block/raw-posix: get right partition size Christoph Egger
2011-05-23 10:34 ` [Qemu-devel] [PATCH] block/raw-posix: get right size of " Christoph Egger
2011-05-23 11:06   ` Christoph Hellwig
2011-05-23 12:26     ` Christoph Egger

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.