summaryrefslogtreecommitdiffstats
path: root/drivers/scsi/device_handler
diff options
context:
space:
mode:
authorMartin Wilck <Martin.Wilck@suse.com>2019-09-04 15:52:29 +0000
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2019-10-05 13:10:00 +0200
commit03b75e65ceed413c3a510ad3b2c5e431bd4049ce (patch)
treeef475d670ee17a04d94b42cb13192f0818945711 /drivers/scsi/device_handler
parent2e21e5b225effa60d36fa9a494fdeab1313cda88 (diff)
downloadlinux-stable-03b75e65ceed413c3a510ad3b2c5e431bd4049ce.tar.gz
linux-stable-03b75e65ceed413c3a510ad3b2c5e431bd4049ce.tar.bz2
linux-stable-03b75e65ceed413c3a510ad3b2c5e431bd4049ce.zip
scsi: scsi_dh_rdac: zero cdb in send_mode_select()
commit 57adf5d4cfd3198aa480e7c94a101fc8c4e6109d upstream. cdb in send_mode_select() is not zeroed and is only partially filled in rdac_failover_get(), which leads to some random data getting to the device. Users have reported storage responding to such commands with INVALID FIELD IN CDB. Code before commit 327825574132 was not affected, as it called blk_rq_set_block_pc(). Fix this by zeroing out the cdb first. Identified & fix proposed by HPE. Fixes: 327825574132 ("scsi_dh_rdac: switch to scsi_execute_req_flags()") Cc: stable@vger.kernel.org Link: https://lore.kernel.org/r/20190904155205.1666-1-martin.wilck@suse.com Signed-off-by: Martin Wilck <mwilck@suse.com> Acked-by: Ales Novak <alnovak@suse.cz> Reviewed-by: Shane Seymour <shane.seymour@hpe.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/scsi/device_handler')
-rw-r--r--drivers/scsi/device_handler/scsi_dh_rdac.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/drivers/scsi/device_handler/scsi_dh_rdac.c b/drivers/scsi/device_handler/scsi_dh_rdac.c
index d27fabae8ddd..6c629ef1bc4e 100644
--- a/drivers/scsi/device_handler/scsi_dh_rdac.c
+++ b/drivers/scsi/device_handler/scsi_dh_rdac.c
@@ -546,6 +546,8 @@ static void send_mode_select(struct work_struct *work)
spin_unlock(&ctlr->ms_lock);
retry:
+ memset(cdb, 0, sizeof(cdb));
+
data_size = rdac_failover_get(ctlr, &list, cdb);
RDAC_LOG(RDAC_LOG_FAILOVER, sdev, "array %s, ctlr %d, "