linux-stable/drivers/target
Xiaoguang Wang 4c9466307c scsi: target: tcmu: Fix possible data corruption
[ Upstream commit bb9b9eb0ae ]

When tcmu_vma_fault() gets a page successfully, before the current context
completes page fault procedure, find_free_blocks() may run and call
unmap_mapping_range() to unmap the page. Assume that when
find_free_blocks() initially completes and the previous page fault
procedure starts to run again and completes, then one truncated page has
been mapped to userspace. But note that tcmu_vma_fault() has gotten a
refcount for the page so any other subsystem won't be able to use the page
unless the userspace address is unmapped later.

If another command subsequently runs and needs to extend dbi_thresh it may
reuse the corresponding slot for the previous page in data_bitmap. Then
though we'll allocate new page for this slot in data_area, no page fault
will happen because we have a valid map and the real request's data will be
lost.

Filesystem implementations will also run into this issue but they usually
lock the page when vm_operations_struct->fault gets a page and unlock the
page after finish_fault() completes. For truncate filesystems lock pages in
truncate_inode_pages() to protect against racing wrt. page faults.

To fix this possible data corruption scenario we can apply a method similar
to the filesystems.  For pages that are to be freed, tcmu_blocks_release()
locks and unlocks. Make tcmu_vma_fault() also lock found page under
cmdr_lock. At the same time, since tcmu_vma_fault() gets an extra page
refcount, tcmu_blocks_release() won't free pages if pages are in page fault
procedure, which means it is safe to call tcmu_blocks_release() before
unmap_mapping_range().

With these changes tcmu_blocks_release() will wait for all page faults to
be completed before calling unmap_mapping_range(). And later, if
unmap_mapping_range() is called, it will ensure stale mappings are removed.

Link: https://lore.kernel.org/r/20220421023735.9018-1-xiaoguang.wang@linux.alibaba.com
Reviewed-by: Bodo Stroesser <bostroesser@gmail.com>
Signed-off-by: Xiaoguang Wang <xiaoguang.wang@linux.alibaba.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2022-06-09 10:25:23 +02:00
..
iscsi scsi: target: iscsi: Make sure the np under each tpg is unique 2022-01-24 23:30:24 -05:00
loopback scsi: target: tcm_loop: Call scsi_done() directly 2021-10-16 21:31:43 -04:00
sbp scsi: target: sbp: Replace enable attr with ops.enable 2021-10-04 23:27:38 -04:00
tcm_fc scsi: target: tcm_fc: Fix a kernel-doc header 2021-04-15 22:44:41 -04:00
Kconfig scsi: core: Rename CONFIG_BLK_SCSI_REQUEST to CONFIG_SCSI_COMMON 2021-07-28 22:24:27 -04:00
Makefile
target_core_alua.c scsi: target: Perform ALUA group changes in one step 2021-10-18 22:38:36 -04:00
target_core_alua.h
target_core_configfs.c Merge branch '5.15/scsi-fixes' into 5.16/scsi-staging 2021-10-12 11:58:12 -04:00
target_core_device.c scsi: target: Fix ordered tag handling 2021-10-18 22:38:35 -04:00
target_core_fabric_configfs.c scsi: target: configfs: Delete unnecessary checks for NULL 2021-11-18 23:07:02 -05:00
target_core_fabric_lib.c
target_core_file.c fs: get rid of the res2 iocb->ki_complete argument 2021-10-25 10:36:24 -06:00
target_core_file.h
target_core_hba.c
target_core_iblock.c SCSI misc on 20211105 2021-11-05 08:42:02 -07:00
target_core_iblock.h
target_core_internal.h scsi: target: Fix ordered tag handling 2021-10-18 22:38:35 -04:00
target_core_pr.c scsi: target: Fix spelling mistake "CONFLIFT" -> "CONFLICT" 2021-09-22 00:17:29 -04:00
target_core_pr.h scsi: target: core: Unify NAA identifier generation 2021-05-15 14:14:28 -04:00
target_core_pscsi.c block: remove the gendisk argument to blk_execute_rq 2021-11-29 06:41:29 -07:00
target_core_pscsi.h
target_core_rd.c scsi: target: Add the DUMMY flag to rd_mcp 2021-04-05 23:26:38 -04:00
target_core_rd.h scsi: target: Add the DUMMY flag to rd_mcp 2021-04-05 23:26:38 -04:00
target_core_sbc.c scsi: target: Fix protect handling in WRITE SAME(32) 2021-07-18 21:27:42 -04:00
target_core_spc.c scsi: target: core: Use RCU helpers for INQUIRY t10_alua_tg_pt_gp 2021-11-18 23:06:55 -05:00
target_core_stat.c
target_core_tmr.c scsi: target: core: Remove from tmr_list during LUN unlink 2021-10-26 23:15:23 -04:00
target_core_tpg.c
target_core_transport.c scsi: target: core: Remove from tmr_list during LUN unlink 2021-10-26 23:15:23 -04:00
target_core_ua.c
target_core_ua.h
target_core_user.c scsi: target: tcmu: Fix possible data corruption 2022-06-09 10:25:23 +02:00
target_core_xcopy.c scsi: target: Remove unused function arguments 2021-09-14 23:41:24 -04:00
target_core_xcopy.h