qemu-devel.nongnu.org archive mirror
 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; 6+ 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] 6+ 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; 6+ messages in thread
From: Christoph Egger @ 2011-05-23 10:34 UTC (permalink / raw)
  To: qemu-devel@nongnu.org


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] 6+ 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; 6+ messages in thread
From: Christoph Hellwig @ 2011-05-23 11:06 UTC (permalink / raw)
  To: Christoph Egger; +Cc: qemu-devel@nongnu.org

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] 6+ 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; 6+ messages in thread
From: Christoph Egger @ 2011-05-23 12:26 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: qemu-devel@nongnu.org

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] 6+ messages in thread

* [Qemu-devel] [PATCH] block/raw-posix: get right partition size
@ 2011-05-23 12:31 Christoph Egger
  2011-05-25 13:50 ` Kevin Wolf
  0 siblings, 1 reply; 6+ messages in thread
From: Christoph Egger @ 2011-05-23 12:31 UTC (permalink / raw)
  To: qemu-devel@nongnu.org


use the correct way to get the size of a disk device or partition

From: Adam Hamsik <haad@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..d05f373 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>
@@ -622,6 +663,31 @@ static int64_t raw_getlength(BlockDriverState *bs)
      } else
          return st.st_size;
  }
+#elif defined(__NetBSD__)
+static int64_t raw_getlength(BlockDriverState *bs)
+{
+    BDRVRawState *s = bs->opaque;
+    int fd = s->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) {
+            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)
  {


-- 
---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] 6+ messages in thread

* Re: [Qemu-devel] [PATCH] block/raw-posix: get right partition size
  2011-05-23 12:31 [Qemu-devel] [PATCH] block/raw-posix: get right " Christoph Egger
@ 2011-05-25 13:50 ` Kevin Wolf
  0 siblings, 0 replies; 6+ messages in thread
From: Kevin Wolf @ 2011-05-25 13:50 UTC (permalink / raw)
  To: Christoph Egger; +Cc: qemu-devel@nongnu.org

Am 23.05.2011 14:31, schrieb Christoph Egger:
> 
> use the correct way to get the size of a disk device or partition
> 
> From: Adam Hamsik <haad@netbsd.org>
> Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>

Thanks, applied to the block branch.

Kevin

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

end of thread, other threads:[~2011-05-25 14:47 UTC | newest]

Thread overview: 6+ 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
  -- strict thread matches above, loose matches on Subject: below --
2011-05-23 12:31 [Qemu-devel] [PATCH] block/raw-posix: get right " Christoph Egger
2011-05-25 13:50 ` Kevin Wolf

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).