diff options
author | Max Reitz <mreitz@redhat.com> | 2019-02-01 20:29:23 +0100 |
---|---|---|
committer | Max Reitz <mreitz@redhat.com> | 2019-02-25 15:11:27 +0100 |
commit | 8df686165bacb8b2e6c0cae0cd29fd36b0f243ef (patch) | |
tree | c6135b6033a16fff3c3c0eb968d6dd469168adcd /block.c | |
parent | 0dcbc54a950986c5fbba5b2619fc4a33f92cb348 (diff) |
block: Use bdrv_dirname() for relative filenames
bdrv_get_full_backing_filename_from_filename() breaks down when it comes
to JSON filenames. Using bdrv_dirname() as the basis is better because
since we have BDS, we can descend through the BDS tree to the protocol
layer, which gives us a greater probability of finding a non-JSON name;
also, bdrv_dirname() is more correct as it allows block drivers to
override the generation of that directory name in a protocol-specific
way.
We still need to keep bdrv_get_full_backing_filename_from_filename(),
though, because it has valid callers which need it during image creation
when no BDS is available yet.
This makes a test case in qemu-iotest 110, which was supposed to fail,
work. That is actually good, but we need to change the reference output
(and the comment in 110) accordingly.
Signed-off-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Alberto Garcia <berto@igalia.com>
Message-id: 20190201192935.18394-20-mreitz@redhat.com
Signed-off-by: Max Reitz <mreitz@redhat.com>
Diffstat (limited to 'block.c')
-rw-r--r-- | block.c | 20 |
1 files changed, 13 insertions, 7 deletions
@@ -337,16 +337,22 @@ char *bdrv_get_full_backing_filename_from_filename(const char *backed, static char *bdrv_make_absolute_filename(BlockDriverState *relative_to, const char *filename, Error **errp) { - char *bs_filename; + char *dir, *full_name; - bdrv_refresh_filename(relative_to); + if (!filename || filename[0] == '\0') { + return NULL; + } else if (path_has_protocol(filename) || path_is_absolute(filename)) { + return g_strdup(filename); + } - bs_filename = relative_to->exact_filename[0] - ? relative_to->exact_filename - : relative_to->filename; + dir = bdrv_dirname(relative_to, errp); + if (!dir) { + return NULL; + } - return bdrv_get_full_backing_filename_from_filename(bs_filename, - filename ?: "", errp); + full_name = g_strconcat(dir, filename, NULL); + g_free(dir); + return full_name; } char *bdrv_get_full_backing_filename(BlockDriverState *bs, Error **errp) |