block: Add blk_co_truncate()

Also convert blk_truncate() into a generated_co_wrapper.

Signed-off-by: Alberto Faria <afaria@redhat.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Hanna Reitz <hreitz@redhat.com>
Message-Id: <20220705161527.1054072-17-afaria@redhat.com>
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
This commit is contained in:
Alberto Faria 2022-07-05 17:15:24 +01:00 committed by Hanna Reitz
parent df02da003d
commit 015ed2529a
3 changed files with 24 additions and 5 deletions

View File

@ -2293,8 +2293,9 @@ int coroutine_fn blk_co_pwrite_compressed(BlockBackend *blk, int64_t offset,
BDRV_REQ_WRITE_COMPRESSED); BDRV_REQ_WRITE_COMPRESSED);
} }
int blk_truncate(BlockBackend *blk, int64_t offset, bool exact, int coroutine_fn blk_co_truncate(BlockBackend *blk, int64_t offset, bool exact,
PreallocMode prealloc, BdrvRequestFlags flags, Error **errp) PreallocMode prealloc, BdrvRequestFlags flags,
Error **errp)
{ {
IO_OR_GS_CODE(); IO_OR_GS_CODE();
if (!blk_is_available(blk)) { if (!blk_is_available(blk)) {
@ -2302,7 +2303,7 @@ int blk_truncate(BlockBackend *blk, int64_t offset, bool exact,
return -ENOMEDIUM; return -ENOMEDIUM;
} }
return bdrv_truncate(blk->root, offset, exact, prealloc, flags, errp); return bdrv_co_truncate(blk->root, offset, exact, prealloc, flags, errp);
} }
int blk_save_vmstate(BlockBackend *blk, const uint8_t *buf, int blk_save_vmstate(BlockBackend *blk, const uint8_t *buf,

View File

@ -182,7 +182,11 @@ int generated_co_wrapper blk_pwrite_zeroes(BlockBackend *blk, int64_t offset,
BdrvRequestFlags flags); BdrvRequestFlags flags);
int coroutine_fn blk_co_pwrite_zeroes(BlockBackend *blk, int64_t offset, int coroutine_fn blk_co_pwrite_zeroes(BlockBackend *blk, int64_t offset,
int64_t bytes, BdrvRequestFlags flags); int64_t bytes, BdrvRequestFlags flags);
int blk_truncate(BlockBackend *blk, int64_t offset, bool exact, int generated_co_wrapper blk_truncate(BlockBackend *blk, int64_t offset,
PreallocMode prealloc, BdrvRequestFlags flags, Error **errp); bool exact, PreallocMode prealloc,
BdrvRequestFlags flags, Error **errp);
int coroutine_fn blk_co_truncate(BlockBackend *blk, int64_t offset, bool exact,
PreallocMode prealloc, BdrvRequestFlags flags,
Error **errp);
#endif /* BLOCK_BACKEND_IO_H */ #endif /* BLOCK_BACKEND_IO_H */

View File

@ -298,6 +298,19 @@ static void test_sync_op_truncate(BdrvChild *c)
c->bs->open_flags |= BDRV_O_RDWR; c->bs->open_flags |= BDRV_O_RDWR;
} }
static void test_sync_op_blk_truncate(BlockBackend *blk)
{
int ret;
/* Normal success path */
ret = blk_truncate(blk, 65536, false, PREALLOC_MODE_OFF, 0, NULL);
g_assert_cmpint(ret, ==, 0);
/* Early error: Negative offset */
ret = blk_truncate(blk, -2, false, PREALLOC_MODE_OFF, 0, NULL);
g_assert_cmpint(ret, ==, -EINVAL);
}
static void test_sync_op_block_status(BdrvChild *c) static void test_sync_op_block_status(BdrvChild *c)
{ {
int ret; int ret;
@ -425,6 +438,7 @@ const SyncOpTest sync_op_tests[] = {
}, { }, {
.name = "/sync-op/truncate", .name = "/sync-op/truncate",
.fn = test_sync_op_truncate, .fn = test_sync_op_truncate,
.blkfn = test_sync_op_blk_truncate,
}, { }, {
.name = "/sync-op/block_status", .name = "/sync-op/block_status",
.fn = test_sync_op_block_status, .fn = test_sync_op_block_status,