qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH] snapshot: fixed bdrv_get_full_backing_filename can not get correct full_backing_filename
@ 2014-11-07 14:48 Jun Li
  2014-11-07 15:34 ` Max Reitz
  0 siblings, 1 reply; 7+ messages in thread
From: Jun Li @ 2014-11-07 14:48 UTC (permalink / raw)
  To: qemu-devel; +Cc: kwolf, juli, famz, Jun Li, stefanha

When bs->filename and bs->backing_file are relative pathname and not under the
same directory, path_combine() can not give the correct path for
bs->backing_file. So add get_localfile_absolute_path to get absolute path for
local file.

e.g:
$ pwd
/tmp
$ /opt/qemu-git-arm/bin/qemu-img create -f qcow2 ./test 5M
Formatting './test', fmt=qcow2 size=5242880 encryption=off cluster_size=65536
lazy_refcounts=off
$ /opt/qemu-git-arm/bin/qemu-img create -f qcow2 ./tmp/test1 -b ./test
Formatting './tmp/test1', fmt=qcow2 size=5242880 backing_file='./test'
encryption=off cluster_size=65536 lazy_refcounts=off
$ /opt/qemu-git-arm/bin/qemu-img create -f qcow2 ./tmp/test2 -b ./tmp/test1
qemu-img: ./tmp/test2: Could not open './tmp/test1': Could not open backing
file: Could not open './tmp/./test': No such file or directory: No such file
or directory

This patch also fixes the following bug:
https://bugzilla.redhat.com/show_bug.cgi?id=1161582#c2

Signed-off-by: Jun Li <junmuzi@gmail.com>
---
 block.c               | 28 +++++++++++++++++++++++++++-
 include/block/block.h |  2 ++
 2 files changed, 29 insertions(+), 1 deletion(-)

diff --git a/block.c b/block.c
index dacd881..5e2f669 100644
--- a/block.c
+++ b/block.c
@@ -259,6 +259,32 @@ int path_is_absolute(const char *path)
 #endif
 }
 
+void get_localfile_absolute_path(char *dest, int dest_size,
+                                 const char *filename)
+{
+    struct stat sb;
+    char *linkname;
+
+    if (path_is_absolute(filename)) {
+        pstrcpy(dest, dest_size, filename);
+    } else {
+        if (lstat(filename, &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(filename, linkname, sb.st_size + 1);
+            linkname[sb.st_size] = '\0';
+            realpath(linkname, dest);
+        } else {
+            realpath(filename, dest);
+        }
+    }
+}
+
 /* if filename is absolute, just copy it to dest. Otherwise, build a
    path to it by considering it is relative to base_path. URL are
    supported. */
@@ -308,7 +334,7 @@ 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);
+        get_localfile_absolute_path(dest, sz, bs->backing_file);
     }
 }
 
diff --git a/include/block/block.h b/include/block/block.h
index 13e4537..6ddb150 100644
--- a/include/block/block.h
+++ b/include/block/block.h
@@ -398,6 +398,8 @@ void bdrv_get_full_backing_filename(BlockDriverState *bs,
 int bdrv_is_snapshot(BlockDriverState *bs);
 
 int path_is_absolute(const char *path);
+void get_localfile_absolute_path(char *dest, int dest_size,
+                                 const char *filename);
 void path_combine(char *dest, int dest_size,
                   const char *base_path,
                   const char *filename);
-- 
1.9.3

^ permalink raw reply related	[flat|nested] 7+ messages in thread
* [Qemu-devel] [PATCH] snapshot: fixed bdrv_get_full_backing_filename can not get correct full_backing_filename
@ 2014-04-05 16:43 Jun Li
  2014-04-07 21:20 ` Eric Blake
  0 siblings, 1 reply; 7+ messages in thread
From: Jun Li @ 2014-04-05 16:43 UTC (permalink / raw)
  To: kwolf, stefanha, juli; +Cc: Jun Li, qemu-devel

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.

Signed-off-by: Jun Li <junmuzi@gmail.com>
---
 block.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/block.c b/block.c
index 990a754..2519f68 100644
--- a/block.c
+++ b/block.c
@@ -307,7 +307,7 @@ 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);
+        realpath(bs->backing_file, dest);
     }
 }
 
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 7+ messages in thread
* [Qemu-devel] [PATCH] snapshot: fixed bdrv_get_full_backing_filename can not get correct full_backing_filename
@ 2014-04-05 16:42 Jun Li
  0 siblings, 0 replies; 7+ messages in thread
From: Jun Li @ 2014-04-05 16:42 UTC (permalink / raw)
  To: kwolf, stefanha; +Cc: Jun Li, qemu-devel

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.

Signed-off-by: Jun Li <junmuzi@gmail.com>
---
 block.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/block.c b/block.c
index 990a754..2519f68 100644
--- a/block.c
+++ b/block.c
@@ -307,7 +307,7 @@ 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);
+        realpath(bs->backing_file, dest);
     }
 }
 
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2014-11-10 12:37 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-11-07 14:48 [Qemu-devel] [PATCH] snapshot: fixed bdrv_get_full_backing_filename can not get correct full_backing_filename Jun Li
2014-11-07 15:34 ` Max Reitz
2014-11-10  8:19   ` Jun Li
2014-11-10 12:37     ` Max Reitz
  -- strict thread matches above, loose matches on Subject: below --
2014-04-05 16:43 Jun Li
2014-04-07 21:20 ` Eric Blake
2014-04-05 16:42 Jun Li

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).