From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40764) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZNW4k-0008IM-WC for qemu-devel@nongnu.org; Thu, 06 Aug 2015 21:04:00 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZNW4k-0001PZ-55 for qemu-devel@nongnu.org; Thu, 06 Aug 2015 21:03:58 -0400 References: <1438334355-26914-1-git-send-email-wency@cn.fujitsu.com> <1438334355-26914-4-git-send-email-wency@cn.fujitsu.com> From: Wen Congyang Message-ID: <55C403CB.801@cn.fujitsu.com> Date: Fri, 7 Aug 2015 09:03:07 +0800 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH for-2.5 3/6] Add new block driver interface to add/delete a BDS's child List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Alberto Garcia , qemu devel , Eric Blake , Markus Armbruster , Stefan Hajnoczi Cc: Kevin Wolf , zhanghailiang , qemu block , Jiang Yunhong , Dong Eddie , "Dr. David Alan Gilbert" , Gonglei , Yang Hongyang On 08/06/2015 10:33 PM, Alberto Garcia wrote: > On Fri 31 Jul 2015 11:19:12 AM CEST, Wen Congyang wrote: > >> +/* >> + * Hot add/remove a BDS's child. So the user can take a child offline when >> + * it is broken and take a new child online >> + */ >> +void bdrv_add_child(BlockDriverState *bs, QDict *options, Error **errp) >> +{ >> + >> + if (!bs->drv || !bs->drv->bdrv_add_child) { >> + error_setg(errp, "The BDS %s doesn't support adding a child", >> + bdrv_get_id_or_node_name(bs)); >> + return; >> + } >> + >> + bs->drv->bdrv_add_child(bs, options, errp); >> +} >> + >> +void bdrv_del_child(BlockDriverState *bs, BlockDriverState *child_bs, >> + Error **errp) >> +{ >> + BdrvChild *child; >> + >> + if (!bs->drv || !bs->drv->bdrv_del_child) { >> + error_setg(errp, "The BDS %s doesn't support removing a child", >> + bdrv_get_id_or_node_name(bs)); >> + return; >> + } >> + >> + QLIST_FOREACH(child, &bs->children, next) { >> + if (child->bs == child_bs) { >> + break; >> + } >> + } >> + >> + if (!child) { >> + error_setg(errp, "The BDS %s is not the BDS %s's child", >> + bdrv_get_id_or_node_name(child_bs), >> + bdrv_get_id_or_node_name(bs)); >> + return; >> + } >> + >> + bs->drv->bdrv_del_child(bs, child_bs, errp); >> +} > > I see that bdrv_del_child() checks that the child is in bs->children, > but who takes care of putting it there in the first place? The child is opened by the function bdrv_open_image(). bdrv_open_image() bdrv_open_child() bdrv_attach_child() Thanks Wen Congyang > > Berto > . >