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>
This commit is contained in:
parent
4545d4f4af
commit
418661e032
13
block.c
13
block.c
@ -3145,6 +3145,7 @@ BlockDriverState *bdrv_find_backing_image(BlockDriverState *bs,
|
|||||||
int is_protocol = 0;
|
int is_protocol = 0;
|
||||||
BlockDriverState *curr_bs = NULL;
|
BlockDriverState *curr_bs = NULL;
|
||||||
BlockDriverState *retval = NULL;
|
BlockDriverState *retval = NULL;
|
||||||
|
Error *local_error = NULL;
|
||||||
|
|
||||||
if (!bs || !bs->drv || !backing_file) {
|
if (!bs || !bs->drv || !backing_file) {
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -3165,6 +3166,18 @@ BlockDriverState *bdrv_find_backing_image(BlockDriverState *bs,
|
|||||||
retval = curr_bs->backing->bs;
|
retval = curr_bs->backing->bs;
|
||||||
break;
|
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 {
|
} else {
|
||||||
/* If not an absolute filename path, make it relative to the current
|
/* If not an absolute filename path, make it relative to the current
|
||||||
* image's filename path */
|
* image's filename path */
|
||||||
|
Loading…
Reference in New Issue
Block a user