aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/aacraid/commctrl.c
diff options
context:
space:
mode:
authorMahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>2015-03-26 10:41:23 -0400
committerJames Bottomley <JBottomley@Odin.com>2015-04-09 19:44:49 -0400
commit2f5d1f7998b67d49263ee9d9a49669e1b8d0e302 (patch)
tree15e5a13995eda914b99302be49f6491b9c371aba /drivers/scsi/aacraid/commctrl.c
parent46154a0224cfb82a14405e7d7ce486b6e6af63e0 (diff)
aacraid: IOCTL pass-through command fix
The Linux aacriad driver fails to detect the case of SG list count=0 on IOCTL pass-through command and cause intermittent fault. The result is the Linux aacriad driver send down IOCTL pass-through command with one not initialized SG list to firmware when receiving SG list count =0 on pass-through command. Signed-off-by: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com> Reviewed-by: Hannes Reinecke <hare@suse.de> Reviewed-by: Murthy Bhat <Murthy.Bhat@pmcs.com> Signed-off-by: James Bottomley <JBottomley@Odin.com>
Diffstat (limited to 'drivers/scsi/aacraid/commctrl.c')
-rw-r--r--drivers/scsi/aacraid/commctrl.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/scsi/aacraid/commctrl.c b/drivers/scsi/aacraid/commctrl.c
index fbcd48d0bfc3..54195a117f72 100644
--- a/drivers/scsi/aacraid/commctrl.c
+++ b/drivers/scsi/aacraid/commctrl.c
@@ -689,7 +689,10 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg)
689 kfree (usg); 689 kfree (usg);
690 } 690 }
691 srbcmd->count = cpu_to_le32(byte_count); 691 srbcmd->count = cpu_to_le32(byte_count);
692 psg->count = cpu_to_le32(sg_indx+1); 692 if (user_srbcmd->sg.count)
693 psg->count = cpu_to_le32(sg_indx+1);
694 else
695 psg->count = 0;
693 status = aac_fib_send(ScsiPortCommand64, srbfib, actual_fibsize, FsaNormal, 1, 1,NULL,NULL); 696 status = aac_fib_send(ScsiPortCommand64, srbfib, actual_fibsize, FsaNormal, 1, 1,NULL,NULL);
694 } else { 697 } else {
695 struct user_sgmap* upsg = &user_srbcmd->sg; 698 struct user_sgmap* upsg = &user_srbcmd->sg;
@@ -775,7 +778,10 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg)
775 } 778 }
776 } 779 }
777 srbcmd->count = cpu_to_le32(byte_count); 780 srbcmd->count = cpu_to_le32(byte_count);
778 psg->count = cpu_to_le32(sg_indx+1); 781 if (user_srbcmd->sg.count)
782 psg->count = cpu_to_le32(sg_indx+1);
783 else
784 psg->count = 0;
779 status = aac_fib_send(ScsiPortCommand, srbfib, actual_fibsize, FsaNormal, 1, 1, NULL, NULL); 785 status = aac_fib_send(ScsiPortCommand, srbfib, actual_fibsize, FsaNormal, 1, 1, NULL, NULL);
780 } 786 }
781 if (status == -ERESTARTSYS) { 787 if (status == -ERESTARTSYS) {