From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52782) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WYJxC-0000Mz-HO for qemu-devel@nongnu.org; Thu, 10 Apr 2014 14:44:07 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WYJx7-0004or-FE for qemu-devel@nongnu.org; Thu, 10 Apr 2014 14:44:02 -0400 Received: from mx1.redhat.com ([209.132.183.28]:12035) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WYJx7-0004om-5N for qemu-devel@nongnu.org; Thu, 10 Apr 2014 14:43:57 -0400 From: Max Reitz Date: Thu, 10 Apr 2014 20:43:34 +0200 Message-Id: <1397155423-29713-4-git-send-email-mreitz@redhat.com> In-Reply-To: <1397155423-29713-1-git-send-email-mreitz@redhat.com> References: <1397155423-29713-1-git-send-email-mreitz@redhat.com> Subject: [Qemu-devel] [PATCH v3 03/12] block: Add "has_single_child" field for drivers List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Kevin Wolf , =?UTF-8?q?Beno=C3=AEt=20Canet?= , Stefan Hajnoczi , Max Reitz This field should be used by block drivers acting as filters which have only a single child BDS which is referenced through the "file" field of the BDS. Setting this field allows other block functions to "access" the child BDS, for instance in bdrv_recurse_is_first_non_filter(). Therefore, it should not be set if the block layer should not have access to the child through the filter. Signed-off-by: Max Reitz Reviewed-by: Benoit Canet --- block.c | 4 ++++ include/block/block_int.h | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/block.c b/block.c index 990a754..7662f99 100644 --- a/block.c +++ b/block.c @@ -5466,6 +5466,10 @@ bool bdrv_recurse_is_first_non_filter(BlockDriverState *bs, return bs->drv->bdrv_recurse_is_first_non_filter(bs, candidate); } + if (bs->drv->has_single_child) { + return bdrv_recurse_is_first_non_filter(bs->file, candidate); + } + /* the driver is a block filter but don't allow to recurse -> return false */ return false; diff --git a/include/block/block_int.h b/include/block/block_int.h index cd5bc73..243e974 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -78,6 +78,13 @@ struct BlockDriver { /* set to true if the BlockDriver is a block filter */ bool is_filter; + /* Set to true if the BlockDriver is a filter with a single child referenced + * through the "file" field in the BDS. This allows the block layer to + * access that child through the filter (e.g., for + * bdrv_recurse_is_first_non_filter()); if this is not desired, set it to + * false (the "file" field should not have been used in this case anyway, + * though). */ + bool has_single_child; /* for snapshots block filter like Quorum can implement the * following recursive callback. * It's purpose is to recurse on the filter children while calling -- 1.9.1