[GEDI] [PATCH v3 03/17] block/io: use int64_t bytes parameter in bdrv_check_byte_request()

Vladimir Sementsov-Ogievskiy vsementsov at virtuozzo.com
Thu Apr 30 11:10:19 UTC 2020


We are generally moving to int64_t for both offset and bytes parameters
on all io paths.

Main motivation is realization of 64-bit write_zeroes operation for
fast zeroing large disk chunks, up to the whole disk.

We chose signed type, to be consistent with off_t (which is signed) and
with possibility for signed return type (where negative value means
error).

So, convert bdrv_check_byte_request() now.

Patch-correctness audit by Eric Blake:

  This changes an unsigned to signed value on 64-bit machines, and
  additionally widens the parameter on 32-bit machines.  Existing
  callers:

  bdrv_co_preadv_part() with 'unsigned int' - no impact
  bdrv_co_pwritev_part() with 'unsigned int' - no impact
  bdrv_co_copy_range_internal() with 'uint64_t' -
      potentially fixes a latent bug on 32-bit machines. Requires a
      larger audit to see how bdrv_co_copy_range() and friends are
      used:

  block/block-backend.c:blk_co_copy_range() - passes 'int', thus < 2G
  block/block-copy.c:block_copy_do_copy() -
      passes 'int64_t', but only after assert(nbytes < INT_MAX); also
      it has a BLOCK_COPY_MAX_COPY_RANGE set to 16M that factors into
      its calculations on how much to do per iteration

  So it looks like at present we are safe.

Series: 64bit-block-status
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov at virtuozzo.com>
Reviewed-by: Eric Blake <eblake at redhat.com>
---
 block/io.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/block/io.c b/block/io.c
index 20ebf3c536..7a7d4e578d 100644
--- a/block/io.c
+++ b/block/io.c
@@ -875,9 +875,9 @@ static bool coroutine_fn bdrv_wait_serialising_requests(BdrvTrackedRequest *self
 }
 
 static int bdrv_check_byte_request(BlockDriverState *bs, int64_t offset,
-                                   size_t size)
+                                   int64_t bytes)
 {
-    if (size > BDRV_REQUEST_MAX_BYTES) {
+    if (bytes > BDRV_REQUEST_MAX_BYTES) {
         return -EIO;
     }
 
@@ -885,7 +885,7 @@ static int bdrv_check_byte_request(BlockDriverState *bs, int64_t offset,
         return -ENOMEDIUM;
     }
 
-    if (offset < 0) {
+    if (offset < 0 || bytes < 0) {
         return -EIO;
     }
 
-- 
2.21.0



More information about the integration mailing list