From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44228) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VdXNV-0004Zp-PG for qemu-devel@nongnu.org; Mon, 04 Nov 2013 22:32:35 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VdXNP-0007Lk-PY for qemu-devel@nongnu.org; Mon, 04 Nov 2013 22:32:29 -0500 Received: from mx1.redhat.com ([209.132.183.28]:10984) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VdXNP-0007Kf-IG for qemu-devel@nongnu.org; Mon, 04 Nov 2013 22:32:23 -0500 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id rA53WMRf027677 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 4 Nov 2013 22:32:22 -0500 Message-ID: <527866C2.2090803@redhat.com> Date: Tue, 05 Nov 2013 11:32:18 +0800 From: Fam Zheng MIME-Version: 1.0 References: <1383611706-22107-1-git-send-email-mreitz@redhat.com> <1383611706-22107-2-git-send-email-mreitz@redhat.com> In-Reply-To: <1383611706-22107-2-git-send-email-mreitz@redhat.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH v2 1/2] block/drive-mirror: Check for NULL backing_hd List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Max Reitz , qemu-devel@nongnu.org Cc: Kevin Wolf , Stefan Hajnoczi On 11/05/2013 08:35 AM, Max Reitz wrote: > It should be possible to execute the QMP "drive-mirror" command in > "none" sync mode and "absolute-paths" mode even for block devices > lacking a backing file. > > "absolute-paths" does in fact not require a backing file to be present, > as can be seen from the "top" sync mode code path. "top" basically > states that the device should indeed have a backing file - however, the > current code catches the case if it doesn't and then simply treats it as > "full" sync mode, creating a target image without a backing file (in > "absolute-paths" mode). Thus, "absolute-paths" does not imply the target > file must indeed have a backing file. > > Therefore, the target file may be left unbacked in case of "none" sync > mode as well, if the specified device is not backed either. Currently, > qemu will crash trying to dereference the backing file pointer since it > assumes that it will always be non-NULL in that case ("none" with > "absolute-paths"). > > Signed-off-by: Max Reitz > --- > blockdev.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/blockdev.c b/blockdev.c > index b260477..986e59d 100644 > --- a/blockdev.c > +++ b/blockdev.c > @@ -2038,8 +2038,8 @@ void qmp_drive_mirror(const char *device, const char *target, > case NEW_IMAGE_MODE_ABSOLUTE_PATHS: > /* create new image with backing file */ > bdrv_img_create(target, format, > - source->filename, > - source->drv->format_name, > + source ? source->filename : NULL, > + source ? source->drv->format_name : NULL, > NULL, size, flags, &local_err, false); > break; > default: The code around here is: 2029 if (sync == MIRROR_SYNC_MODE_FULL && mode != NEW_IMAGE_MODE_EXISTING) { 2030 /* create new image w/o backing file */ 2031 assert(format && drv); 2032 bdrv_img_create(target, format, 2033 NULL, NULL, NULL, size, flags, &local_err, false); 2034 } else { 2035 switch (mode) { 2036 case NEW_IMAGE_MODE_EXISTING: 2037 break; 2038 case NEW_IMAGE_MODE_ABSOLUTE_PATHS: 2039 /* create new image with backing file */ 2040 bdrv_img_create(target, format, 2041 source->filename, 2042 source->drv->format_name, 2043 NULL, size, flags, &local_err, false); 2044 break; 2045 default: 2046 abort(); 2047 } 2048 } Why not update the if condition and reuse the branch, I think this is a better branching? Either should be fine, but in your change you should also update the comment in line 2039. Thanks, Fam