From patchwork Wed Apr 25 13:17:07 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Hajnoczi X-Patchwork-Id: 154965 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 686BFB70F9 for ; Thu, 26 Apr 2012 01:01:45 +1000 (EST) Received: from localhost ([::1]:52852 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SN3Cl-0003vj-4t for incoming@patchwork.ozlabs.org; Wed, 25 Apr 2012 10:28:27 -0400 Received: from eggs.gnu.org ([208.118.235.92]:50550) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SN3CN-0003UL-8A for qemu-devel@nongnu.org; Wed, 25 Apr 2012 10:28:09 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SN3CG-0006Fy-8B for qemu-devel@nongnu.org; Wed, 25 Apr 2012 10:28:02 -0400 Received: from e06smtp11.uk.ibm.com ([195.75.94.107]:57075) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SN3CF-0006Et-S2 for qemu-devel@nongnu.org; Wed, 25 Apr 2012 10:27:56 -0400 Received: from /spool/local by e06smtp11.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 25 Apr 2012 14:17:30 +0100 Received: from d06nrmr1806.portsmouth.uk.ibm.com (9.149.39.193) by e06smtp11.uk.ibm.com (192.168.101.141) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 25 Apr 2012 14:17:19 +0100 Received: from d06av04.portsmouth.uk.ibm.com (d06av04.portsmouth.uk.ibm.com [9.149.37.216]) by d06nrmr1806.portsmouth.uk.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id q3PDHIYv2678846 for ; Wed, 25 Apr 2012 14:17:18 +0100 Received: from d06av04.portsmouth.uk.ibm.com (loopback [127.0.0.1]) by d06av04.portsmouth.uk.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id q3PDHH85001824 for ; Wed, 25 Apr 2012 07:17:18 -0600 Received: from localhost ([9.145.156.72]) by d06av04.portsmouth.uk.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id q3PDHHRL001805; Wed, 25 Apr 2012 07:17:17 -0600 From: Stefan Hajnoczi To: Date: Wed, 25 Apr 2012 14:17:07 +0100 Message-Id: <1335359831-18473-2-git-send-email-stefanha@linux.vnet.ibm.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1335359831-18473-1-git-send-email-stefanha@linux.vnet.ibm.com> References: <1335359831-18473-1-git-send-email-stefanha@linux.vnet.ibm.com> x-cbid: 12042513-5024-0000-0000-0000025C830D X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 195.75.94.107 Cc: Kevin Wolf , Paolo Bonzini , Eric Blake , Stefan Hajnoczi , Luiz Capitulino Subject: [Qemu-devel] [PATCH v3 1/5] block: use Error mechanism instead of -errno for block_job_create() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org The block job API uses -errno return values internally and we convert these to Error in the QMP functions. This is ugly because the Error should be created at the point where we still have all the relevant information. More importantly, it is hard to add new error cases to this case since we quickly run out of -errno values without losing information. Go ahead and use Error directly and don't convert later. Signed-off-by: Stefan Hajnoczi Acked-by: Kevin Wolf --- block.c | 4 +++- block/stream.c | 11 +++++------ block_int.h | 11 +++++++---- blockdev.c | 16 +++++----------- 4 files changed, 20 insertions(+), 22 deletions(-) diff --git a/block.c b/block.c index fe74ddd..2b72a0f 100644 --- a/block.c +++ b/block.c @@ -4083,11 +4083,13 @@ out: } void *block_job_create(const BlockJobType *job_type, BlockDriverState *bs, - BlockDriverCompletionFunc *cb, void *opaque) + BlockDriverCompletionFunc *cb, void *opaque, + Error **errp) { BlockJob *job; if (bs->job || bdrv_in_use(bs)) { + error_set(errp, QERR_DEVICE_IN_USE, bdrv_get_device_name(bs)); return NULL; } bdrv_set_in_use(bs, 1); diff --git a/block/stream.c b/block/stream.c index 0efe1ad..7002dc8 100644 --- a/block/stream.c +++ b/block/stream.c @@ -280,16 +280,16 @@ static BlockJobType stream_job_type = { .set_speed = stream_set_speed, }; -int stream_start(BlockDriverState *bs, BlockDriverState *base, - const char *base_id, BlockDriverCompletionFunc *cb, - void *opaque) +void stream_start(BlockDriverState *bs, BlockDriverState *base, + const char *base_id, BlockDriverCompletionFunc *cb, + void *opaque, Error **errp) { StreamBlockJob *s; Coroutine *co; - s = block_job_create(&stream_job_type, bs, cb, opaque); + s = block_job_create(&stream_job_type, bs, cb, opaque, errp); if (!s) { - return -EBUSY; /* bs must already be in use */ + return; } s->base = base; @@ -300,5 +300,4 @@ int stream_start(BlockDriverState *bs, BlockDriverState *base, co = qemu_coroutine_create(stream_run); trace_stream_start(bs, base, s, co, opaque); qemu_coroutine_enter(co, s); - return 0; } diff --git a/block_int.h b/block_int.h index 0acb49f..e70a33e 100644 --- a/block_int.h +++ b/block_int.h @@ -346,6 +346,7 @@ int is_windows_drive(const char *filename); * @bs: The block * @cb: Completion function for the job. * @opaque: Opaque pointer value passed to @cb. + * @errp: Error object. * * Create a new long-running block device job and return it. The job * will call @cb asynchronously when the job completes. Note that @@ -357,7 +358,8 @@ int is_windows_drive(const char *filename); * called from a wrapper that is specific to the job type. */ void *block_job_create(const BlockJobType *job_type, BlockDriverState *bs, - BlockDriverCompletionFunc *cb, void *opaque); + BlockDriverCompletionFunc *cb, void *opaque, + Error **errp); /** * block_job_complete: @@ -417,6 +419,7 @@ void block_job_cancel_sync(BlockJob *job); * backing file if the job completes. Ignored if @base is %NULL. * @cb: Completion function for the job. * @opaque: Opaque pointer value passed to @cb. + * @errp: Error object. * * Start a streaming operation on @bs. Clusters that are unallocated * in @bs, but allocated in any image between @base and @bs (both @@ -424,8 +427,8 @@ void block_job_cancel_sync(BlockJob *job); * streaming job, the backing file of @bs will be changed to * @base_id in the written image and to @base in the live BlockDriverState. */ -int stream_start(BlockDriverState *bs, BlockDriverState *base, - const char *base_id, BlockDriverCompletionFunc *cb, - void *opaque); +void stream_start(BlockDriverState *bs, BlockDriverState *base, + const char *base_id, BlockDriverCompletionFunc *cb, + void *opaque, Error **errp); #endif /* BLOCK_INT_H */ diff --git a/blockdev.c b/blockdev.c index 0c2440e..a411477 100644 --- a/blockdev.c +++ b/blockdev.c @@ -1095,7 +1095,7 @@ void qmp_block_stream(const char *device, bool has_base, { BlockDriverState *bs; BlockDriverState *base_bs = NULL; - int ret; + Error *local_err = NULL; bs = bdrv_find(device); if (!bs) { @@ -1111,16 +1111,10 @@ void qmp_block_stream(const char *device, bool has_base, } } - ret = stream_start(bs, base_bs, base, block_stream_cb, bs); - if (ret < 0) { - switch (ret) { - case -EBUSY: - error_set(errp, QERR_DEVICE_IN_USE, device); - return; - default: - error_set(errp, QERR_NOT_SUPPORTED); - return; - } + stream_start(bs, base_bs, base, block_stream_cb, bs, &local_err); + if (error_is_set(&local_err)) { + error_propagate(errp, local_err); + return; } /* Grab a reference so hotplug does not delete the BlockDriverState from