From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34231) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1a1222-0006Kz-2H for qemu-devel@nongnu.org; Mon, 23 Nov 2015 20:04:31 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1a1221-00038C-1l for qemu-devel@nongnu.org; Mon, 23 Nov 2015 20:04:30 -0500 References: <1448294400-476-1-git-send-email-kwolf@redhat.com> <1448294400-476-7-git-send-email-kwolf@redhat.com> From: Wen Congyang Message-ID: <5653B75C.8090600@cn.fujitsu.com> Date: Tue, 24 Nov 2015 09:03:24 +0800 MIME-Version: 1.0 In-Reply-To: <1448294400-476-7-git-send-email-kwolf@redhat.com> Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH v2 06/21] block: Exclude nested options only for children in append_open_options() List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Kevin Wolf , qemu-block@nongnu.org Cc: qemu-devel@nongnu.org, mreitz@redhat.com On 11/23/2015 11:59 PM, Kevin Wolf wrote: > Some drivers have nested options (e.g. blkdebug rule arrays), which > don't belong to a child node and shouldn't be removed. Don't remove all > options with "." in their name, but check for the complete prefixes of > actually existing child nodes. > > Signed-off-by: Kevin Wolf > --- > block.c | 19 +++++++++++++++---- > include/block/block_int.h | 1 + > 2 files changed, 16 insertions(+), 4 deletions(-) > > diff --git a/block.c b/block.c > index 23d9e10..02125e2 100644 > --- a/block.c > +++ b/block.c > @@ -1101,11 +1101,13 @@ static int bdrv_fill_options(QDict **options, const char **pfilename, > > static BdrvChild *bdrv_attach_child(BlockDriverState *parent_bs, > BlockDriverState *child_bs, > + const char *child_name, > const BdrvChildRole *child_role) > { > BdrvChild *child = g_new(BdrvChild, 1); > *child = (BdrvChild) { > .bs = child_bs, > + .name = child_name, The child_name may be allocated in the caller's stack. For example: In the function quorum_open(): for (i = 0; i < s->num_children; i++) { char indexstr[32]; ret = snprintf(indexstr, 32, "children.%d", i); assert(ret < 32); s->children[i] = bdrv_open_child(NULL, options, indexstr, bs, &child_format, false, &local_err); if (local_err) { ret = -EINVAL; goto close_exit; } opened[i] = true; } Thanks Wen Congyang > .role = child_role, > }; > > @@ -1165,7 +1167,7 @@ void bdrv_set_backing_hd(BlockDriverState *bs, BlockDriverState *backing_hd) > bs->backing = NULL; > goto out; > } > - bs->backing = bdrv_attach_child(bs, backing_hd, &child_backing); > + bs->backing = bdrv_attach_child(bs, backing_hd, "backing", &child_backing); > bs->open_flags &= ~BDRV_O_NO_BACKING; > pstrcpy(bs->backing_file, sizeof(bs->backing_file), backing_hd->filename); > pstrcpy(bs->backing_format, sizeof(bs->backing_format), > @@ -1322,7 +1324,7 @@ BdrvChild *bdrv_open_child(const char *filename, > goto done; > } > > - c = bdrv_attach_child(parent, bs, child_role); > + c = bdrv_attach_child(parent, bs, bdref_key, child_role); > > done: > qdict_del(options, bdref_key); > @@ -3952,13 +3954,22 @@ static bool append_open_options(QDict *d, BlockDriverState *bs) > { > const QDictEntry *entry; > QemuOptDesc *desc; > + BdrvChild *child; > bool found_any = false; > + const char *p; > > for (entry = qdict_first(bs->options); entry; > entry = qdict_next(bs->options, entry)) > { > - /* Only take options for this level */ > - if (strchr(qdict_entry_key(entry), '.')) { > + /* Exclude options for children */ > + QLIST_FOREACH(child, &bs->children, next) { > + if (strstart(qdict_entry_key(entry), child->name, &p) > + && (!*p || *p == '.')) > + { > + break; > + } > + } > + if (child) { > continue; > } > > diff --git a/include/block/block_int.h b/include/block/block_int.h > index 77dc165..b2325aa 100644 > --- a/include/block/block_int.h > +++ b/include/block/block_int.h > @@ -351,6 +351,7 @@ extern const BdrvChildRole child_format; > > struct BdrvChild { > BlockDriverState *bs; > + const char *name; > const BdrvChildRole *role; > QLIST_ENTRY(BdrvChild) next; > QLIST_ENTRY(BdrvChild) next_parent; > -- This message has been scanned for viruses and dangerous content by FCNIC, and is believed to be clean.