The BlockBackend reference is required to be able to generate the QOM
path as part of emitted events.

A weak reference is enough because BlockAcctStats is tied directly to
one BlockBackend, and will be deleted via block_acct_cleanup() before
the BlockBackend is truly deleted.

Signed-off-by: Hanna Czenczek <[email protected]>
---
 include/block/accounting.h | 3 ++-
 block/accounting.c         | 7 ++++++-
 block/block-backend.c      | 2 +-
 3 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/include/block/accounting.h b/include/block/accounting.h
index 9386440ec89..025536239e6 100644
--- a/include/block/accounting.h
+++ b/include/block/accounting.h
@@ -81,6 +81,7 @@ typedef struct BlockLatencyHistogram {
 
 struct BlockAcctStats {
     QemuMutex lock;
+    BlockBackend *blk;
     uint64_t nr_bytes[BLOCK_MAX_IOTYPE];
     uint64_t nr_ops[BLOCK_MAX_IOTYPE];
     uint64_t invalid_ops[BLOCK_MAX_IOTYPE];
@@ -101,7 +102,7 @@ typedef struct BlockAcctCookie {
     enum BlockAcctType type;
 } BlockAcctCookie;
 
-void block_acct_init(BlockAcctStats *stats);
+void block_acct_init(BlockBackend *blk, BlockAcctStats *stats);
 bool block_acct_setup(BlockAcctStats *stats, enum OnOffAuto account_invalid,
                       enum OnOffAuto account_failed, uint32_t *stats_intervals,
                       uint32_t num_stats_intervals, Error **errp);
diff --git a/block/accounting.c b/block/accounting.c
index 66e5001403f..a74551d41f2 100644
--- a/block/accounting.c
+++ b/block/accounting.c
@@ -33,7 +33,7 @@
 static QEMUClockType clock_type = QEMU_CLOCK_REALTIME;
 static const int qtest_latency_ns = NANOSECONDS_PER_SECOND / 1000;
 
-void block_acct_init(BlockAcctStats *stats)
+void block_acct_init(BlockBackend *blk, BlockAcctStats *stats)
 {
     qemu_mutex_init(&stats->lock);
     if (qtest_enabled()) {
@@ -41,6 +41,11 @@ void block_acct_init(BlockAcctStats *stats)
     }
     stats->account_invalid = true;
     stats->account_failed = true;
+    /*
+     * No need to blk_ref() because block_acct_cleanup() is called exactly when
+     * the BB is deleted.
+     */
+    stats->blk = blk;
 }
 
 static bool bool_from_onoffauto(OnOffAuto val, bool def)
diff --git a/block/block-backend.c b/block/block-backend.c
index 164bda846f4..ca091a8bf5d 100644
--- a/block/block-backend.c
+++ b/block/block-backend.c
@@ -369,7 +369,7 @@ BlockBackend *blk_new(AioContext *ctx, uint64_t perm, 
uint64_t shared_perm)
     blk->on_read_error = BLOCKDEV_ON_ERROR_REPORT;
     blk->on_write_error = BLOCKDEV_ON_ERROR_ENOSPC;
 
-    block_acct_init(&blk->stats);
+    block_acct_init(blk, &blk->stats);
 
     qemu_mutex_init(&blk->queued_requests_lock);
     qemu_co_queue_init(&blk->queued_requests);
-- 
2.55.0


Reply via email to