block: use int64_t as bytes type in tracked requests

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).

All requests in block/io must not overflow BDRV_MAX_LENGTH, all
external users of BdrvTrackedRequest already have corresponding
assertions, so we are safe. Add some assertions still.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Message-Id: <20201211183934.169161-9-vsementsov@virtuozzo.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
Eric Blake 2021-02-03 08:14:15 -06:00
parent 63f4ad1186
commit 8024726459
2 changed files with 11 additions and 7 deletions

View File

@ -717,10 +717,10 @@ static void tracked_request_end(BdrvTrackedRequest *req)
static void tracked_request_begin(BdrvTrackedRequest *req, static void tracked_request_begin(BdrvTrackedRequest *req,
BlockDriverState *bs, BlockDriverState *bs,
int64_t offset, int64_t offset,
uint64_t bytes, int64_t bytes,
enum BdrvTrackedRequestType type) enum BdrvTrackedRequestType type)
{ {
assert(bytes <= INT64_MAX && offset <= INT64_MAX - bytes); bdrv_check_request(offset, bytes, &error_abort);
*req = (BdrvTrackedRequest){ *req = (BdrvTrackedRequest){
.bs = bs, .bs = bs,
@ -741,8 +741,10 @@ static void tracked_request_begin(BdrvTrackedRequest *req,
} }
static bool tracked_request_overlaps(BdrvTrackedRequest *req, static bool tracked_request_overlaps(BdrvTrackedRequest *req,
int64_t offset, uint64_t bytes) int64_t offset, int64_t bytes)
{ {
bdrv_check_request(offset, bytes, &error_abort);
/* aaaa bbbb */ /* aaaa bbbb */
if (offset >= req->overlap_offset + req->overlap_bytes) { if (offset >= req->overlap_offset + req->overlap_bytes) {
return false; return false;
@ -810,8 +812,10 @@ static void tracked_request_set_serialising(BdrvTrackedRequest *req,
uint64_t align) uint64_t align)
{ {
int64_t overlap_offset = req->offset & ~(align - 1); int64_t overlap_offset = req->offset & ~(align - 1);
uint64_t overlap_bytes = ROUND_UP(req->offset + req->bytes, align) int64_t overlap_bytes =
- overlap_offset; ROUND_UP(req->offset + req->bytes, align) - overlap_offset;
bdrv_check_request(req->offset, req->bytes, &error_abort);
if (!req->serialising) { if (!req->serialising) {
qatomic_inc(&req->bs->serialising_in_flight); qatomic_inc(&req->bs->serialising_in_flight);

View File

@ -79,12 +79,12 @@ enum BdrvTrackedRequestType {
typedef struct BdrvTrackedRequest { typedef struct BdrvTrackedRequest {
BlockDriverState *bs; BlockDriverState *bs;
int64_t offset; int64_t offset;
uint64_t bytes; int64_t bytes;
enum BdrvTrackedRequestType type; enum BdrvTrackedRequestType type;
bool serialising; bool serialising;
int64_t overlap_offset; int64_t overlap_offset;
uint64_t overlap_bytes; int64_t overlap_bytes;
QLIST_ENTRY(BdrvTrackedRequest) list; QLIST_ENTRY(BdrvTrackedRequest) list;
Coroutine *co; /* owner, used for deadlock detection */ Coroutine *co; /* owner, used for deadlock detection */