The patch creates helper to advance flush generation.
Right now there is the only place which handles bs->write_gen, but this
is going to be changed in the next patches. Unfortunately we need to
precisely control the moment of flush() when BDRV_REQ_FUA is passed
as a request flag. Generic processing inside bdrv_co_write_req_finish()
is too late.
Signed-off-by: Denis V. Lunev <den@openvz.org>
CC: Andrey Drobyshev <andrey.drobyshev@virtuozzo.com>
CC: Kevin Wolf <kwolf@redhat.com>
CC: Hanna Reitz <hreitz@redhat.com>
---
block/io.c | 2 +-
include/block/block_int-common.h | 5 +++++
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/block/io.c b/block/io.c
index d37da2e0ac5..f39ff862c11 100644
--- a/block/io.c
+++ b/block/io.c
@@ -2147,7 +2147,7 @@ bdrv_co_write_req_finish(BdrvChild *child, int64_t offset, int64_t bytes,
bdrv_check_request(offset, bytes, &error_abort);
- qatomic_inc(&bs->write_gen);
+ bdrv_advance_flush_gen(bs);
/*
* Discard cannot extend the image, but in error handling cases, such as
diff --git a/include/block/block_int-common.h b/include/block/block_int-common.h
index 80c54a6d09f..67552463dbe 100644
--- a/include/block/block_int-common.h
+++ b/include/block/block_int-common.h
@@ -1373,6 +1373,11 @@ int bdrv_check_qiov_request(int64_t offset, int64_t bytes,
QEMUIOVector *qiov, size_t qiov_offset,
Error **errp);
+static inline void bdrv_advance_flush_gen(BlockDriverState *bs)
+{
+ qatomic_inc(&bs->write_gen);
+}
+
bool cbw_filter_present(void);
#ifdef _WIN32
--
2.43.5
On 12/29/25 6:07 PM, Denis V. Lunev wrote:
> The patch creates helper to advance flush generation.
>
> Right now there is the only place which handles bs->write_gen, but this
> is going to be changed in the next patches. Unfortunately we need to
> precisely control the moment of flush() when BDRV_REQ_FUA is passed
> as a request flag. Generic processing inside bdrv_co_write_req_finish()
> is too late.
>
> Signed-off-by: Denis V. Lunev <den@openvz.org>
> CC: Andrey Drobyshev <andrey.drobyshev@virtuozzo.com>
> CC: Kevin Wolf <kwolf@redhat.com>
> CC: Hanna Reitz <hreitz@redhat.com>
> ---
> block/io.c | 2 +-
> include/block/block_int-common.h | 5 +++++
> 2 files changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/block/io.c b/block/io.c
> index d37da2e0ac5..f39ff862c11 100644
> --- a/block/io.c
> +++ b/block/io.c
> @@ -2147,7 +2147,7 @@ bdrv_co_write_req_finish(BdrvChild *child, int64_t offset, int64_t bytes,
>
> bdrv_check_request(offset, bytes, &error_abort);
>
> - qatomic_inc(&bs->write_gen);
> + bdrv_advance_flush_gen(bs);
>
> /*
> * Discard cannot extend the image, but in error handling cases, such as
> diff --git a/include/block/block_int-common.h b/include/block/block_int-common.h
> index 80c54a6d09f..67552463dbe 100644
> --- a/include/block/block_int-common.h
> +++ b/include/block/block_int-common.h
> @@ -1373,6 +1373,11 @@ int bdrv_check_qiov_request(int64_t offset, int64_t bytes,
> QEMUIOVector *qiov, size_t qiov_offset,
> Error **errp);
>
> +static inline void bdrv_advance_flush_gen(BlockDriverState *bs)
> +{
> + qatomic_inc(&bs->write_gen);
> +}
> +
The name is misleading. In bdrv_co_flush() we're comparing
bs->flushed_gen with bs->write_gen. Here we're incrementing
bs->write_gen. Did you mean bdrv_advance_write_gen() maybe?
> bool cbw_filter_present(void);
>
Minor issue: patch doesn't apply cleanly because of the declaration
above. Probably was committed on a downstream branch?
> #ifdef _WIN32
© 2016 - 2026 Red Hat, Inc.