On 18.10.2013 14:38, Stefan Hajnoczi wrote:
On Tue, Oct 08, 2013 at 01:58:08PM +0200, Peter Lieven wrote:
this patch does 2 things:
a) only do additional call outs if BDRV_BLOCK_ZERO is not already set.
b) use the newly introduced bdrv_has_discard_zeroes() to return the
    zero state of an unallocated block. the used callout to
    bdrv_has_zero_init() is only valid right after bdrv_create.

Reviewed-by: Eric Blake <ebl...@redhat.com>
Signed-off-by: Peter Lieven <p...@kamp.de>
---
  block.c |    4 ++--
  1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/block.c b/block.c
index fc931e3..1be4418 100644
--- a/block.c
+++ b/block.c
@@ -3247,8 +3247,8 @@ static int64_t coroutine_fn 
bdrv_co_get_block_status(BlockDriverState *bs,
          return ret;
      }
- if (!(ret & BDRV_BLOCK_DATA)) {
-        if (bdrv_has_zero_init(bs)) {
+    if (!(ret & BDRV_BLOCK_DATA) && !(ret & BDRV_BLOCK_ZERO)) {
+        if (bdrv_has_discard_zeroes(bs)) {
I'm a little unclear about the semantics of bdrv_has_discard_zeroes().
Originally I thought it just meant any blocks discarded will read back
as zeroes.  But here it implies that any unallocated block reads
back as zeroes too?

In other words, this patch assumes unallocated blocks behave the same as
discarded blocks wrt to zeroes.

Stefan
bdrv_has_discard_zeroes() indicates if unallocated blocks read back as zeroes.
as a discard may silently fail this is no guarantee that a discard will result
in a properly zeroed area.

bdrv_has_discard_write_zeroes() indicates that the driver is able to
honour the BDRV_REQ_MAY_UNMAP flag on bdrv_write_zeroes().

see documentation in block_int.h

    /*
     * Returns true if discarded blocks read back as zeroes.
     */
    bool (*bdrv_has_discard_zeroes)(BlockDriverState *bs);

    /*
     * Returns true if the driver can optimize writing zeroes by discarding
     * sectors. It is additionally required that the block device is
     * opened with BDRV_O_UNMAP and the that write zeroes request carries
     * the BDRV_REQ_MAY_UNMAP flag for this to work.
     */
    bool (*bdrv_has_discard_write_zeroes)(BlockDriverState *bs);


Peter

Reply via email to