From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38462) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VXvAX-0004aV-Mw for qemu-devel@nongnu.org; Sun, 20 Oct 2013 11:43:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VXvAQ-0003dc-Vk for qemu-devel@nongnu.org; Sun, 20 Oct 2013 11:43:53 -0400 Received: from ssl.dlhnet.de ([91.198.192.8]:40540 helo=ssl.dlh.net) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VXvAQ-0003dO-Q8 for qemu-devel@nongnu.org; Sun, 20 Oct 2013 11:43:46 -0400 From: Peter Lieven Date: Sun, 20 Oct 2013 17:42:59 +0200 Message-Id: <1382283791-11181-6-git-send-email-pl@kamp.de> In-Reply-To: <1382283791-11181-1-git-send-email-pl@kamp.de> References: <1382283791-11181-1-git-send-email-pl@kamp.de> Subject: [Qemu-devel] [PATCHv5 05/17] block: add wrappers for logical block provisioning information List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Kevin Wolf , Stefan Hajnoczi , Peter Lieven , ronniesahlberg@gmail.com, pbonzini@redhat.com This adds 2 wrappers to read the unallocated_blocks_are_zero and can_write_zeroes_with_unmap info from the BDI. The wrappers are required to check for the existence of a backing_hd and if the devices are opened with the correct flags. Signed-off-by: Peter Lieven --- block.c | 30 ++++++++++++++++++++++++++++++ include/block/block.h | 2 ++ 2 files changed, 32 insertions(+) diff --git a/block.c b/block.c index 0d97ce6..0601b02 100644 --- a/block.c +++ b/block.c @@ -3094,6 +3094,36 @@ int bdrv_has_zero_init(BlockDriverState *bs) return 0; } +bool bdrv_unallocated_blocks_are_zero(BlockDriverState *bs) +{ + BlockDriverInfo bdi; + + if (bs->backing_hd) { + return false; + } + + if (bdrv_get_info(bs, &bdi) == 0) { + return bdi.unallocated_blocks_are_zero; + } + + return false; +} + +bool bdrv_can_write_zeroes_with_unmap(BlockDriverState *bs) +{ + BlockDriverInfo bdi; + + if (bs->backing_hd || !(bs->open_flags & BDRV_O_UNMAP)) { + return false; + } + + if (bdrv_get_info(bs, &bdi) == 0) { + return bdi.can_write_zeroes_with_unmap; + } + + return false; +} + typedef struct BdrvCoGetBlockStatusData { BlockDriverState *bs; BlockDriverState *base; diff --git a/include/block/block.h b/include/block/block.h index 5fbab01..de0d6ab 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -344,6 +344,8 @@ int bdrv_discard(BlockDriverState *bs, int64_t sector_num, int nb_sectors); int bdrv_co_discard(BlockDriverState *bs, int64_t sector_num, int nb_sectors); int bdrv_has_zero_init_1(BlockDriverState *bs); int bdrv_has_zero_init(BlockDriverState *bs); +bool bdrv_unallocated_blocks_are_zero(BlockDriverState *bs); +bool bdrv_can_write_zeroes_with_unmap(BlockDriverState *bs); int64_t bdrv_get_block_status(BlockDriverState *bs, int64_t sector_num, int nb_sectors, int *pnum); int bdrv_is_allocated(BlockDriverState *bs, int64_t sector_num, int nb_sectors, -- 1.7.9.5