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, &sectors) == 0
                 && ioctl(fd, DKIOCGETBLOCKSIZE, &sector_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:


Reply via email to