From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33504) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WlxAC-0005qX-4e for qemu-devel@nongnu.org; Sun, 18 May 2014 05:13:57 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WlxA3-0005l8-3M for qemu-devel@nongnu.org; Sun, 18 May 2014 05:13:48 -0400 Received: from mail-pa0-x233.google.com ([2607:f8b0:400e:c03::233]:35081) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WlxA2-0005l4-RW for qemu-devel@nongnu.org; Sun, 18 May 2014 05:13:39 -0400 Received: by mail-pa0-f51.google.com with SMTP id kq14so4393693pab.24 for ; Sun, 18 May 2014 02:13:37 -0700 (PDT) Message-ID: <5378797C.4080101@gmail.com> Date: Sun, 18 May 2014 17:12:28 +0800 From: Jun Li MIME-Version: 1.0 References: <1400403662-12446-1-git-send-email-junmuzi@gmail.com> In-Reply-To: <1400403662-12446-1-git-send-email-junmuzi@gmail.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH v4] snapshot: fixed bdrv_get_full_backing_filename can not get correct full_backing_filename List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: kwolf@redhat.com, stefanha@redhat.com, famz@redhat.com, juli@redhat.com Cc: qemu-devel@nongnu.org please ignore this one. On 05/18/2014 05:01 PM, Jun Li wrote: > This patch fixed bdrv_get_full_backing_filename can not calculate the correct full path name for backing_file via path_combine. > > Such as: > create a snapshot chain: > $BASE_IMG<-sn1<-sn2 > 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 > --- > This is v4 of the patch. This version is the same with v3. Only difference is the commit description. > What does this patch has fixed, please ref following bug(it gives the detailed description): > https://bugzilla.redhat.com/show_bug.cgi?id=1084302 > --- > block.c | 18 +++++++++++++++++- > 1 file changed, 17 insertions(+), 1 deletion(-) > > diff --git a/block.c b/block.c > index c90c71a..d163a8c 100644 > --- a/block.c > +++ b/block.c > @@ -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); > + } > } > } >