qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v4 2/7] block: Introduce op_blockers to BlockDri


From: Kevin Wolf
Subject: Re: [Qemu-devel] [PATCH v4 2/7] block: Introduce op_blockers to BlockDriverState
Date: Mon, 25 Nov 2013 11:30:53 +0100
User-agent: Mutt/1.5.21 (2010-09-15)

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 <address@hidden>
> ---
>  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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]