diff options
author | Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com> | 2015-03-26 10:41:23 -0400 |
---|---|---|
committer | James Bottomley <JBottomley@Odin.com> | 2015-04-09 19:44:49 -0400 |
commit | 2f5d1f7998b67d49263ee9d9a49669e1b8d0e302 (patch) | |
tree | 15e5a13995eda914b99302be49f6491b9c371aba /drivers/scsi/aacraid/commctrl.c | |
parent | 46154a0224cfb82a14405e7d7ce486b6e6af63e0 (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.c | 10 |
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) { |