qemu-block
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v7 40/47] block: Inline bdrv_co_block_status_from_*()


From: Andrey Shinkevich
Subject: Re: [PATCH v7 40/47] block: Inline bdrv_co_block_status_from_*()
Date: Fri, 24 Jul 2020 21:00:47 +0300
User-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:68.0) Gecko/20100101 Thunderbird/68.9.0

On 25.06.2020 18:22, Max Reitz wrote:
With bdrv_filter_bs(), we can easily handle this default filter behavior
in bdrv_co_block_status().

blkdebug wants to have an additional assertion, so it keeps its own
implementation, except bdrv_co_block_status_from_file() needs to be
inlined there.

Suggested-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Max Reitz <mreitz@redhat.com>
---
  include/block/block_int.h | 23 ------------------
  block/backup-top.c        |  2 --
  block/blkdebug.c          |  7 ++++--
  block/blklogwrites.c      |  1 -
  block/commit.c            |  1 -
  block/copy-on-read.c      |  2 --
  block/filter-compress.c   |  2 --
  block/io.c                | 51 +++++++++++++--------------------------
  block/mirror.c            |  1 -
  block/throttle.c          |  1 -
  10 files changed, 22 insertions(+), 69 deletions(-)

diff --git a/include/block/block_int.h b/include/block/block_int.h
index 6e09e15ed4..e5a328c389 100644
--- a/include/block/block_int.h
+++ b/include/block/block_int.h
@@ -1291,29 +1291,6 @@ void bdrv_default_perms(BlockDriverState *bs, BdrvChild 
*c,
                          uint64_t perm, uint64_t shared,
                          uint64_t *nperm, uint64_t *nshared);
-/*
- * Default implementation for drivers to pass bdrv_co_block_status() to
- * their file.
- */
-int coroutine_fn bdrv_co_block_status_from_file(BlockDriverState *bs,
-                                                bool want_zero,
-                                                int64_t offset,
-                                                int64_t bytes,
-                                                int64_t *pnum,
-                                                int64_t *map,
-                                                BlockDriverState **file);
-/*
- * Default implementation for drivers to pass bdrv_co_block_status() to
- * their backing file.
- */
-int coroutine_fn bdrv_co_block_status_from_backing(BlockDriverState *bs,
-                                                   bool want_zero,
-                                                   int64_t offset,
-                                                   int64_t bytes,
-                                                   int64_t *pnum,
-                                                   int64_t *map,
-                                                   BlockDriverState **file);
-
  int64_t bdrv_sum_allocated_file_size(BlockDriverState *bs);
  int64_t bdrv_primary_allocated_file_size(BlockDriverState *bs);
  int64_t bdrv_notsup_allocated_file_size(BlockDriverState *bs);
diff --git a/block/backup-top.c b/block/backup-top.c
index 89bd3937d0..bf5fc22fc7 100644
--- a/block/backup-top.c
+++ b/block/backup-top.c
@@ -185,8 +185,6 @@ BlockDriver bdrv_backup_top_filter = {
      .bdrv_co_pwritev_compressed = backup_top_co_pwritev_compressed,
      .bdrv_co_flush              = backup_top_co_flush,
- .bdrv_co_block_status = bdrv_co_block_status_from_backing,
-
      .bdrv_refresh_filename      = backup_top_refresh_filename,
.bdrv_child_perm = backup_top_child_perm,
diff --git a/block/blkdebug.c b/block/blkdebug.c
index 7194bc7f06..cf78d8809e 100644
--- a/block/blkdebug.c
+++ b/block/blkdebug.c
@@ -757,8 +757,11 @@ static int coroutine_fn 
blkdebug_co_block_status(BlockDriverState *bs,
          return err;
      }
- return bdrv_co_block_status_from_file(bs, want_zero, offset, bytes,
-                                          pnum, map, file);
+    assert(bs->file && bs->file->bs);
+    *pnum = bytes;
+    *map = offset;
+    *file = bs->file->bs;
+    return BDRV_BLOCK_RAW | BDRV_BLOCK_OFFSET_VALID;
  }
