summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoman Bolshakov <r.bolshakov@yadro.com>2019-07-02 22:16:38 +0300
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2019-09-16 08:22:17 +0200
commit60b856dc174431561372d664c2c317dc4aa73fc8 (patch)
treef465bccf8cd67da575cfc8a163018c091966ac36
parentba52842de1adfc46ee78d6e2fc6440b97508abc5 (diff)
downloadlinux-stable-60b856dc174431561372d664c2c317dc4aa73fc8.tar.gz
linux-stable-60b856dc174431561372d664c2c317dc4aa73fc8.tar.bz2
linux-stable-60b856dc174431561372d664c2c317dc4aa73fc8.zip
scsi: target/iblock: Fix overrun in WRITE SAME emulation
[ Upstream commit 5676234f20fef02f6ca9bd66c63a8860fce62645 ] 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: <stable@vger.kernel.org> Signed-off-by: Roman Bolshakov <r.bolshakov@yadro.com> Reviewed-by: Bart Van Assche <bvanassche@acm.org> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
-rw-r--r--drivers/target/target_core_iblock.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/target/target_core_iblock.c b/drivers/target/target_core_iblock.c
index 1bc9b14236d8..854b2bcca7c1 100644
--- a/drivers/target/target_core_iblock.c
+++ b/drivers/target/target_core_iblock.c
@@ -515,7 +515,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);