From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:32910) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VktRY-0008PL-4T for qemu-devel@nongnu.org; Mon, 25 Nov 2013 05:31:10 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VktRS-0000ro-1O for qemu-devel@nongnu.org; Mon, 25 Nov 2013 05:31:04 -0500 Received: from mx1.redhat.com ([209.132.183.28]:59769) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VktRR-0000ri-OM for qemu-devel@nongnu.org; Mon, 25 Nov 2013 05:30:57 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id rAPAUueT013572 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 25 Nov 2013 05:30:57 -0500 Date: Mon, 25 Nov 2013 11:30:53 +0100 From: Kevin Wolf Message-ID: <20131125103053.GD3009@dhcp-200-207.str.redhat.com> References: <1385097894-1380-1-git-send-email-famz@redhat.com> <1385097894-1380-3-git-send-email-famz@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1385097894-1380-3-git-send-email-famz@redhat.com> Subject: Re: [Qemu-devel] [PATCH v4 2/7] block: Introduce op_blockers to BlockDriverState List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Fam Zheng Cc: hbrock@redhat.com, qemu-devel@nongnu.org, rjones@redhat.com, imain@redhat.com, stefanha@redhat.com, pbonzini@redhat.com Am 22.11.2013 um 06:24 hat Fam Zheng geschrieben: > BlockDriverState.op_blockers is an array of list with BLOCK_OP_TYPE_MAX > elements. Each list is a list of blockers of an operation type > (BlockOpType), that marks this BDS is currently blocked for certain type > of operation with reason errors stored in the list. The rule of usage > is: > > * BDS user who wants to take an operation should check if there's any > blocker of the type with bdrv_op_is_blocked(). > > * BDS user who wants to block certain types of operation, should call > bdrv_op_block (or bdrv_op_block_all to block all types of operations, > which is similar to bdrv_set_in_use of now). > > * A blocker is only referenced by op_blockers, so the lifecycle is > managed by caller, and shouldn't be lost until unblock, so typically > a caller does these: > > - Allocate a blocker with error_setg or similar, call bdrv_op_block() > to block some operations. > - Hold the blocker, do his job. > - Unblock operations that it blocked, with the same reason pointer > passed to bdrv_op_unblock(). > - Release the blocker with error_free(). > > Signed-off-by: Fam Zheng > --- > block.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++ > include/block/block.h | 6 ++++++ > include/block/block_int.h | 5 +++++ > 3 files changed, 66 insertions(+) > > diff --git a/block.c b/block.c > index 382ea71..2b18a43 100644 > --- a/block.c > +++ b/block.c > @@ -4425,6 +4425,61 @@ void bdrv_unref(BlockDriverState *bs) > } > } > > +struct BdrvOpBlocker { > + Error *reason; > + QLIST_ENTRY(BdrvOpBlocker) list; > +}; > + > +bool bdrv_op_is_blocked(BlockDriverState *bs, BlockOpType op, Error **errp) > +{ > + BdrvOpBlocker *blocker; > + assert(op >=0 && op < BLOCK_OP_TYPE_MAX); Oh, and my compiler doesn't like that check in the first place: block.c: In function 'bdrv_op_is_blocked': block.c:4473:5: error: comparison of unsigned expression >= 0 is always true [-Werror=type-limits] block.c: In function 'bdrv_op_block': block.c:4485:5: error: comparison of unsigned expression >= 0 is always true [-Werror=type-limits] block.c: In function 'bdrv_op_unblock': block.c:4495:5: error: comparison of unsigned expression >= 0 is always true [-Werror=type-limits] Perhaps cast op to int for the first condition: assert((int) op >= 0 && op < BLOCK_OP_TYPE_MAX); Kevin