Received: from eggs.gnu.org ([2001:4830:134:3::10]:43988) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZrRB0-0007KU-4q for qemu-devel@nongnu.org; Wed, 28 Oct 2015 09:54:11 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZrRAw-0008Pa-11 for qemu-devel@nongnu.org; Wed, 28 Oct 2015 09:54:06 -0400 Date: Wed, 28 Oct 2015 09:53:50 -0400 From: Jeff Cody Message-ID: <20151028135349.GB1600@localhost.localdomain> References: <1446029211-27148-1-git-send-email-kwolf@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1446029211-27148-1-git-send-email-kwolf@redhat.com> Subject: Re: [Qemu-devel] [Qemu-block] [PATCH] block: Consider all child nodes in bdrv_requests_pending() List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Kevin Wolf Cc: stefanha@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, qemu-block@nongnu.org, mreitz@redhat.com On Wed, Oct 28, 2015 at 11:46:51AM +0100, Kevin Wolf wrote: > The function manually recursed into bs->file and bs->backing to check > whether there were any requests pending, but it ignored other children. > > There's no need to special case file and backing here, so just replace > these two explicit recursions by a loop recursing for all child nodes. > > Reported-by: Max Reitz > Signed-off-by: Kevin Wolf > --- > block/io.c | 13 ++++++++----- > 1 file changed, 8 insertions(+), 5 deletions(-) > > diff --git a/block/io.c b/block/io.c > index 5ac6256..8dcad3b 100644 > --- a/block/io.c > +++ b/block/io.c > @@ -216,6 +216,8 @@ void bdrv_disable_copy_on_read(BlockDriverState *bs) > /* Check if any requests are in-flight (including throttled requests) */ > bool bdrv_requests_pending(BlockDriverState *bs) > { > + BdrvChild *child; > + > if (!QLIST_EMPTY(&bs->tracked_requests)) { > return true; > } > @@ -225,12 +227,13 @@ bool bdrv_requests_pending(BlockDriverState *bs) > if (!qemu_co_queue_empty(&bs->throttled_reqs[1])) { > return true; > } > - if (bs->file && bdrv_requests_pending(bs->file->bs)) { > - return true; > - } > - if (bs->backing && bdrv_requests_pending(bs->backing->bs)) { > - return true; > + > + QLIST_FOREACH(child, &bs->children, next) { > + if (bdrv_requests_pending(child->bs)) { > + return true; > + } > } > + > return false; > } > > -- > 1.8.3.1 > > Reviewed-by: Jeff Cody