| From 50127f0ff9e13a15fd5bfeb2662e2404ff20f364 Mon Sep 17 00:00:00 2001 |
| From: Kevin Wolf <kwolf@redhat.com> |
| Date: Mon, 8 Jun 2020 15:01:31 +0100 |
| Subject: [PATCH 03/17] block: Add flags to bdrv(_co)_truncate() |
| |
| RH-Author: Kevin Wolf <kwolf@redhat.com> |
| Message-id: <20200608150140.38218-3-kwolf@redhat.com> |
| Patchwork-id: 97445 |
| O-Subject: [RHEL-AV-8.2.1 qemu-kvm PATCH 02/11] block: Add flags to bdrv(_co)_truncate() |
| Bugzilla: 1780574 |
| RH-Acked-by: Sergio Lopez Pascual <slp@redhat.com> |
| RH-Acked-by: Eric Blake <eblake@redhat.com> |
| RH-Acked-by: Max Reitz <mreitz@redhat.com> |
| |
| Now that block drivers can support flags for .bdrv_co_truncate, expose |
| the parameter in the node level interfaces bdrv_co_truncate() and |
| bdrv_truncate(). |
| |
| Signed-off-by: Kevin Wolf <kwolf@redhat.com> |
| Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> |
| Reviewed-by: Alberto Garcia <berto@igalia.com> |
| Reviewed-by: Max Reitz <mreitz@redhat.com> |
| Message-Id: <20200424125448.63318-3-kwolf@redhat.com> |
| Signed-off-by: Kevin Wolf <kwolf@redhat.com> |
| (cherry picked from commit 7b8e4857426f2e2de2441749996c6161b550bada) |
| Signed-off-by: Kevin Wolf <kwolf@redhat.com> |
| Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com> |
| |
| block/block-backend.c | 2 +- |
| block/crypto.c | 2 +- |
| block/io.c | 12 +++++++----- |
| block/parallels.c | 6 +++--- |
| block/qcow.c | 4 ++-- |
| block/qcow2-refcount.c | 2 +- |
| block/qcow2.c | 15 +++++++++------ |
| block/raw-format.c | 2 +- |
| block/vhdx-log.c | 2 +- |
| block/vhdx.c | 2 +- |
| block/vmdk.c | 2 +- |
| include/block/block.h | 5 +++-- |
| tests/test-block-iothread.c | 6 +++--- |
| 13 files changed, 34 insertions(+), 28 deletions(-) |
| |
| diff --git a/block/block-backend.c b/block/block-backend.c |
| index 38ae413..8be2006 100644 |
| |
| |
| @@ -2144,7 +2144,7 @@ int blk_truncate(BlockBackend *blk, int64_t offset, bool exact, |
| return -ENOMEDIUM; |
| } |
| |
| - return bdrv_truncate(blk->root, offset, exact, prealloc, errp); |
| + return bdrv_truncate(blk->root, offset, exact, prealloc, 0, errp); |
| } |
| |
| int blk_save_vmstate(BlockBackend *blk, const uint8_t *buf, |
| diff --git a/block/crypto.c b/block/crypto.c |
| index 6e4b726..fcb4a97 100644 |
| |
| |
| @@ -313,7 +313,7 @@ block_crypto_co_truncate(BlockDriverState *bs, int64_t offset, bool exact, |
| |
| offset += payload_offset; |
| |
| - return bdrv_co_truncate(bs->file, offset, exact, prealloc, errp); |
| + return bdrv_co_truncate(bs->file, offset, exact, prealloc, 0, errp); |
| } |
| |
| static void block_crypto_close(BlockDriverState *bs) |
| diff --git a/block/io.c b/block/io.c |
| index 549e5a4..3235ce5 100644 |
| |
| |
| @@ -3315,12 +3315,12 @@ static void bdrv_parent_cb_resize(BlockDriverState *bs) |
| * 'offset' bytes in length. |
| */ |
| int coroutine_fn bdrv_co_truncate(BdrvChild *child, int64_t offset, bool exact, |
| - PreallocMode prealloc, Error **errp) |
| + PreallocMode prealloc, BdrvRequestFlags flags, |
| + Error **errp) |
| { |
| BlockDriverState *bs = child->bs; |
| BlockDriver *drv = bs->drv; |
| BdrvTrackedRequest req; |
| - BdrvRequestFlags flags = 0; |
| int64_t old_size, new_bytes; |
| int ret; |
| |
| @@ -3378,7 +3378,7 @@ int coroutine_fn bdrv_co_truncate(BdrvChild *child, int64_t offset, bool exact, |
| } |
| ret = drv->bdrv_co_truncate(bs, offset, exact, prealloc, flags, errp); |
| } else if (bs->file && drv->is_filter) { |
| - ret = bdrv_co_truncate(bs->file, offset, exact, prealloc, errp); |
| + ret = bdrv_co_truncate(bs->file, offset, exact, prealloc, flags, errp); |
| } else { |
| error_setg(errp, "Image format driver does not support resize"); |
| ret = -ENOTSUP; |
| @@ -3411,6 +3411,7 @@ typedef struct TruncateCo { |
| int64_t offset; |
| bool exact; |
| PreallocMode prealloc; |
| + BdrvRequestFlags flags; |
| Error **errp; |
| int ret; |
| } TruncateCo; |
| @@ -3419,12 +3420,12 @@ static void coroutine_fn bdrv_truncate_co_entry(void *opaque) |
| { |
| TruncateCo *tco = opaque; |
| tco->ret = bdrv_co_truncate(tco->child, tco->offset, tco->exact, |
| - tco->prealloc, tco->errp); |
| + tco->prealloc, tco->flags, tco->errp); |
| aio_wait_kick(); |
| } |
| |
| int bdrv_truncate(BdrvChild *child, int64_t offset, bool exact, |
| - PreallocMode prealloc, Error **errp) |
| + PreallocMode prealloc, BdrvRequestFlags flags, Error **errp) |
| { |
| Coroutine *co; |
| TruncateCo tco = { |
| @@ -3432,6 +3433,7 @@ int bdrv_truncate(BdrvChild *child, int64_t offset, bool exact, |
| .offset = offset, |
| .exact = exact, |
| .prealloc = prealloc, |
| + .flags = flags, |
| .errp = errp, |
| .ret = NOT_DONE, |
| }; |
| diff --git a/block/parallels.c b/block/parallels.c |
| index 6d4ed77..2be92cf 100644 |
| |
| |
| @@ -203,7 +203,7 @@ static int64_t allocate_clusters(BlockDriverState *bs, int64_t sector_num, |
| } else { |
| ret = bdrv_truncate(bs->file, |
| (s->data_end + space) << BDRV_SECTOR_BITS, |
| - false, PREALLOC_MODE_OFF, NULL); |
| + false, PREALLOC_MODE_OFF, 0, NULL); |
| } |
| if (ret < 0) { |
| return ret; |
| @@ -493,7 +493,7 @@ static int coroutine_fn parallels_co_check(BlockDriverState *bs, |
| * That means we have to pass exact=true. |
| */ |
| ret = bdrv_truncate(bs->file, res->image_end_offset, true, |
| - PREALLOC_MODE_OFF, &local_err); |
| + PREALLOC_MODE_OFF, 0, &local_err); |
| if (ret < 0) { |
| error_report_err(local_err); |
| res->check_errors++; |
| @@ -889,7 +889,7 @@ static void parallels_close(BlockDriverState *bs) |
| |
| /* errors are ignored, so we might as well pass exact=true */ |
| bdrv_truncate(bs->file, s->data_end << BDRV_SECTOR_BITS, true, |
| - PREALLOC_MODE_OFF, NULL); |
| + PREALLOC_MODE_OFF, 0, NULL); |
| } |
| |
| g_free(s->bat_dirty_bmap); |
| diff --git a/block/qcow.c b/block/qcow.c |
| index 8973e4e..6b5f226 100644 |
| |
| |
| @@ -480,7 +480,7 @@ static int get_cluster_offset(BlockDriverState *bs, |
| return -E2BIG; |
| } |
| ret = bdrv_truncate(bs->file, cluster_offset + s->cluster_size, |
| - false, PREALLOC_MODE_OFF, NULL); |
| + false, PREALLOC_MODE_OFF, 0, NULL); |
| if (ret < 0) { |
| return ret; |
| } |
| @@ -1035,7 +1035,7 @@ static int qcow_make_empty(BlockDriverState *bs) |
| l1_length) < 0) |
| return -1; |
| ret = bdrv_truncate(bs->file, s->l1_table_offset + l1_length, false, |
| - PREALLOC_MODE_OFF, NULL); |
| + PREALLOC_MODE_OFF, 0, NULL); |
| if (ret < 0) |
| return ret; |
| |
| diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c |
| index f67ac6b..3a90d75 100644 |
| |
| |
| @@ -2017,7 +2017,7 @@ static int check_refblocks(BlockDriverState *bs, BdrvCheckResult *res, |
| } |
| |
| ret = bdrv_truncate(bs->file, offset + s->cluster_size, false, |
| - PREALLOC_MODE_OFF, &local_err); |
| + PREALLOC_MODE_OFF, 0, &local_err); |
| if (ret < 0) { |
| error_report_err(local_err); |
| goto resize_fail; |
| diff --git a/block/qcow2.c b/block/qcow2.c |
| index 977445e..c0fdcb9 100644 |
| |
| |
| @@ -3082,7 +3082,7 @@ static int coroutine_fn preallocate_co(BlockDriverState *bs, uint64_t offset, |
| mode = PREALLOC_MODE_OFF; |
| } |
| ret = bdrv_co_truncate(s->data_file, host_offset + cur_bytes, false, |
| - mode, errp); |
| + mode, 0, errp); |
| if (ret < 0) { |
| return ret; |
| } |
| @@ -4044,7 +4044,7 @@ static int coroutine_fn qcow2_co_truncate(BlockDriverState *bs, int64_t offset, |
| * always fulfilled, so there is no need to pass it on.) |
| */ |
| bdrv_co_truncate(bs->file, (last_cluster + 1) * s->cluster_size, |
| - false, PREALLOC_MODE_OFF, &local_err); |
| + false, PREALLOC_MODE_OFF, 0, &local_err); |
| if (local_err) { |
| warn_reportf_err(local_err, |
| "Failed to truncate the tail of the image: "); |
| @@ -4066,7 +4066,8 @@ static int coroutine_fn qcow2_co_truncate(BlockDriverState *bs, int64_t offset, |
| * file should be resized to the exact target size, too, |
| * so we pass @exact here. |
| */ |
| - ret = bdrv_co_truncate(s->data_file, offset, exact, prealloc, errp); |
| + ret = bdrv_co_truncate(s->data_file, offset, exact, prealloc, 0, |
| + errp); |
| if (ret < 0) { |
| goto fail; |
| } |
| @@ -4152,7 +4153,8 @@ static int coroutine_fn qcow2_co_truncate(BlockDriverState *bs, int64_t offset, |
| new_file_size = allocation_start + |
| nb_new_data_clusters * s->cluster_size; |
| /* Image file grows, so @exact does not matter */ |
| - ret = bdrv_co_truncate(bs->file, new_file_size, false, prealloc, errp); |
| + ret = bdrv_co_truncate(bs->file, new_file_size, false, prealloc, 0, |
| + errp); |
| if (ret < 0) { |
| error_prepend(errp, "Failed to resize underlying file: "); |
| qcow2_free_clusters(bs, allocation_start, |
| @@ -4255,7 +4257,8 @@ qcow2_co_pwritev_compressed_part(BlockDriverState *bs, |
| if (len < 0) { |
| return len; |
| } |
| - return bdrv_co_truncate(bs->file, len, false, PREALLOC_MODE_OFF, NULL); |
| + return bdrv_co_truncate(bs->file, len, false, PREALLOC_MODE_OFF, 0, |
| + NULL); |
| } |
| |
| if (offset_into_cluster(s, offset)) { |
| @@ -4493,7 +4496,7 @@ static int make_completely_empty(BlockDriverState *bs) |
| } |
| |
| ret = bdrv_truncate(bs->file, (3 + l1_clusters) * s->cluster_size, false, |
| - PREALLOC_MODE_OFF, &local_err); |
| + PREALLOC_MODE_OFF, 0, &local_err); |
| if (ret < 0) { |
| error_report_err(local_err); |
| goto fail; |
| diff --git a/block/raw-format.c b/block/raw-format.c |
| index f994c4a..c3acf9a 100644 |
| |
| |
| @@ -387,7 +387,7 @@ static int coroutine_fn raw_co_truncate(BlockDriverState *bs, int64_t offset, |
| |
| s->size = offset; |
| offset += s->offset; |
| - return bdrv_co_truncate(bs->file, offset, exact, prealloc, errp); |
| + return bdrv_co_truncate(bs->file, offset, exact, prealloc, 0, errp); |
| } |
| |
| static void raw_eject(BlockDriverState *bs, bool eject_flag) |
| diff --git a/block/vhdx-log.c b/block/vhdx-log.c |
| index 13a49c2..404fb5f 100644 |
| |
| |
| @@ -558,7 +558,7 @@ static int vhdx_log_flush(BlockDriverState *bs, BDRVVHDXState *s, |
| goto exit; |
| } |
| ret = bdrv_truncate(bs->file, new_file_size, false, |
| - PREALLOC_MODE_OFF, NULL); |
| + PREALLOC_MODE_OFF, 0, NULL); |
| if (ret < 0) { |
| goto exit; |
| } |
| diff --git a/block/vhdx.c b/block/vhdx.c |
| index 33e57cd..5dfbb20 100644 |
| |
| |
| @@ -1264,7 +1264,7 @@ static int vhdx_allocate_block(BlockDriverState *bs, BDRVVHDXState *s, |
| } |
| |
| return bdrv_truncate(bs->file, *new_offset + s->block_size, false, |
| - PREALLOC_MODE_OFF, NULL); |
| + PREALLOC_MODE_OFF, 0, NULL); |
| } |
| |
| /* |
| diff --git a/block/vmdk.c b/block/vmdk.c |
| index eb726f2..1bbf937 100644 |
| |
| |
| @@ -2077,7 +2077,7 @@ vmdk_co_pwritev_compressed(BlockDriverState *bs, uint64_t offset, |
| } |
| length = QEMU_ALIGN_UP(length, BDRV_SECTOR_SIZE); |
| ret = bdrv_truncate(s->extents[i].file, length, false, |
| - PREALLOC_MODE_OFF, NULL); |
| + PREALLOC_MODE_OFF, 0, NULL); |
| if (ret < 0) { |
| return ret; |
| } |
| diff --git a/include/block/block.h b/include/block/block.h |
| index b2a3074..4913596 100644 |
| |
| |
| @@ -348,9 +348,10 @@ BlockDriverState *bdrv_find_backing_image(BlockDriverState *bs, |
| void bdrv_refresh_filename(BlockDriverState *bs); |
| |
| int coroutine_fn bdrv_co_truncate(BdrvChild *child, int64_t offset, bool exact, |
| - PreallocMode prealloc, Error **errp); |
| + PreallocMode prealloc, BdrvRequestFlags flags, |
| + Error **errp); |
| int bdrv_truncate(BdrvChild *child, int64_t offset, bool exact, |
| - PreallocMode prealloc, Error **errp); |
| + PreallocMode prealloc, BdrvRequestFlags flags, Error **errp); |
| |
| int64_t bdrv_nb_sectors(BlockDriverState *bs); |
| int64_t bdrv_getlength(BlockDriverState *bs); |
| diff --git a/tests/test-block-iothread.c b/tests/test-block-iothread.c |
| index 2f3b763..71e9bce 100644 |
| |
| |
| @@ -186,18 +186,18 @@ static void test_sync_op_truncate(BdrvChild *c) |
| int ret; |
| |
| /* Normal success path */ |
| - ret = bdrv_truncate(c, 65536, false, PREALLOC_MODE_OFF, NULL); |
| + ret = bdrv_truncate(c, 65536, false, PREALLOC_MODE_OFF, 0, NULL); |
| g_assert_cmpint(ret, ==, 0); |
| |
| /* Early error: Negative offset */ |
| - ret = bdrv_truncate(c, -2, false, PREALLOC_MODE_OFF, NULL); |
| + ret = bdrv_truncate(c, -2, false, PREALLOC_MODE_OFF, 0, NULL); |
| g_assert_cmpint(ret, ==, -EINVAL); |
| |
| /* Error: Read-only image */ |
| c->bs->read_only = true; |
| c->bs->open_flags &= ~BDRV_O_RDWR; |
| |
| - ret = bdrv_truncate(c, 65536, false, PREALLOC_MODE_OFF, NULL); |
| + ret = bdrv_truncate(c, 65536, false, PREALLOC_MODE_OFF, 0, NULL); |
| g_assert_cmpint(ret, ==, -EACCES); |
| |
| c->bs->read_only = false; |
| -- |
| 1.8.3.1 |
| |