Message ID | 1492838021-10538-6-git-send-email-ashijeetacharya@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Sat, 04/22 10:43, Ashijeet Acharya wrote: > 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 <ashijeetacharya@gmail.com> > --- > block/vmdk.c | 13 +++++++++++-- > 1 file changed, 11 insertions(+), 2 deletions(-) > > diff --git a/block/vmdk.c b/block/vmdk.c > index 4cee868..7862791 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 > Reviewed-by: Fam Zheng <famz@redhat.com>
diff --git a/block/vmdk.c b/block/vmdk.c index 4cee868..7862791 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),
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 <ashijeetacharya@gmail.com> --- block/vmdk.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)