From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60820) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VKOgf-0002Mi-7S for qemu-devel@nongnu.org; Fri, 13 Sep 2013 04:25:15 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VKOgZ-0003aK-2g for qemu-devel@nongnu.org; Fri, 13 Sep 2013 04:25:09 -0400 Received: from mx1.redhat.com ([209.132.183.28]:24943) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VKOgY-0003X6-RL for qemu-devel@nongnu.org; Fri, 13 Sep 2013 04:25:03 -0400 Message-ID: <5232CBE3.3050503@redhat.com> Date: Fri, 13 Sep 2013 10:25:07 +0200 From: Paolo Bonzini MIME-Version: 1.0 References: <1378481953-23099-1-git-send-email-stefanha@redhat.com> <1378481953-23099-34-git-send-email-stefanha@redhat.com> <5232BFDF.6000402@dlhnet.de> In-Reply-To: <5232BFDF.6000402@dlhnet.de> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PULL 33/42] block: return BDRV_BLOCK_ZERO past end of backing file List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Peter Lieven Cc: Anthony Liguori , qemu-devel@nongnu.org, Stefan Hajnoczi Il 13/09/2013 09:33, Peter Lieven ha scritto: > On 06.09.2013 17:39, Stefan Hajnoczi wrote: >> From: Paolo Bonzini >> >> If the sectors are unallocated and we are past the end of the >> backing file, they will read as zero. >> >> Signed-off-by: Paolo Bonzini >> Signed-off-by: Stefan Hajnoczi >> --- >> block.c | 12 ++++++++++-- >> 1 file changed, 10 insertions(+), 2 deletions(-) >> >> diff --git a/block.c b/block.c >> index aa9ec83..82bbd6c 100644 >> --- a/block.c >> +++ b/block.c >> @@ -3102,8 +3102,16 @@ static int64_t coroutine_fn >> bdrv_co_get_block_status(BlockDriverState *bs, >> return ret; >> } >> - if (!(ret & BDRV_BLOCK_DATA) && bdrv_has_zero_init(bs)) { >> - ret |= BDRV_BLOCK_ZERO; >> + if (!(ret & BDRV_BLOCK_DATA)) { >> + if (bdrv_has_zero_init(bs)) { > this should be bdi->discard_zeroes. bdrv_has_zero_init() does only give > a valid result > right after bdrv_create(). i currently working on extending bdi. I can > send a patch for this > if you agree. Yes, please. Right now there is no bdi->discard_zeroes. >> + ret |= BDRV_BLOCK_ZERO; >> + } else { >> + BlockDriverState *bs2 = bs->backing_hd; > > this segfaults if there is no backing_hd. found while testing > get_block_status with iscsi. > > paolo, is this the correct fix? Yes, thanks. Paolo > @@ -3110,7 +3157,7 @@ static int64_t coroutine_fn > bdrv_co_get_block_status(BlockDriverState *bs, > if (!(ret & BDRV_BLOCK_DATA)) { > if (bdrv_has_zero_init(bs)) { > ret |= BDRV_BLOCK_ZERO; > - } else { > + } else if (bs->backing_hd) { > BlockDriverState *bs2 = bs->backing_hd; > int64_t length2 = bdrv_getlength(bs2); > if (length2 >= 0 && sector_num >= (length2 >> > BDRV_SECTOR_BITS)) { > > >> + int64_t length2 = bdrv_getlength(bs2); >> + if (length2 >= 0 && sector_num >= (length2 >> >> BDRV_SECTOR_BITS)) { >> + ret |= BDRV_BLOCK_ZERO; >> + } >> + } >> } >> return ret; >> } >