Re: [Qemu-block] [PATCH v6 18/42] block: Use CAFs in bdrv_refresh_filename()

2019-08-10 Thread Vladimir Sementsov-Ogievskiy
09.08.2019 19:13, Max Reitz wrote:
> bdrv_refresh_filename() and the kind of related bdrv_dirname() should
> look to the primary child when they wish to copy the underlying file's
> filename.
> 
> Signed-off-by: Max Reitz 


Reviewed-by: Vladimir Sementsov-Ogievskiy 

-- 
Best regards,
Vladimir


[Qemu-block] [PATCH v6 18/42] block: Use CAFs in bdrv_refresh_filename()

2019-08-09 Thread Max Reitz
bdrv_refresh_filename() and the kind of related bdrv_dirname() should
look to the primary child when they wish to copy the underlying file's
filename.

Signed-off-by: Max Reitz 
---
 block.c | 29 +
 1 file changed, 21 insertions(+), 8 deletions(-)

diff --git a/block.c b/block.c
index 064cc99857..a467b175c6 100644
--- a/block.c
+++ b/block.c
@@ -6432,6 +6432,7 @@ void bdrv_refresh_filename(BlockDriverState *bs)
 {
 BlockDriver *drv = bs->drv;
 BdrvChild *child;
+BlockDriverState *primary_child_bs;
 QDict *opts;
 bool backing_overridden;
 bool generate_json_filename; /* Whether our default implementation should
@@ -6500,20 +6501,30 @@ void bdrv_refresh_filename(BlockDriverState *bs)
 qobject_unref(bs->full_open_options);
 bs->full_open_options = opts;
 
+primary_child_bs = bdrv_primary_bs(bs);
+
 if (drv->bdrv_refresh_filename) {
 /* Obsolete information is of no use here, so drop the old file name
  * information before refreshing it */
 bs->exact_filename[0] = '\0';
 
 drv->bdrv_refresh_filename(bs);
-} else if (bs->file) {
-/* Try to reconstruct valid information from the underlying file */
+} else if (primary_child_bs) {
+/*
+ * Try to reconstruct valid information from the underlying
+ * file -- this only works for format nodes (filter nodes
+ * cannot be probed and as such must be selected by the user
+ * either through an options dict, or through a special
+ * filename which the filter driver must construct in its
+ * .bdrv_refresh_filename() implementation).
+ */
 
 bs->exact_filename[0] = '\0';
 
 /*
  * We can use the underlying file's filename if:
  * - it has a filename,
+ * - the current BDS is not a filter,
  * - the file is a protocol BDS, and
  * - opening that file (as this BDS's format) will automatically create
  *   the BDS tree we have right now, that is:
@@ -6522,11 +6533,11 @@ void bdrv_refresh_filename(BlockDriverState *bs)
  *   - no non-file child of this BDS has been overridden by the user
  *   Both of these conditions are represented by 
generate_json_filename.
  */
-if (bs->file->bs->exact_filename[0] &&
-bs->file->bs->drv->bdrv_file_open &&
-!generate_json_filename)
+if (primary_child_bs->exact_filename[0] &&
+primary_child_bs->drv->bdrv_file_open &&
+!drv->is_filter && !generate_json_filename)
 {
-strcpy(bs->exact_filename, bs->file->bs->exact_filename);
+strcpy(bs->exact_filename, primary_child_bs->exact_filename);
 }
 }
 
@@ -6543,6 +6554,7 @@ void bdrv_refresh_filename(BlockDriverState *bs)
 char *bdrv_dirname(BlockDriverState *bs, Error **errp)
 {
 BlockDriver *drv = bs->drv;
+BlockDriverState *child_bs;
 
 if (!drv) {
 error_setg(errp, "Node '%s' is ejected", bs->node_name);
@@ -6553,8 +6565,9 @@ char *bdrv_dirname(BlockDriverState *bs, Error **errp)
 return drv->bdrv_dirname(bs, errp);
 }
 
-if (bs->file) {
-return bdrv_dirname(bs->file->bs, errp);
+child_bs = bdrv_primary_bs(bs);
+if (child_bs) {
+return bdrv_dirname(child_bs, errp);
 }
 
 bdrv_refresh_filename(bs);
-- 
2.21.0