From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41999) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZMKEv-0002Gd-3D for qemu-devel@nongnu.org; Mon, 03 Aug 2015 14:13:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZMKEq-0004Zt-3a for qemu-devel@nongnu.org; Mon, 03 Aug 2015 14:13:33 -0400 Received: from mx1.redhat.com ([209.132.183.28]:44545) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZMKEp-0004Yy-TQ for qemu-devel@nongnu.org; Mon, 03 Aug 2015 14:13:28 -0400 References: <1438238370-16212-1-git-send-email-famz@redhat.com> <1438238370-16212-11-git-send-email-famz@redhat.com> From: Max Reitz Message-ID: <55BFAF43.6060209@redhat.com> Date: Mon, 3 Aug 2015 20:13:23 +0200 MIME-Version: 1.0 In-Reply-To: <1438238370-16212-11-git-send-email-famz@redhat.com> Content-Type: text/plain; charset=iso-8859-15; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH v4 10/14] blockdev: make BlockJobTxn available to qmp 'transaction' List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Fam Zheng , qemu-devel@nongnu.org Cc: Kevin Wolf , Jeff Cody , vsementsov@parallels.com, stefanha@redhat.com, John Snow On 30.07.2015 08:39, Fam Zheng wrote: > From: Stefan Hajnoczi > > Provide a BlockJobTxn to actions executed in a qmp 'transaction' > command. This allows actions to make their block jobs either complete > as a group or fail/cancel together. > > The next patch adds the first user. > > Signed-off-by: Stefan Hajnoczi > Reviewed-by: Fam Zheng > Reviewed-by: John Snow > Signed-off-by: Fam Zheng > --- > blockdev.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/blockdev.c b/blockdev.c > index 2eb4f34..aba9d78 100644 > --- a/blockdev.c > +++ b/blockdev.c > @@ -1279,6 +1279,7 @@ typedef struct BlkActionOps { > struct BlkActionState { > TransactionAction *action; > const BlkActionOps *ops; > + BlockJobTxn *block_job_txn; > QSIMPLEQ_ENTRY(BlkActionState) entry; > }; > > @@ -1883,12 +1884,15 @@ static const BlkActionOps actions[] = { > void qmp_transaction(TransactionActionList *dev_list, Error **errp) > { > TransactionActionList *dev_entry = dev_list; > + BlockJobTxn *block_job_txn; > BlkActionState *state, *next; > Error *local_err = NULL; > > QSIMPLEQ_HEAD(snap_bdrv_states, BlkActionState) snap_bdrv_states; > QSIMPLEQ_INIT(&snap_bdrv_states); > > + block_job_txn = block_job_txn_new(); > + > /* drain all i/o before any operations */ > bdrv_drain_all(); > > @@ -1908,6 +1912,7 @@ void qmp_transaction(TransactionActionList *dev_list, Error **errp) > state = g_malloc0(ops->instance_size); > state->ops = ops; > state->action = dev_info; > + state->block_job_txn = block_job_txn; > QSIMPLEQ_INSERT_TAIL(&snap_bdrv_states, state, entry); > > state->ops->prepare(state, &local_err); > And then state->block_job_txn is never used, thus leaked. I guess this is fixed for backup jobs in the next patch (by "The transaction is automatically freed when the last job completes or is cancelled"), but for any transaction which doesn't contain any block job which is added to the transaction, it probably remains leaked. Max