From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41430) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V04U8-00084H-Jj for qemu-devel@nongnu.org; Fri, 19 Jul 2013 02:48:15 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1V04U6-0004MY-4f for qemu-devel@nongnu.org; Fri, 19 Jul 2013 02:48:12 -0400 Received: from mx.ipv6.kamp.de ([2a02:248:0:51::16]:52667 helo=mx01.kamp.de) by eggs.gnu.org with smtp (Exim 4.71) (envelope-from ) id 1V04U5-0004MM-PT for qemu-devel@nongnu.org; Fri, 19 Jul 2013 02:48:10 -0400 Message-ID: <51E8E124.3050500@kamp.de> Date: Fri, 19 Jul 2013 08:48:04 +0200 From: Peter Lieven MIME-Version: 1.0 References: <1373992168-26043-1-git-send-email-pbonzini@redhat.com> <1373992168-26043-11-git-send-email-pbonzini@redhat.com> In-Reply-To: <1373992168-26043-11-git-send-email-pbonzini@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH v2 10/17] block: define get_block_status return value List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Paolo Bonzini Cc: famz@redhat.com, qemu-devel@nongnu.org, stefanha@redhat.com On 16.07.2013 18:29, Paolo Bonzini wrote: > Define the return value of get_block_status. Bits 0, 1, 2 and 9-62 > are valid; bit 63 (the sign bit) is reserved for errors. Bits 3-7 > are left for future extensions. > > The return code is compatible with the old is_allocated API: returning > just 0 or 1 (aka BDRV_BLOCK_DATA) will not cause any behavioral change > in clients of is_allocated. We will return more precise information > in the next patches. > > Signed-off-by: Paolo Bonzini > --- > v1->v2: improved comment > > block.c | 7 +++++-- > include/block/block.h | 26 ++++++++++++++++++++++++++ > 2 files changed, 31 insertions(+), 2 deletions(-) > > diff --git a/block.c b/block.c > index 6e7a8a3..7ff0716 100644 > --- a/block.c > +++ b/block.c > @@ -2990,7 +2990,7 @@ static int64_t coroutine_fn bdrv_co_get_block_status(BlockDriverState *bs, > > if (!bs->drv->bdrv_co_get_block_status) { > *pnum = nb_sectors; > - return 1; > + return BDRV_BLOCK_DATA; > } > > return bs->drv->bdrv_co_get_block_status(bs, sector_num, nb_sectors, pnum); > @@ -3040,7 +3040,10 @@ int64_t bdrv_get_block_status(BlockDriverState *bs, int64_t sector_num, > int coroutine_fn bdrv_is_allocated(BlockDriverState *bs, int64_t sector_num, > int nb_sectors, int *pnum) > { > - return bdrv_get_block_status(bs, sector_num, nb_sectors, pnum); > + int64_t ret = bdrv_get_block_status(bs, sector_num, nb_sectors, pnum); > + return > + (ret & BDRV_BLOCK_DATA) || > + ((ret & BDRV_BLOCK_ZERO) && !bdrv_has_zero_init(bs)); i do also not understand the "((ret & BDRV_BLOCK_ZERO) && !bdrv_has_zero_init(bs))"; if a block is unallocated and reads as zero, but the device lacks zero init, it is declared as allocated with this, isn't it? for iscsi and host_device with lbprz==1 or discardzeroes respectively all blocks would return as allocated. is this wanted? Peter