[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 4/7] block: Introduce a new API bdrv_co_no_copy_on_re
From: |
Jeff Cody |
Subject: |
[Qemu-devel] [PULL 4/7] block: Introduce a new API bdrv_co_no_copy_on_readv() |
Date: |
Fri, 25 Sep 2015 11:50:53 -0400 |
From: Wen Congyang <address@hidden>
In some cases, we need to disable copy-on-read, and just
read the data.
Signed-off-by: Wen Congyang <address@hidden>
Message-id: address@hidden
Signed-off-by: Jeff Cody <address@hidden>
---
block/io.c | 12 +++++++++++-
include/block/block.h | 9 ++++++---
trace-events | 1 +
3 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/block/io.c b/block/io.c
index d4bc83b..94e18e6 100644
--- a/block/io.c
+++ b/block/io.c
@@ -932,7 +932,8 @@ static int coroutine_fn bdrv_co_do_preadv(BlockDriverState
*bs,
return ret;
}
- if (bs->copy_on_read) {
+ /* Don't do copy-on-read if we read data before write operation */
+ if (bs->copy_on_read && !(flags & BDRV_REQ_NO_COPY_ON_READ)) {
flags |= BDRV_REQ_COPY_ON_READ;
}
@@ -1001,6 +1002,15 @@ int coroutine_fn bdrv_co_readv(BlockDriverState *bs,
int64_t sector_num,
return bdrv_co_do_readv(bs, sector_num, nb_sectors, qiov, 0);
}
+int coroutine_fn bdrv_co_no_copy_on_readv(BlockDriverState *bs,
+ int64_t sector_num, int nb_sectors, QEMUIOVector *qiov)
+{
+ trace_bdrv_co_no_copy_on_readv(bs, sector_num, nb_sectors);
+
+ return bdrv_co_do_readv(bs, sector_num, nb_sectors, qiov,
+ BDRV_REQ_NO_COPY_ON_READ);
+}
+
int coroutine_fn bdrv_co_copy_on_readv(BlockDriverState *bs,
int64_t sector_num, int nb_sectors, QEMUIOVector *qiov)
{
diff --git a/include/block/block.h b/include/block/block.h
index ef67353..2dd6630 100644
--- a/include/block/block.h
+++ b/include/block/block.h
@@ -51,15 +51,16 @@ typedef struct BlockFragInfo {
} BlockFragInfo;
typedef enum {
- BDRV_REQ_COPY_ON_READ = 0x1,
- BDRV_REQ_ZERO_WRITE = 0x2,
+ 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,
+ BDRV_REQ_MAY_UNMAP = 0x4,
+ BDRV_REQ_NO_COPY_ON_READ = 0x8,
} BdrvRequestFlags;
typedef struct BlockSizes {
@@ -252,6 +253,8 @@ int coroutine_fn bdrv_co_readv(BlockDriverState *bs,
int64_t sector_num,
int nb_sectors, QEMUIOVector *qiov);
int coroutine_fn bdrv_co_copy_on_readv(BlockDriverState *bs,
int64_t sector_num, int nb_sectors, QEMUIOVector *qiov);
+int coroutine_fn bdrv_co_no_copy_on_readv(BlockDriverState *bs,
+ int64_t sector_num, int nb_sectors, QEMUIOVector *qiov);
int coroutine_fn bdrv_co_writev(BlockDriverState *bs, int64_t sector_num,
int nb_sectors, QEMUIOVector *qiov);
/*
diff --git a/trace-events b/trace-events
index 25c53e0..a70ea9c 100644
--- a/trace-events
+++ b/trace-events
@@ -69,6 +69,7 @@ bdrv_aio_write_zeroes(void *bs, int64_t sector_num, int
nb_sectors, int flags, v
bdrv_lock_medium(void *bs, bool locked) "bs %p locked %d"
bdrv_co_readv(void *bs, int64_t sector_num, int nb_sector) "bs %p sector_num
%"PRId64" nb_sectors %d"
bdrv_co_copy_on_readv(void *bs, int64_t sector_num, int nb_sector) "bs %p
sector_num %"PRId64" nb_sectors %d"
+bdrv_co_no_copy_on_readv(void *bs, int64_t sector_num, int nb_sector) "bs %p
sector_num %"PRId64" nb_sectors %d"
bdrv_co_writev(void *bs, int64_t sector_num, int nb_sector) "bs %p sector_num
%"PRId64" nb_sectors %d"
bdrv_co_write_zeroes(void *bs, int64_t sector_num, int nb_sector, int flags)
"bs %p sector_num %"PRId64" nb_sectors %d flags %#x"
bdrv_co_io_em(void *bs, int64_t sector_num, int nb_sectors, int is_write, void
*acb) "bs %p sector_num %"PRId64" nb_sectors %d is_write %d acb %p"
--
1.9.3
- [Qemu-devel] [PULL 0/7] Block patches, Jeff Cody, 2015/09/25
- [Qemu-devel] [PULL 1/7] block/nfs: fix calculation of allocated file size, Jeff Cody, 2015/09/25
- [Qemu-devel] [PULL 5/7] Backup: don't do copy-on-read in before_write_notifier, Jeff Cody, 2015/09/25
- [Qemu-devel] [PULL 6/7] sheepdog: use per AIOCB dirty indexes for non overlapping requests, Jeff Cody, 2015/09/25
- [Qemu-devel] [PULL 4/7] block: Introduce a new API bdrv_co_no_copy_on_readv(),
Jeff Cody <=
- [Qemu-devel] [PULL 7/7] sheepdog: refine discard support, Jeff Cody, 2015/09/25
- [Qemu-devel] [PULL 3/7] sheepdog: add reopen support, Jeff Cody, 2015/09/25
- [Qemu-devel] [PULL 2/7] block/nfs: cache allocated filesize for read-only files, Jeff Cody, 2015/09/25
- Re: [Qemu-devel] [PULL 0/7] Block patches, Peter Maydell, 2015/09/25