diff options
author | Vladimir Sementsov-Ogievskiy | 2020-10-21 16:58:44 +0200 |
---|---|---|
committer | Max Reitz | 2020-12-18 12:35:55 +0100 |
commit | d1a764d126aa9bd1b519855607f55daf266b07bf (patch) | |
tree | a38cf66506446cbde41fe5aefa6f1979ac5901f2 /block | |
parent | block: bdrv_mark_request_serialising: split non-waiting function (diff) | |
download | qemu-d1a764d126aa9bd1b519855607f55daf266b07bf.tar.gz qemu-d1a764d126aa9bd1b519855607f55daf266b07bf.tar.xz qemu-d1a764d126aa9bd1b519855607f55daf266b07bf.zip |
block: introduce BDRV_REQ_NO_WAIT flag
Add flag to make serialising request no wait: if there are conflicting
requests, just return error immediately. It's will be used in upcoming
preallocate filter.
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
Message-Id: <20201021145859.11201-7-vsementsov@virtuozzo.com>
Signed-off-by: Max Reitz <mreitz@redhat.com>
Diffstat (limited to 'block')
-rw-r--r-- | block/io.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/block/io.c b/block/io.c index fadfed3ab8..95b1c56c06 100644 --- a/block/io.c +++ b/block/io.c @@ -1858,9 +1858,18 @@ bdrv_co_write_req_prepare(BdrvChild *child, int64_t offset, uint64_t bytes, assert(!(bs->open_flags & BDRV_O_INACTIVE)); assert((bs->open_flags & BDRV_O_NO_IO) == 0); assert(!(flags & ~BDRV_REQ_MASK)); + assert(!((flags & BDRV_REQ_NO_WAIT) && !(flags & BDRV_REQ_SERIALISING))); if (flags & BDRV_REQ_SERIALISING) { - bdrv_make_request_serialising(req, bdrv_get_cluster_size(bs)); + QEMU_LOCK_GUARD(&bs->reqs_lock); + + tracked_request_set_serialising(req, bdrv_get_cluster_size(bs)); + + if ((flags & BDRV_REQ_NO_WAIT) && bdrv_find_conflicting_request(req)) { + return -EBUSY; + } + + bdrv_wait_serialising_requests_locked(req); } else { bdrv_wait_serialising_requests(req); } |