On 03.06.21 15:37, Paolo Bonzini wrote:
From: Joelle van Dyne <j...@getutm.app>
iOS hosts do not have these defined so we fallback to the
default behaviour.
Co-authored-by: Warner Losh <i...@bsdimp.com>
Reviewed-by: Peter Maydell <peter.mayd...@linaro.org>
Signed-off-by: Joelle van Dyne <j...@getutm.app>
Message-Id: <20210315180341.31638-...@getutm.app>
Signed-off-by: Paolo Bonzini <pbonz...@redhat.com>
---
block/file-posix.c | 21 +++++++++------------
1 file changed, 9 insertions(+), 12 deletions(-)
diff --git a/block/file-posix.c b/block/file-posix.c
index 5821e1afed..4e2f7cf508 100644
--- a/block/file-posix.c
+++ b/block/file-posix.c
@@ -2322,8 +2322,11 @@ static int64_t raw_getlength(BlockDriverState *bs)
again:
#endif
if (!fstat(fd, &sb) && (S_IFCHR & sb.st_mode)) {
+ size = 0;
#ifdef DIOCGMEDIASIZE
- if (ioctl(fd, DIOCGMEDIASIZE, (off_t *)&size))
+ if (ioctl(fd, DIOCGMEDIASIZE, (off_t *)&size)) {
Pre-existing, but I feel compelled to express my unease about this cast.
+ size = 0;
+ }
#elif defined(DIOCGPART)
{
struct partinfo pi;
@@ -2332,9 +2335,7 @@ again:
else
size = 0;
}
- if (size == 0)
-#endif
-#if defined(__APPLE__) && defined(__MACH__)
+#elif defined(DKIOCGETBLOCKCOUNT) && defined(DKIOCGETBLOCKSIZE)
As far a I can tell, before this patch, if the DIOCGMEDIASIZE ioctl
failed, we fell back to this DKIOCGETBLOCKCOUNT/SIZE block (if compiled
in). Now this is an #elif and so will not be used if DIOCGMEDIASIZE was
defined. Is that intentional?
This may be fine, and apart from that, this patch looks good to me, but
this change in behavior wasn’t mentioned in the commit message, hence me
asking.
{
uint64_t sectors = 0;
uint32_t sector_size = 0;
@@ -2342,19 +2343,15 @@ again:
if (ioctl(fd, DKIOCGETBLOCKCOUNT, §ors) == 0
&& ioctl(fd, DKIOCGETBLOCKSIZE, §or_size) == 0) {
size = sectors * sector_size;
- } else {
- size = lseek(fd, 0LL, SEEK_END);
- if (size < 0) {
- return -errno;
- }
}
}
-#else
- size = lseek(fd, 0LL, SEEK_END);
+#endif
+ if (size == 0) {
+ size = lseek(fd, 0LL, SEEK_END);
+ }
if (size < 0) {
return -errno;
}
-#endif
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
switch(s->type) {
case FTYPE_CD: