diff options
Diffstat (limited to 'scsi/pr-manager.c')
-rw-r--r-- | scsi/pr-manager.c | 36 |
1 files changed, 13 insertions, 23 deletions
diff --git a/scsi/pr-manager.c b/scsi/pr-manager.c index 2a8f300dde..fb5fc29730 100644 --- a/scsi/pr-manager.c +++ b/scsi/pr-manager.c @@ -18,6 +18,7 @@ #include "scsi/pr-manager.h" #include "trace.h" #include "qapi/qapi-types-block.h" +#include "qemu/module.h" #include "qapi/qapi-commands-block.h" #define PR_MANAGER_PATH "/objects" @@ -38,7 +39,6 @@ static int pr_manager_worker(void *opaque) int fd = data->fd; int r; - g_free(data); trace_pr_manager_run(fd, hdr->cmdp[0], hdr->cmdp[1]); /* The reference was taken in pr_manager_execute. */ @@ -48,24 +48,20 @@ static int pr_manager_worker(void *opaque) } -BlockAIOCB *pr_manager_execute(PRManager *pr_mgr, - AioContext *ctx, int fd, - struct sg_io_hdr *hdr, - BlockCompletionFunc *complete, - void *opaque) +int coroutine_fn pr_manager_execute(PRManager *pr_mgr, AioContext *ctx, int fd, + struct sg_io_hdr *hdr) { - PRManagerData *data = g_new(PRManagerData, 1); - ThreadPool *pool = aio_get_thread_pool(ctx); + PRManagerData data = { + .pr_mgr = pr_mgr, + .fd = fd, + .hdr = hdr, + }; - trace_pr_manager_execute(fd, hdr->cmdp[0], hdr->cmdp[1], opaque); - data->pr_mgr = pr_mgr; - data->fd = fd; - data->hdr = hdr; + trace_pr_manager_execute(fd, hdr->cmdp[0], hdr->cmdp[1]); /* The matching object_unref is in pr_manager_worker. */ object_ref(OBJECT(pr_mgr)); - return thread_pool_submit_aio(pool, pr_manager_worker, - data, complete, opaque); + return thread_pool_submit_co(pr_manager_worker, &data); } bool pr_manager_is_connected(PRManager *pr_mgr) @@ -119,8 +115,7 @@ pr_manager_register_types(void) static int query_one_pr_manager(Object *object, void *opaque) { - PRManagerInfoList ***prev = opaque; - PRManagerInfoList *elem; + PRManagerInfoList ***tail = opaque; PRManagerInfo *info; PRManager *pr_mgr; @@ -129,15 +124,10 @@ static int query_one_pr_manager(Object *object, void *opaque) return 0; } - elem = g_new0(PRManagerInfoList, 1); info = g_new0(PRManagerInfo, 1); - info->id = object_get_canonical_path_component(object); + info->id = g_strdup(object_get_canonical_path_component(object)); info->connected = pr_manager_is_connected(pr_mgr); - elem->value = info; - elem->next = NULL; - - **prev = elem; - *prev = &elem->next; + QAPI_LIST_APPEND(*tail, info); return 0; } |