|
@@ -270,6 +270,15 @@ void path_combine(char *dest, int dest_size,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+void bdrv_get_full_backing_filename(BlockDriverState *bs, char *dest, size_t sz)
|
|
|
+{
|
|
|
+ if (bs->backing_file[0] == '\0' || path_has_protocol(bs->backing_file)) {
|
|
|
+ pstrcpy(dest, sz, bs->backing_file);
|
|
|
+ } else {
|
|
|
+ path_combine(dest, sz, bs->filename, bs->backing_file);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
void bdrv_register(BlockDriver *bdrv)
|
|
|
{
|
|
|
/* Block drivers without coroutine functions need emulation */
|
|
@@ -796,14 +805,8 @@ int bdrv_open(BlockDriverState *bs, const char *filename, int flags,
|
|
|
BlockDriver *back_drv = NULL;
|
|
|
|
|
|
bs->backing_hd = bdrv_new("");
|
|
|
-
|
|
|
- if (path_has_protocol(bs->backing_file)) {
|
|
|
- pstrcpy(backing_filename, sizeof(backing_filename),
|
|
|
- bs->backing_file);
|
|
|
- } else {
|
|
|
- path_combine(backing_filename, sizeof(backing_filename),
|
|
|
- filename, bs->backing_file);
|
|
|
- }
|
|
|
+ bdrv_get_full_backing_filename(bs, backing_filename,
|
|
|
+ sizeof(backing_filename));
|
|
|
|
|
|
if (bs->backing_format[0] != '\0') {
|
|
|
back_drv = bdrv_find_format(bs->backing_format);
|