From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59775) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YXwyq-000087-S3 for qemu-devel@nongnu.org; Tue, 17 Mar 2015 15:16:46 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YXwyp-0005QZ-Hx for qemu-devel@nongnu.org; Tue, 17 Mar 2015 15:16:44 -0400 Message-ID: <55087D91.1040809@redhat.com> Date: Tue, 17 Mar 2015 15:16:33 -0400 From: John Snow MIME-Version: 1.0 References: <1425528911-10300-1-git-send-email-jsnow@redhat.com> <1425528911-10300-7-git-send-email-jsnow@redhat.com> <550877CE.5080501@redhat.com> In-Reply-To: <550877CE.5080501@redhat.com> Content-Type: text/plain; charset=iso-8859-15; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 06/11] qmp: Add an implementation wrapper for qmp_drive_backup List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Max Reitz , qemu-block@nongnu.org Cc: kwolf@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, armbru@redhat.com, vsementsov@parallels.com, stefanha@redhat.com On 03/17/2015 02:51 PM, Max Reitz wrote: > On 2015-03-04 at 23:15, John Snow wrote: >> We'd like to be able to specify the callback given to backup_start >> manually in the case of transactions, so split apart qmp_drive_backup >> into an implementation and a wrapper. >> >> Switch drive_backup_prepare to use the new wrapper, but don't overload >> the callback and closure yet. >> >> This is kind of gross, but we need to forward-declare the wrapper for >> the drive_backup transaction to be able to use. I could try moving >> the transaction blocks lower instead, but I wanted (for v1, at least) >> to minimize code movement so that the core changes were easiest to see. >> >> If anyone has suggestions on organization, please suggest them. >> >> Signed-off-by: John Snow >> --- >> blockdev.c | 77 >> ++++++++++++++++++++++++++++++++++++++++++++++---------------- >> 1 file changed, 58 insertions(+), 19 deletions(-) >> >> diff --git a/blockdev.c b/blockdev.c >> index 3153ee7..9e3b9e9 100644 >> --- a/blockdev.c >> +++ b/blockdev.c >> @@ -1449,6 +1449,19 @@ void >> undo_transaction_wrapper(BlkTransactionState *common) >> blk_put_transaction_state(common); >> } >> +static void _drive_backup(const char *device, const char *target, > > Please don't use leading underscores. (Please.) > > Just call it do_drive_backup() or something. > > Other than that, I'm okay with a forward-declaration; if you want to > move it, but I'd be fine with moving the code, too. > > With _drive_backup() being called do_drive_backup(): > > Reviewed-by: Max Reitz > Moving the code around might be better, it just makes for a much noisier patch. I made my decisions for v1 to keep code disturbed the least. Once more critiques roll in I will decide what to do. I'll replace with "do_drive_backup" unless you can think of a nice three-letter word to replace "do" so that I don't even have to perturb the alignment context ;) >> + bool has_format, const char *format, >> + enum MirrorSyncMode sync, >> + bool has_mode, enum NewImageMode mode, >> + bool has_speed, int64_t speed, >> + bool has_bitmap, const char *bitmap, >> + bool has_on_source_error, >> + BlockdevOnError on_source_error, >> + bool has_on_target_error, >> + BlockdevOnError on_target_error, >> + BlockCompletionFunc *cb, void *opaque, >> + Error **errp); >> + >> /* internal snapshot private data */ >> typedef struct InternalSnapshotState { >> BlkTransactionState common; >> @@ -1768,15 +1781,16 @@ static void >> drive_backup_prepare(BlkTransactionState *common, Error **errp) >> state->aio_context = bdrv_get_aio_context(bs); >> aio_context_acquire(state->aio_context); >> - qmp_drive_backup(backup->device, backup->target, >> - backup->has_format, backup->format, >> - backup->sync, >> - backup->has_mode, backup->mode, >> - backup->has_speed, backup->speed, >> - backup->has_bitmap, backup->bitmap, >> - backup->has_on_source_error, >> backup->on_source_error, >> - backup->has_on_target_error, >> backup->on_target_error, >> - &local_err); >> + _drive_backup(backup->device, backup->target, >> + backup->has_format, backup->format, >> + backup->sync, >> + backup->has_mode, backup->mode, >> + backup->has_speed, backup->speed, >> + backup->has_bitmap, backup->bitmap, >> + backup->has_on_source_error, backup->on_source_error, >> + backup->has_on_target_error, backup->on_target_error, >> + NULL, NULL, >> + &local_err); >> if (local_err) { >> error_propagate(errp, local_err); >> return; >> @@ -2717,15 +2731,18 @@ out: >> aio_context_release(aio_context); >> } >> -void qmp_drive_backup(const char *device, const char *target, >> - bool has_format, const char *format, >> - enum MirrorSyncMode sync, >> - bool has_mode, enum NewImageMode mode, >> - bool has_speed, int64_t speed, >> - bool has_bitmap, const char *bitmap, >> - bool has_on_source_error, BlockdevOnError >> on_source_error, >> - bool has_on_target_error, BlockdevOnError >> on_target_error, >> - Error **errp) >> +static void _drive_backup(const char *device, const char *target, >> + bool has_format, const char *format, >> + enum MirrorSyncMode sync, >> + bool has_mode, enum NewImageMode mode, >> + bool has_speed, int64_t speed, >> + bool has_bitmap, const char *bitmap, >> + bool has_on_source_error, >> + BlockdevOnError on_source_error, >> + bool has_on_target_error, >> + BlockdevOnError on_target_error, >> + BlockCompletionFunc *cb, void *opaque, >> + Error **errp) >> { >> BlockDriverState *bs; >> BlockDriverState *target_bs; >> @@ -2837,9 +2854,15 @@ void qmp_drive_backup(const char *device, const >> char *target, >> } >> } >> + if (cb == NULL) { >> + cb = block_job_cb; >> + } >> + if (opaque == NULL) { >> + opaque = bs; >> + } >> backup_start(bs, target_bs, speed, sync, bmap, >> on_source_error, on_target_error, >> - block_job_cb, bs, &local_err); >> + cb, opaque, &local_err); >> if (local_err != NULL) { >> bdrv_unref(target_bs); >> error_propagate(errp, local_err); >> @@ -2850,6 +2873,22 @@ out: >> aio_context_release(aio_context); >> } >> +void qmp_drive_backup(const char *device, const char *target, >> + bool has_format, const char *format, >> + enum MirrorSyncMode sync, >> + bool has_mode, enum NewImageMode mode, >> + bool has_speed, int64_t speed, >> + bool has_bitmap, const char *bitmap, >> + bool has_on_source_error, BlockdevOnError >> on_source_error, >> + bool has_on_target_error, BlockdevOnError >> on_target_error, >> + Error **errp) >> +{ >> + _drive_backup(device, target, has_format, format, sync, has_mode, >> mode, >> + has_speed, speed, has_bitmap, bitmap, >> has_on_source_error, >> + on_source_error, has_on_target_error, on_target_error, >> + NULL, NULL, errp); >> +} >> + >> BlockDeviceInfoList *qmp_query_named_block_nodes(Error **errp) >> { >> return bdrv_named_nodes_list(); >