[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 03/41] block: introduce BDRV_REQ_MAY_UNMAP request fl
From: |
Kevin Wolf |
Subject: |
[Qemu-devel] [PULL 03/41] block: introduce BDRV_REQ_MAY_UNMAP request flag |
Date: |
Fri, 29 Nov 2013 17:45:18 +0100 |
From: Peter Lieven <address@hidden>
Reviewed-by: Eric Blake <address@hidden>
Signed-off-by: Peter Lieven <address@hidden>
Signed-off-by: Stefan Hajnoczi <address@hidden>
---
block-migration.c | 3 ++-
block.c | 4 ++++
block/backup.c | 2 +-
include/block/block.h | 7 +++++++
4 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/block-migration.c b/block-migration.c
index 713a8e3..fc4ef93 100644
--- a/block-migration.c
+++ b/block-migration.c
@@ -780,7 +780,8 @@ static int block_load(QEMUFile *f, void *opaque, int
version_id)
}
if (flags & BLK_MIG_FLAG_ZERO_BLOCK) {
- ret = bdrv_write_zeroes(bs, addr, nr_sectors, 0);
+ ret = bdrv_write_zeroes(bs, addr, nr_sectors,
+ BDRV_REQ_MAY_UNMAP);
} else {
buf = g_malloc(BLOCK_SIZE);
qemu_get_buffer(f, buf, BLOCK_SIZE);
diff --git a/block.c b/block.c
index e14ba48..d34e974 100644
--- a/block.c
+++ b/block.c
@@ -2818,6 +2818,10 @@ int coroutine_fn bdrv_co_write_zeroes(BlockDriverState
*bs,
{
trace_bdrv_co_write_zeroes(bs, sector_num, nb_sectors);
+ if (!(bs->open_flags & BDRV_O_UNMAP)) {
+ flags &= ~BDRV_REQ_MAY_UNMAP;
+ }
+
return bdrv_co_do_writev(bs, sector_num, nb_sectors, NULL,
BDRV_REQ_ZERO_WRITE | flags);
}
diff --git a/block/backup.c b/block/backup.c
index 830a179..0198514 100644
--- a/block/backup.c
+++ b/block/backup.c
@@ -139,7 +139,7 @@ static int coroutine_fn backup_do_cow(BlockDriverState *bs,
if (buffer_is_zero(iov.iov_base, iov.iov_len)) {
ret = bdrv_co_write_zeroes(job->target,
start * BACKUP_SECTORS_PER_CLUSTER,
- n, 0);
+ n, BDRV_REQ_MAY_UNMAP);
} else {
ret = bdrv_co_writev(job->target,
start * BACKUP_SECTORS_PER_CLUSTER, n,
diff --git a/include/block/block.h b/include/block/block.h
index 8ba9f0c..1f30a56 100644
--- a/include/block/block.h
+++ b/include/block/block.h
@@ -65,6 +65,13 @@ typedef struct BlockDevOps {
typedef enum {
BDRV_REQ_COPY_ON_READ = 0x1,
BDRV_REQ_ZERO_WRITE = 0x2,
+ /* The BDRV_REQ_MAY_UNMAP flag is used to indicate that the block driver
+ * is allowed to optimize a write zeroes request by unmapping (discarding)
+ * blocks if it is guaranteed that the result will read back as
+ * zeroes. The flag is only passed to the driver if the block device is
+ * opened with BDRV_O_UNMAP.
+ */
+ BDRV_REQ_MAY_UNMAP = 0x4,
} BdrvRequestFlags;
#define BDRV_O_RDWR 0x0002
--
1.8.1.4
- [Qemu-devel] [PULL 00/41] Block patches for 2.0 (flushing block-next), Kevin Wolf, 2013/11/29
- [Qemu-devel] [PULL 04/41] block: add logical block provisioning info to BlockDriverInfo, Kevin Wolf, 2013/11/29
- [Qemu-devel] [PULL 02/41] block: add flags to bdrv_*_write_zeroes, Kevin Wolf, 2013/11/29
- [Qemu-devel] [PULL 01/41] block: make BdrvRequestFlags public, Kevin Wolf, 2013/11/29
- [Qemu-devel] [PULL 03/41] block: introduce BDRV_REQ_MAY_UNMAP request flag,
Kevin Wolf <=
- [Qemu-devel] [PULL 07/41] block: add BlockLimits structure to BlockDriverState, Kevin Wolf, 2013/11/29
- [Qemu-devel] [PULL 06/41] block/iscsi: add .bdrv_get_info, Kevin Wolf, 2013/11/29
- [Qemu-devel] [PULL 05/41] block: add wrappers for logical block provisioning information, Kevin Wolf, 2013/11/29
- [Qemu-devel] [PULL 08/41] block/raw: copy BlockLimits on raw_open, Kevin Wolf, 2013/11/29
- [Qemu-devel] [PULL 09/41] block: honour BlockLimits in bdrv_co_do_write_zeroes, Kevin Wolf, 2013/11/29
- [Qemu-devel] [PULL 10/41] block: honour BlockLimits in bdrv_co_discard, Kevin Wolf, 2013/11/29
- [Qemu-devel] [PULL 11/41] iscsi: set limits in BlockDriverState, Kevin Wolf, 2013/11/29
- [Qemu-devel] [PULL 12/41] iscsi: simplify iscsi_co_discard, Kevin Wolf, 2013/11/29
- [Qemu-devel] [PULL 13/41] iscsi: add bdrv_co_write_zeroes, Kevin Wolf, 2013/11/29
- [Qemu-devel] [PULL 14/41] block: introduce bdrv_make_zero, Kevin Wolf, 2013/11/29