[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v3 03/17] block/io: use int64_t bytes parameter in bdrv_check_byt
From: |
Vladimir Sementsov-Ogievskiy |
Subject: |
[PATCH v3 03/17] block/io: use int64_t bytes parameter in bdrv_check_byte_request() |
Date: |
Thu, 30 Apr 2020 14:10:19 +0300 |
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 <address@hidden>
Reviewed-by: Eric Blake <address@hidden>
---
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
- [PATCH v3 00/17] 64bit block-layer, Vladimir Sementsov-Ogievskiy, 2020/04/30
- [PATCH v3 01/17] block/throttle-groups: throttle_group_co_io_limits_intercept(): 64bit bytes, Vladimir Sementsov-Ogievskiy, 2020/04/30
- [PATCH v3 03/17] block/io: use int64_t bytes parameter in bdrv_check_byte_request(),
Vladimir Sementsov-Ogievskiy <=
- [PATCH v3 02/17] block: use int64_t as bytes type in tracked requests, Vladimir Sementsov-Ogievskiy, 2020/04/30
- [PATCH v3 04/17] block/io: use int64_t bytes in driver wrappers, Vladimir Sementsov-Ogievskiy, 2020/04/30
- [PATCH v3 05/17] block/io: support int64_t bytes in bdrv_co_do_pwrite_zeroes(), Vladimir Sementsov-Ogievskiy, 2020/04/30
- [PATCH v3 06/17] block/io: support int64_t bytes in bdrv_aligned_pwritev(), Vladimir Sementsov-Ogievskiy, 2020/04/30
- [PATCH v3 07/17] block/io: support int64_t bytes in bdrv_co_do_copy_on_readv(), Vladimir Sementsov-Ogievskiy, 2020/04/30
- [PATCH v3 08/17] block/io: support int64_t bytes in bdrv_aligned_preadv(), Vladimir Sementsov-Ogievskiy, 2020/04/30
- [PATCH v3 09/17] block/io: support int64_t bytes in bdrv_co_p{read, write}v_part(), Vladimir Sementsov-Ogievskiy, 2020/04/30
- [PATCH v3 10/17] block/io: support int64_t bytes in read/write wrappers, Vladimir Sementsov-Ogievskiy, 2020/04/30
- [PATCH v3 11/17] block/io: use int64_t bytes in copy_range, Vladimir Sementsov-Ogievskiy, 2020/04/30
- [PATCH v3 12/17] block/block-backend: convert blk io path to use int64_t parameters, Vladimir Sementsov-Ogievskiy, 2020/04/30