qemu-block
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v3 7/7] block: detect DKIOCGETBLOCKCOUNT/SIZE before use


From: Max Reitz
Subject: Re: [PATCH v3 7/7] block: detect DKIOCGETBLOCKCOUNT/SIZE before use
Date: Tue, 15 Jun 2021 18:50:57 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.10.1

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 <imp@bsdimp.com>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Joelle van Dyne <j@getutm.app>
Message-Id: <20210315180341.31638-4-j@getutm.app>
Signed-off-by: Paolo Bonzini <pbonzini@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

[Prev in Thread] Current Thread [Next in Thread]