snapshot: fixed bdrv_get_full_backing_filename can not get correct full_backing_filename
PATCH v3 1/1 snapshot: fixed bdrv_get_full_backing_filename can not get correct full_backing_filename
This patch fixed the following bug:
https://bugzilla.redhat.com/show_bug.cgi?id=1084302 .
path_combine can not calculate the correct full path name for backing_file. Such as:
create a snapshot chain:
sn2->sn1->$BASE_IMG
backing file is : /home/wookpecker/img.qcow2
sn1 : /home/woodpecker/tmp/sn1
sn2 : /home/woodpecker/tmp/sn2
when create sn2, path_combine can not got a correct path for $BASE_IMG.
In this patch, will check the backing_filename is a symlink or not firstly, then return the full(absolute) path via realpath.
Signed-off-by Jun Li <[email protected]>
--- block.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-)
block.c +17 -1
@@ -304,10 +304,26 @@ void path_combine(char *dest, int dest_size,void bdrv_get_full_backing_filename (BlockDriverState *bs,char *dest,size_t sz) { +struct stat sb; +char *linkname; +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); +if (lstat (bs->backing_file, &sb) ==-1 ) { +perror ("lstat" ); +exit (EXIT_FAILURE ); + } + +/* Check linkname is a link or not */ +if (S_ISLNK (sb.st_mode)) { + linkname =malloc (sb.st_size +1 ); +readlink (bs->backing_file, linkname, sb.st_size +1 ); + linkname[sb.st_size] ='\0' ; +realpath (linkname, dest); + }else { +realpath (bs->backing_file, dest); + } } }
Signature · 1 line
1.8.3.1