The use of protocols in backing_files is currently broken because of some checks for adjusting relative pathnames.
Additionally, there's a spurious read when using an nbd protocol that can be quite destructive when using copy-on-read. Potentially, this can lead to probing an image file over top of NBD but this is completely wrong as NBD devices are not growable. Signed-off-by: Anthony Liguori <aligu...@us.ibm.com> --- NB: this is absolutely not ideal. A more elegant suggestion would be appreciated. I don't think NBD cleanly fits the model of a protocol as it stands today. diff --git a/block.c b/block.c index cd2ee31..a32d5dd 100644 --- a/block.c +++ b/block.c @@ -344,6 +344,12 @@ static int find_image_format(const char *filename, BlockDriver **pdrv) return ret; } + if (strcmp(bs->drv->protocol_name, "nbd") == 0) { + drv = bs->drv; + bdrv_delete(bs); + goto out; + } + /* Return the raw BlockDriver * to scsi-generic devices or empty drives */ if (bs->sg || !bdrv_is_inserted(bs)) { bdrv_delete(bs); @@ -373,6 +379,7 @@ static int find_image_format(const char *filename, BlockDriver **pdrv) } } } +out: if (!drv) { ret = -ENOENT; } @@ -603,10 +610,16 @@ int bdrv_open(BlockDriverState *bs, const char *filename, int flags, BlockDriver *back_drv = NULL; bs->backing_hd = bdrv_new(""); - path_combine(backing_filename, sizeof(backing_filename), - filename, bs->backing_file); - if (bs->backing_format[0] != '\0') - back_drv = bdrv_find_format(bs->backing_format); + back_drv = bdrv_find_protocol(bs->backing_file); + if (!back_drv) { + path_combine(backing_filename, sizeof(backing_filename), + filename, bs->backing_file); + if (bs->backing_format[0] != '\0') + back_drv = bdrv_find_format(bs->backing_format); + } else { + pstrcpy(backing_filename, sizeof(backing_filename), + bs->backing_file); + } /* backing files always opened read-only */ back_flags = -- 1.7.0.4