From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51981) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X1tlP-0000NY-FF for qemu-devel@nongnu.org; Tue, 01 Jul 2014 04:50:12 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1X1tlK-0006Tk-98 for qemu-devel@nongnu.org; Tue, 01 Jul 2014 04:50:07 -0400 Received: from mx1.redhat.com ([209.132.183.28]:62345) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X1tlJ-0006Pm-JP for qemu-devel@nongnu.org; Tue, 01 Jul 2014 04:50:02 -0400 From: Stefan Hajnoczi Date: Tue, 1 Jul 2014 10:48:55 +0200 Message-Id: <1404204537-5082-23-git-send-email-stefanha@redhat.com> In-Reply-To: <1404204537-5082-1-git-send-email-stefanha@redhat.com> References: <1404204537-5082-1-git-send-email-stefanha@redhat.com> Subject: [Qemu-devel] [PULL for-2.1 22/24] block: add helper function to determine if a BDS is in a chain List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Peter Maydell , Jeff Cody , Stefan Hajnoczi From: Jeff Cody This is a small helper function, to determine if 'base' is in the chain of BlockDriverState 'top'. It returns true if it is in the chain, and false otherwise. If either argument is NULL, it will also return false. Reviewed-by: Benoit Canet Reviewed-by: Eric Blake Signed-off-by: Jeff Cody Reviewed-by: Kevin Wolf Signed-off-by: Stefan Hajnoczi --- block.c | 11 +++++++++++ include/block/block.h | 1 + 2 files changed, 12 insertions(+) diff --git a/block.c b/block.c index c111c29..f45e63c 100644 --- a/block.c +++ b/block.c @@ -3774,6 +3774,17 @@ BlockDriverState *bdrv_lookup_bs(const char *device, return NULL; } +/* If 'base' is in the same chain as 'top', return true. Otherwise, + * return false. If either argument is NULL, return false. */ +bool bdrv_chain_contains(BlockDriverState *top, BlockDriverState *base) +{ + while (top && top != base) { + top = top->backing_hd; + } + + return top != NULL; +} + BlockDriverState *bdrv_next(BlockDriverState *bs) { if (!bs) { diff --git a/include/block/block.h b/include/block/block.h index 7e92f54..29c9e50 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -403,6 +403,7 @@ BlockDeviceInfoList *bdrv_named_nodes_list(void); BlockDriverState *bdrv_lookup_bs(const char *device, const char *node_name, Error **errp); +bool bdrv_chain_contains(BlockDriverState *top, BlockDriverState *base); BlockDriverState *bdrv_next(BlockDriverState *bs); void bdrv_iterate(void (*it)(void *opaque, BlockDriverState *bs), void *opaque); -- 1.9.3