static void blkdebug_close(BlockDriverState *bs)
diff --git a/block/blklogwrites.c b/block/blklogwrites.c
index 6753bd9a3e..c6b2711fe5 100644
--- a/block/blklogwrites.c
+++ b/block/blklogwrites.c
@@ -517,7 +517,6 @@ static BlockDriver bdrv_blk_log_writes = {
      .bdrv_co_pwrite_zeroes  = blk_log_writes_co_pwrite_zeroes,
      .bdrv_co_flush_to_disk  = blk_log_writes_co_flush_to_disk,
      .bdrv_co_pdiscard       = blk_log_writes_co_pdiscard,
-    .bdrv_co_block_status   = bdrv_co_block_status_from_file,
.is_filter = true,
      .strong_runtime_opts    = blk_log_writes_strong_runtime_opts,
diff --git a/block/commit.c b/block/commit.c
index 4122b6736d..ea9282daea 100644
--- a/block/commit.c
+++ b/block/commit.c
@@ -238,7 +238,6 @@ static void bdrv_commit_top_child_perm(BlockDriverState 
*bs, BdrvChild *c,
  static BlockDriver bdrv_commit_top = {
      .format_name                = "commit_top",
      .bdrv_co_preadv             = bdrv_commit_top_preadv,
-    .bdrv_co_block_status       = bdrv_co_block_status_from_backing,
      .bdrv_refresh_filename      = bdrv_commit_top_refresh_filename,
      .bdrv_child_perm            = bdrv_commit_top_child_perm,
diff --git a/block/copy-on-read.c b/block/copy-on-read.c
index a6a864f147..2816e61afe 100644
--- a/block/copy-on-read.c
+++ b/block/copy-on-read.c
@@ -146,8 +146,6 @@ static BlockDriver bdrv_copy_on_read = {
      .bdrv_eject                         = cor_eject,
      .bdrv_lock_medium                   = cor_lock_medium,
- .bdrv_co_block_status = bdrv_co_block_status_from_file,
-
      .has_variable_length                = true,
      .is_filter                          = true,
  };
diff --git a/block/filter-compress.c b/block/filter-compress.c
index 8ec1991c1f..5136371bf8 100644
--- a/block/filter-compress.c
+++ b/block/filter-compress.c
@@ -146,8 +146,6 @@ static BlockDriver bdrv_compress = {
      .bdrv_eject                         = compress_eject,
      .bdrv_lock_medium                   = compress_lock_medium,
- .bdrv_co_block_status = bdrv_co_block_status_from_file,
-
      .has_variable_length                = true,
      .is_filter                          = true,
  };
diff --git a/block/io.c b/block/io.c
index 9e802804bb..e2196d438c 100644
--- a/block/io.c
+++ b/block/io.c
@@ -2253,36 +2253,6 @@ typedef struct BdrvCoBlockStatusData {
      BlockDriverState **file;
  } BdrvCoBlockStatusData;
-int coroutine_fn bdrv_co_block_status_from_file(BlockDriverState *bs,
-                                                bool want_zero,
-                                                int64_t offset,
-                                                int64_t bytes,
-                                                int64_t *pnum,
-                                                int64_t *map,
-                                                BlockDriverState **file)
-{
-    assert(bs->file && bs->file->bs);
-    *pnum = bytes;
-    *map = offset;
-    *file = bs->file->bs;
-    return BDRV_BLOCK_RAW | BDRV_BLOCK_OFFSET_VALID;
-}
-
-int coroutine_fn bdrv_co_block_status_from_backing(BlockDriverState *bs,
-                                                   bool want_zero,
-                                                   int64_t offset,
-                                                   int64_t bytes,
-                                                   int64_t *pnum,
-                                                   int64_t *map,
-                                                   BlockDriverState **file)
-{
-    assert(bs->backing && bs->backing->bs);
-    *pnum = bytes;
-    *map = offset;
-    *file = bs->backing->bs;
-    return BDRV_BLOCK_RAW | BDRV_BLOCK_OFFSET_VALID;
-}
-
  /*
   * Returns the allocation status of the specified sectors.
   * Drivers not implementing the functionality are assumed to not support
@@ -2323,6 +2293,7 @@ static int coroutine_fn 
bdrv_co_block_status(BlockDriverState *bs,
      BlockDriverState *local_file = NULL;
      int64_t aligned_offset, aligned_bytes;
      uint32_t align;
+    bool has_filtered_child;
assert(pnum);
      *pnum = 0;
@@ -2348,7 +2319,8 @@ static int coroutine_fn 
bdrv_co_block_status(BlockDriverState *bs,
/* Must be non-NULL or bdrv_getlength() would have failed */
      assert(bs->drv);
-    if (!bs->drv->bdrv_co_block_status) {
+    has_filtered_child = bdrv_filter_child(bs);
+    if (!bs->drv->bdrv_co_block_status && !has_filtered_child) {
          *pnum = bytes;
          ret = BDRV_BLOCK_DATA | BDRV_BLOCK_ALLOCATED;
          if (offset + bytes == total_size) {
@@ -2369,9 +2341,20 @@ static int coroutine_fn 
bdrv_co_block_status(BlockDriverState *bs,
      aligned_offset = QEMU_ALIGN_DOWN(offset, align);
      aligned_bytes = ROUND_UP(offset + bytes, align) - aligned_offset;
- ret = bs->drv->bdrv_co_block_status(bs, want_zero, aligned_offset,
-                                        aligned_bytes, pnum, &local_map,
-                                        &local_file);
+    if (bs->drv->bdrv_co_block_status) {
+        ret = bs->drv->bdrv_co_block_status(bs, want_zero, aligned_offset,
+                                            aligned_bytes, pnum, &local_map,
+                                            &local_file);
+    } else {
+        /* Default code for filters */
+
+        local_file = bdrv_filter_bs(bs);
+        assert(local_file);
+
+        *pnum = aligned_bytes;
+        local_map = aligned_offset;
+        ret = BDRV_BLOCK_RAW | BDRV_BLOCK_OFFSET_VALID;
+    }
      if (ret < 0) {
          *pnum = 0;
          goto out;
diff --git a/block/mirror.c b/block/mirror.c
index 770de3b34e..5a9e42e488 100644
--- a/block/mirror.c
+++ b/block/mirror.c
@@ -1541,7 +1541,6 @@ static BlockDriver bdrv_mirror_top = {
      .bdrv_co_pdiscard           = bdrv_mirror_top_pdiscard,
      .bdrv_co_pwritev_compressed = bdrv_mirror_top_pwritev_compressed,
      .bdrv_co_flush              = bdrv_mirror_top_flush,
-    .bdrv_co_block_status       = bdrv_co_block_status_from_backing,
      .bdrv_refresh_filename      = bdrv_mirror_top_refresh_filename,
      .bdrv_child_perm            = bdrv_mirror_top_child_perm,
diff --git a/block/throttle.c b/block/throttle.c
index f6e619aca2..473ea758df 100644
--- a/block/throttle.c
+++ b/block/throttle.c
@@ -263,7 +263,6 @@ static BlockDriver bdrv_throttle = {
      .bdrv_reopen_prepare                =   throttle_reopen_prepare,
      .bdrv_reopen_commit                 =   throttle_reopen_commit,
      .bdrv_reopen_abort                  =   throttle_reopen_abort,
-    .bdrv_co_block_status               =   bdrv_co_block_status_from_file,
.bdrv_co_drain_begin = throttle_co_drain_begin,
      .bdrv_co_drain_end                  =   throttle_co_drain_end,


Reviewed-by: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com>





reply via email to

[Prev in Thread] Current Thread [Next in Thread]