block: Add blk_co_pwrite_compressed()

Also convert blk_pwrite_compressed() 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-12-afaria@redhat.com>
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
This commit is contained in:
Alberto Faria 2022-07-05 17:15:19 +01:00 committed by Hanna Reitz
parent 0cadf2c8a3
commit 2c9715fa28
3 changed files with 27 additions and 6 deletions

View File

@ -2314,13 +2314,13 @@ int coroutine_fn blk_co_pwrite_zeroes(BlockBackend *blk, int64_t offset,
flags | BDRV_REQ_ZERO_WRITE); flags | BDRV_REQ_ZERO_WRITE);
} }
int blk_pwrite_compressed(BlockBackend *blk, int64_t offset, int64_t bytes, int coroutine_fn blk_co_pwrite_compressed(BlockBackend *blk, int64_t offset,
const void *buf) int64_t bytes, const void *buf)
{ {
QEMUIOVector qiov = QEMU_IOVEC_INIT_BUF(qiov, buf, bytes); QEMUIOVector qiov = QEMU_IOVEC_INIT_BUF(qiov, buf, bytes);
IO_OR_GS_CODE(); IO_OR_GS_CODE();
return blk_pwritev_part(blk, offset, bytes, &qiov, 0, return blk_co_pwritev_part(blk, offset, bytes, &qiov, 0,
BDRV_REQ_WRITE_COMPRESSED); BDRV_REQ_WRITE_COMPRESSED);
} }
int blk_truncate(BlockBackend *blk, int64_t offset, bool exact, int blk_truncate(BlockBackend *blk, int64_t offset, bool exact,

View File

@ -167,8 +167,11 @@ int blk_flush(BlockBackend *blk);
int blk_ioctl(BlockBackend *blk, unsigned long int req, void *buf); int blk_ioctl(BlockBackend *blk, unsigned long int req, void *buf);
int blk_pwrite_compressed(BlockBackend *blk, int64_t offset, int64_t bytes, int generated_co_wrapper blk_pwrite_compressed(BlockBackend *blk,
const void *buf); int64_t offset, int64_t bytes,
const void *buf);
int coroutine_fn blk_co_pwrite_compressed(BlockBackend *blk, int64_t offset,
int64_t bytes, const void *buf);
int blk_pdiscard(BlockBackend *blk, int64_t offset, int64_t bytes); int blk_pdiscard(BlockBackend *blk, int64_t offset, int64_t bytes);
int blk_pwrite_zeroes(BlockBackend *blk, int64_t offset, int blk_pwrite_zeroes(BlockBackend *blk, int64_t offset,
int64_t bytes, BdrvRequestFlags flags); int64_t bytes, BdrvRequestFlags flags);

View File

@ -198,6 +198,20 @@ static void test_sync_op_blk_pwritev_part(BlockBackend *blk)
g_assert_cmpint(ret, ==, -EIO); g_assert_cmpint(ret, ==, -EIO);
} }
static void test_sync_op_blk_pwrite_compressed(BlockBackend *blk)
{
uint8_t buf[512] = { 0 };
int ret;
/* Late error: Not supported */
ret = blk_pwrite_compressed(blk, 0, sizeof(buf), buf);
g_assert_cmpint(ret, ==, -ENOTSUP);
/* Early error: Negative offset */
ret = blk_pwrite_compressed(blk, -2, sizeof(buf), buf);
g_assert_cmpint(ret, ==, -EIO);
}
static void test_sync_op_load_vmstate(BdrvChild *c) static void test_sync_op_load_vmstate(BdrvChild *c)
{ {
uint8_t buf[512]; uint8_t buf[512];
@ -377,6 +391,10 @@ const SyncOpTest sync_op_tests[] = {
.name = "/sync-op/pwritev_part", .name = "/sync-op/pwritev_part",
.fn = NULL, .fn = NULL,
.blkfn = test_sync_op_blk_pwritev_part, .blkfn = test_sync_op_blk_pwritev_part,
}, {
.name = "/sync-op/pwrite_compressed",
.fn = NULL,
.blkfn = test_sync_op_blk_pwrite_compressed,
}, { }, {
.name = "/sync-op/load_vmstate", .name = "/sync-op/load_vmstate",
.fn = test_sync_op_load_vmstate, .fn = test_sync_op_load_vmstate,