[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v2 10/17] block: define get_block_status return

From: Peter Lieven
Subject: Re: [Qemu-devel] [PATCH v2 10/17] block: define get_block_status return value
Date: Fri, 19 Jul 2013 08:48:04 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130623 Thunderbird/17.0.7

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 <address@hidden>
         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) && 
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?


reply via email to

[Prev in Thread] Current Thread [Next in Thread]