Re: [Qemu-block] [PATCH v2 1/1] block/vmdk: Fix the endian problem of buf_len and lba
在 2016-11-28 15:56, liujing 写道: Hi QingFeng, I just have a question that whether the marker->data need convert? I've no idea, just suddenly realized this question. nope, the data is type of char * for the compressed data stream, so no endian issue. thanks. Jing On 11/26/2016 01:46 PM, QingFeng Hao wrote: The problem was triggered by qemu-iotests case 055. It failed when it was comparing the compressed vmdk image with original test.img. The cause is that buf_len in vmdk_write_extent wasn't converted to little-endian before it was stored to disk. But later vmdk_read_extent read it and converted it from little-endian to cpu endian. If the cpu is big-endian like s390, the problem will happen and the data length read by vmdk_read_extent will become invalid! The fix is to add the conversion in vmdk_write_extent, meanwhile, repair the endianness problem of lba field which shall also be converted to little-endian before storing to disk. Cc: qemu-sta...@nongnu.org Signed-off-by: QingFeng HaoSigned-off-by: Jing Liu Signed-off-by: Kevin Wolf --- block/vmdk.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/block/vmdk.c b/block/vmdk.c index a11c27a..26e5f95 100644 --- a/block/vmdk.c +++ b/block/vmdk.c @@ -1354,8 +1354,8 @@ static int vmdk_write_extent(VmdkExtent *extent, int64_t cluster_offset, goto out; } -data->lba = offset >> BDRV_SECTOR_BITS; -data->size = buf_len; +data->lba = cpu_to_le64(offset >> BDRV_SECTOR_BITS); +data->size = cpu_to_le32(buf_len); n_bytes = buf_len + sizeof(VmdkGrainMarker); iov = (struct iovec) { -- QingFeng Hao(Robin)
Re: [Qemu-block] [PATCH v2 1/1] block/vmdk: Fix the endian problem of buf_len and lba
Hi QingFeng, I just have a question that whether the marker->data need convert? I've no idea, just suddenly realized this question. Jing On 11/26/2016 01:46 PM, QingFeng Hao wrote: The problem was triggered by qemu-iotests case 055. It failed when it was comparing the compressed vmdk image with original test.img. The cause is that buf_len in vmdk_write_extent wasn't converted to little-endian before it was stored to disk. But later vmdk_read_extent read it and converted it from little-endian to cpu endian. If the cpu is big-endian like s390, the problem will happen and the data length read by vmdk_read_extent will become invalid! The fix is to add the conversion in vmdk_write_extent, meanwhile, repair the endianness problem of lba field which shall also be converted to little-endian before storing to disk. Cc: qemu-sta...@nongnu.org Signed-off-by: QingFeng HaoSigned-off-by: Jing Liu Signed-off-by: Kevin Wolf --- block/vmdk.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/block/vmdk.c b/block/vmdk.c index a11c27a..26e5f95 100644 --- a/block/vmdk.c +++ b/block/vmdk.c @@ -1354,8 +1354,8 @@ static int vmdk_write_extent(VmdkExtent *extent, int64_t cluster_offset, goto out; } -data->lba = offset >> BDRV_SECTOR_BITS; -data->size = buf_len; +data->lba = cpu_to_le64(offset >> BDRV_SECTOR_BITS); +data->size = cpu_to_le32(buf_len); n_bytes = buf_len + sizeof(VmdkGrainMarker); iov = (struct iovec) {
[Qemu-block] [PATCH v2 1/1] block/vmdk: Fix the endian problem of buf_len and lba
The problem was triggered by qemu-iotests case 055. It failed when it was comparing the compressed vmdk image with original test.img. The cause is that buf_len in vmdk_write_extent wasn't converted to little-endian before it was stored to disk. But later vmdk_read_extent read it and converted it from little-endian to cpu endian. If the cpu is big-endian like s390, the problem will happen and the data length read by vmdk_read_extent will become invalid! The fix is to add the conversion in vmdk_write_extent, meanwhile, repair the endianness problem of lba field which shall also be converted to little-endian before storing to disk. Cc: qemu-sta...@nongnu.org Signed-off-by: QingFeng HaoSigned-off-by: Jing Liu Signed-off-by: Kevin Wolf --- block/vmdk.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/block/vmdk.c b/block/vmdk.c index a11c27a..26e5f95 100644 --- a/block/vmdk.c +++ b/block/vmdk.c @@ -1354,8 +1354,8 @@ static int vmdk_write_extent(VmdkExtent *extent, int64_t cluster_offset, goto out; } -data->lba = offset >> BDRV_SECTOR_BITS; -data->size = buf_len; +data->lba = cpu_to_le64(offset >> BDRV_SECTOR_BITS); +data->size = cpu_to_le32(buf_len); n_bytes = buf_len + sizeof(VmdkGrainMarker); iov = (struct iovec) { -- 2.8.4