[PATCH 1/3] block: create bdrv_advance_flush_gen() helper

Denis V. Lunev via posted 3 patches 1 week, 1 day ago
[PATCH 1/3] block: create bdrv_advance_flush_gen() helper
Posted by Denis V. Lunev via 1 week, 1 day ago
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
Re: [PATCH 1/3] block: create bdrv_advance_flush_gen() helper
Posted by Andrey Drobyshev 1 week, 1 day ago
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