diff options
author | Jeff Cody <jcody@redhat.com> | 2017-01-25 20:08:20 -0500 |
---|---|---|
committer | Max Reitz <mreitz@redhat.com> | 2017-02-12 00:47:42 +0100 |
commit | 418661e0324c1c419552cf24bd4447292e884bdd (patch) | |
tree | 0e9f36bf26f64e6734975c300f2c1efd388321d2 | |
parent | 4545d4f4af8b29ba3b38dfb74d6f45342e15a62d (diff) | |
download | qemu-418661e0324c1c419552cf24bd4447292e884bdd.zip qemu-418661e0324c1c419552cf24bd4447292e884bdd.tar.gz qemu-418661e0324c1c419552cf24bd4447292e884bdd.tar.bz2 |
block: check full backing filename when searching protocol filenames
In bdrv_find_backing_image(), if we are searching an image for a backing
file that contains a protocol, we currently only compare unmodified
paths.
However, some management software will change the backing filename to be
a relative filename in a path. QEMU is able to handle this fine,
because internally it will use path_combine to put together the full
protocol URI.
However, this can lead to an inability to match an image during a QAPI
command that needs to use bdrv_find_backing_image() to find the image,
when it is searched by the full URI.
When searching for a protocol filename, if the straight comparison
fails, this patch will also compare against the full backing filename to
see if that is a match.
Signed-off-by: Jeff Cody <jcody@redhat.com>
Message-id: c2d025adca8a2b665189e6f4cf080f44126d0b6b.1485392617.git.jcody@redhat.com
Reviewed-by: Max Reitz <mreitz@redhat.com>
Signed-off-by: Max Reitz <mreitz@redhat.com>
-rw-r--r-- | block.c | 13 |
1 files changed, 13 insertions, 0 deletions
@@ -3145,6 +3145,7 @@ BlockDriverState *bdrv_find_backing_image(BlockDriverState *bs, int is_protocol = 0; BlockDriverState *curr_bs = NULL; BlockDriverState *retval = NULL; + Error *local_error = NULL; if (!bs || !bs->drv || !backing_file) { return NULL; @@ -3165,6 +3166,18 @@ BlockDriverState *bdrv_find_backing_image(BlockDriverState *bs, retval = curr_bs->backing->bs; break; } + /* Also check against the full backing filename for the image */ + bdrv_get_full_backing_filename(curr_bs, backing_file_full, PATH_MAX, + &local_error); + if (local_error == NULL) { + if (strcmp(backing_file, backing_file_full) == 0) { + retval = curr_bs->backing->bs; + break; + } + } else { + error_free(local_error); + local_error = NULL; + } } else { /* If not an absolute filename path, make it relative to the current * image's filename path */ |