On 07/03/2019 04:16 AM, Roman Bolshakov wrote:
> WRITE SAME corrupts data on the block device behind iblock if the
> command is emulated. The emulation code issues (M - 1) * N times more
> bios than requested, where M is the number of 512 blocks per real block
> size and N is the NUMBER OF LOGICAL BLOCKS specified in WRITE SAME
> command. So, for a device with 4k blocks, 7 * N more LBAs gets written
> after the requested range.
>
> The issue happens because the number of 512 byte sectors to be written
> is decreased one by one while the real bios are typically from 1 to 8
> 512 byte sectors per bio.
>
> Fixes: c66ac9db8d4a ("[SCSI] target: Add LIO target core v4.0.0-rc6")
> Cc: <[email protected]>
> Signed-off-by: Roman Bolshakov <[email protected]>
> Reviewed-by: Bart Van Assche <[email protected]>
> ---
> drivers/target/target_core_iblock.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/target/target_core_iblock.c
> b/drivers/target/target_core_iblock.c
> index f4a075303e9a..6949ea8bc387 100644
> --- a/drivers/target/target_core_iblock.c
> +++ b/drivers/target/target_core_iblock.c
> @@ -502,7 +502,7 @@ iblock_execute_write_same(struct se_cmd *cmd)
>
> /* Always in 512 byte units for Linux/Block */
> block_lba += sg->length >> SECTOR_SHIFT;
> - sectors -= 1;
> + sectors -= sg->length >> SECTOR_SHIFT;
> }
>
> iblock_submit_bios(&list);
>
Roman,
The patch looks ok to me. Just one question. How did you hit this?
Did you by any chance export this disk to a ESX initiator and was it
doing WRITE SAME to zero out data. But, did the device being used by
iblock not support the zero out command (was
/sys/block/XYZ/queue/write_zeroes_max_bytes == 0)?
Or, did you just send a WRITE SAME command manually using some tools
like sg utils and it had a non zero'd buffer to write out?
Or, was it some other use case?