blockjob: query driver-specific info via a new 'query' driver method
authorFiona Ebner <f.ebner@proxmox.com>
Tue, 31 Oct 2023 13:54:29 +0000 (14:54 +0100)
committerKevin Wolf <kwolf@redhat.com>
Tue, 31 Oct 2023 17:20:29 +0000 (18:20 +0100)
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
Message-ID: <20231031135431.393137-9-f.ebner@proxmox.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
blockjob.c
include/block/blockjob_int.h

index 5b4786a70fc13a4a6397c65d1797cda72af0035c..5b24de356de912572ba5ac25896650c3ec9fca12 100644 (file)
@@ -378,6 +378,7 @@ BlockJobInfo *block_job_query_locked(BlockJob *job, Error **errp)
 {
     BlockJobInfo *info;
     uint64_t progress_current, progress_total;
+    const BlockJobDriver *drv = block_job_driver(job);
 
     GLOBAL_STATE_CODE();
 
@@ -407,6 +408,11 @@ BlockJobInfo *block_job_query_locked(BlockJob *job, Error **errp)
                         g_strdup(error_get_pretty(job->job.err)) :
                         g_strdup(strerror(-job->job.ret));
     }
+    if (drv->query) {
+        job_unlock();
+        drv->query(job, info);
+        job_lock();
+    }
     return info;
 }
 
index a4656d4cb5e7a7af73da159d2632770e49e98b6b..18ee6f7bf0e9a51eda1a051defb3defca7108f20 100644 (file)
@@ -74,6 +74,11 @@ struct BlockJobDriver {
      * Note that this can already be called before the job coroutine is running.
      */
     void (*change)(BlockJob *job, BlockJobChangeOptions *opts, Error **errp);
+
+    /*
+     * Query information specific to this kind of block job.
+     */
+    void (*query)(BlockJob *job, BlockJobInfo *info);
 };
 
 /*