diff options
author | Max Reitz | 2019-06-12 22:57:15 +0200 |
---|---|---|
committer | Kevin Wolf | 2020-09-07 12:31:31 +0200 |
commit | ae23f78646e9635ec9cbf15dbf82a717ea1b0e69 (patch) | |
tree | d2e1e4f5f006c038a18f518e80e5d483c17133ab | |
parent | block: Drop bdrv_is_encrypted() (diff) | |
download | qemu-ae23f78646e9635ec9cbf15dbf82a717ea1b0e69.tar.gz qemu-ae23f78646e9635ec9cbf15dbf82a717ea1b0e69.tar.xz qemu-ae23f78646e9635ec9cbf15dbf82a717ea1b0e69.zip |
block: Add bdrv_supports_compressed_writes()
Filters cannot compress data themselves but they have to implement
.bdrv_co_pwritev_compressed() still (or they cannot forward compressed
writes). Therefore, checking whether
bs->drv->bdrv_co_pwritev_compressed is non-NULL is not sufficient to
know whether the node can actually handle compressed writes. This
function looks down the filter chain to see whether there is a
non-filter that can actually convert the compressed writes into
compressed data (and thus normal writes).
Signed-off-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
-rw-r--r-- | block.c | 23 | ||||
-rw-r--r-- | include/block/block.h | 1 |
2 files changed, 24 insertions, 0 deletions
@@ -5065,6 +5065,29 @@ bool bdrv_is_sg(BlockDriverState *bs) return bs->sg; } +/** + * Return whether the given node supports compressed writes. + */ +bool bdrv_supports_compressed_writes(BlockDriverState *bs) +{ + BlockDriverState *filtered; + + if (!bs->drv || !block_driver_can_compress(bs->drv)) { + return false; + } + + filtered = bdrv_filter_bs(bs); + if (filtered) { + /* + * Filters can only forward compressed writes, so we have to + * check the child. + */ + return bdrv_supports_compressed_writes(filtered); + } + + return true; +} + const char *bdrv_get_format_name(BlockDriverState *bs) { return bs->drv ? bs->drv->format_name : NULL; diff --git a/include/block/block.h b/include/block/block.h index 2c09b93d07..981ab5b314 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -532,6 +532,7 @@ BlockDriverState *bdrv_next(BdrvNextIterator *it); void bdrv_next_cleanup(BdrvNextIterator *it); BlockDriverState *bdrv_next_monitor_owned(BlockDriverState *bs); +bool bdrv_supports_compressed_writes(BlockDriverState *bs); void bdrv_iterate_format(void (*it)(void *opaque, const char *name), void *opaque, bool read_only); const char *bdrv_get_node_name(const BlockDriverState *bs); |