9ae3a8
From e49f2991513ff786625bff7e729ebe9b292e633a Mon Sep 17 00:00:00 2001
9ae3a8
From: Jeffrey Cody <jcody@redhat.com>
9ae3a8
Date: Fri, 19 Sep 2014 03:18:56 +0200
9ae3a8
Subject: [PATCH 17/20] block: add helper function to determine if a BDS is in a chain
9ae3a8
9ae3a8
Message-id: <aa9b5aa581c435e579e97bec44bb821e047b59f6.1411096194.git.jcody@redhat.com>
9ae3a8
Patchwork-id: 61310
9ae3a8
O-Subject: [PATCH qemu-kvm-rhev RHEL7.0.z 1/4] block: add helper function to determine if a BDS is in a chain
9ae3a8
Bugzilla: 1122925
9ae3a8
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
9ae3a8
RH-Acked-by: Eric Blake <eblake@redhat.com>
9ae3a8
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
9ae3a8
9ae3a8
This is a small helper function, to determine if 'base' is in the
9ae3a8
chain of BlockDriverState 'top'.  It returns true if it is in the chain,
9ae3a8
and false otherwise.
9ae3a8
9ae3a8
If either argument is NULL, it will also return false.
9ae3a8
9ae3a8
Reviewed-by: Benoit Canet <benoit@irqsave.net>
9ae3a8
Reviewed-by: Eric Blake <eblake@redhat.com>
9ae3a8
Signed-off-by: Jeff Cody <jcody@redhat.com>
9ae3a8
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
9ae3a8
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
9ae3a8
(cherry picked from commit 5a6684d2b957f9ec75d7ed7b14332293abec1d6c)
9ae3a8
9ae3a8
Conflicts:
9ae3a8
	block.c
9ae3a8
	include/block/block.h
9ae3a8
9ae3a8
Signed-off-by: Jeff Cody <jcody@redhat.com>
9ae3a8
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
9ae3a8
---
9ae3a8
 block.c               |   11 +++++++++++
9ae3a8
 include/block/block.h |    1 +
9ae3a8
 2 files changed, 12 insertions(+), 0 deletions(-)
9ae3a8
9ae3a8
diff --git a/block.c b/block.c
9ae3a8
index af162fe..7bdbbc6 100644
9ae3a8
--- a/block.c
9ae3a8
+++ b/block.c
9ae3a8
@@ -3439,6 +3439,17 @@ BlockDriverState *bdrv_find(const char *name)
9ae3a8
     return NULL;
9ae3a8
 }
9ae3a8
 
9ae3a8
+/* If 'base' is in the same chain as 'top', return true. Otherwise,
9ae3a8
+ * return false.  If either argument is NULL, return false. */
9ae3a8
+bool bdrv_chain_contains(BlockDriverState *top, BlockDriverState *base)
9ae3a8
+{
9ae3a8
+    while (top && top != base) {
9ae3a8
+        top = top->backing_hd;
9ae3a8
+    }
9ae3a8
+
9ae3a8
+    return top != NULL;
9ae3a8
+}
9ae3a8
+
9ae3a8
 BlockDriverState *bdrv_next(BlockDriverState *bs)
9ae3a8
 {
9ae3a8
     if (!bs) {
9ae3a8
diff --git a/include/block/block.h b/include/block/block.h
9ae3a8
index 13ef173..972c0e7 100644
9ae3a8
--- a/include/block/block.h
9ae3a8
+++ b/include/block/block.h
9ae3a8
@@ -361,6 +361,7 @@ void bdrv_lock_medium(BlockDriverState *bs, bool locked);
9ae3a8
 void bdrv_eject(BlockDriverState *bs, bool eject_flag);
9ae3a8
 const char *bdrv_get_format_name(BlockDriverState *bs);
9ae3a8
 BlockDriverState *bdrv_find(const char *name);
9ae3a8
+bool bdrv_chain_contains(BlockDriverState *top, BlockDriverState *base);
9ae3a8
 BlockDriverState *bdrv_next(BlockDriverState *bs);
9ae3a8
 void bdrv_iterate(void (*it)(void *opaque, BlockDriverState *bs),
9ae3a8
                   void *opaque);
9ae3a8
-- 
9ae3a8
1.7.1
9ae3a8