[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PATCH v6 5/8] vmdk: Set maximum bytes allocated in one cyc
From: |
Ashijeet Acharya |
Subject: |
[Qemu-block] [PATCH v6 5/8] vmdk: Set maximum bytes allocated in one cycle |
Date: |
Mon, 5 Jun 2017 13:22:49 +0530 |
Set the maximum bytes allowed to get allocated at once to be not more
than the extent size boundary to handle writes at two separate extents
appropriately.
Signed-off-by: Ashijeet Acharya <address@hidden>
Reviewed-by: Fam Zheng <address@hidden>
---
block/vmdk.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/block/vmdk.c b/block/vmdk.c
index 5647f53..fe2046b 100644
--- a/block/vmdk.c
+++ b/block/vmdk.c
@@ -1624,6 +1624,7 @@ static int vmdk_pwritev(BlockDriverState *bs, uint64_t
offset,
uint64_t cluster_offset;
uint64_t bytes_done = 0;
VmdkMetaData m_data;
+ uint64_t extent_end;
if (DIV_ROUND_UP(offset, BDRV_SECTOR_SIZE) > bs->total_sectors) {
error_report("Wrong offset: offset=0x%" PRIx64
@@ -1637,9 +1638,17 @@ static int vmdk_pwritev(BlockDriverState *bs, uint64_t
offset,
if (!extent) {
return -EIO;
}
+ extent_end = extent->end_sector * BDRV_SECTOR_SIZE;
+
offset_in_cluster = vmdk_find_offset_in_cluster(extent, offset);
- n_bytes = MIN(bytes, extent->cluster_sectors * BDRV_SECTOR_SIZE
- - offset_in_cluster);
+
+ /* truncate n_bytes to first cluster because we need to perform COW */
+ if (offset_in_cluster > 0) {
+ n_bytes = MIN(bytes, extent->cluster_sectors * BDRV_SECTOR_SIZE
+ - offset_in_cluster);
+ } else {
+ n_bytes = MIN(bytes, extent_end - offset);
+ }
ret = vmdk_get_cluster_offset(bs, extent, &m_data, offset,
!(extent->compressed || zeroed),
--
2.6.2
- [Qemu-block] [PATCH v6 0/8] Optimize VMDK I/O by allocating multiple clusters, Ashijeet Acharya, 2017/06/05
- [Qemu-block] [PATCH v6 1/8] vmdk: Move vmdk_find_offset_in_cluster() to the top, Ashijeet Acharya, 2017/06/05
- [Qemu-block] [PATCH v6 2/8] vmdk: Rename get_whole_cluster() to vmdk_perform_cow(), Ashijeet Acharya, 2017/06/05
- [Qemu-block] [PATCH v6 3/8] vmdk: Rename get_cluster_offset() to vmdk_get_cluster_offset(), Ashijeet Acharya, 2017/06/05
- [Qemu-block] [PATCH v6 4/8] vmdk: Factor out metadata loading code out of vmdk_get_cluster_offset(), Ashijeet Acharya, 2017/06/05
- [Qemu-block] [PATCH v6 5/8] vmdk: Set maximum bytes allocated in one cycle,
Ashijeet Acharya <=
- [Qemu-block] [PATCH v6 6/8] vmdk: New functions to assist allocating multiple clusters, Ashijeet Acharya, 2017/06/05
- [Qemu-block] [PATCH v6 7/8] vmdk: Update metadata for multiple clusters, Ashijeet Acharya, 2017/06/05
- [Qemu-block] [PATCH v6 8/8] vmdk: Make vmdk_get_cluster_offset() return cluster offset only, Ashijeet Acharya, 2017/06/05