* [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
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).