Re: [PATCH v2 03/11] mpt3sas: Implement device_remove_in_progress check in IOCTL path

2016-10-27 Thread Hannes Reinecke
On 10/26/2016 10:04 AM, Suganath Prabu S wrote:
> When device missing event arrives, device_remove_in_progress bit will be
> set and hence driver has to stop sending IOCTL commands.Now the check has
> been added in IOCTL path to test device_remove_in_progress bit is set, if
> so then IOCTL will be failed printing failure message.
> 
> Signed-off-by: Chaitra P B 
> Signed-off-by: Sathya Prakash 
> Signed-off-by: Suganath Prabu S 
> ---
>  drivers/scsi/mpt3sas/mpt3sas_base.c  | 19 +++
>  drivers/scsi/mpt3sas/mpt3sas_base.h  |  5 
>  drivers/scsi/mpt3sas/mpt3sas_ctl.c   | 46 
> ++--
>  drivers/scsi/mpt3sas/mpt3sas_scsih.c | 24 ++-
>  4 files changed, 86 insertions(+), 8 deletions(-)
> 
Reviewed-by: Hannes Reinecke 

Cheers,

Hannes
-- 
Dr. Hannes ReineckeTeamlead Storage & Networking
h...@suse.de   +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v2 03/11] mpt3sas: Implement device_remove_in_progress check in IOCTL path

2016-10-26 Thread Suganath Prabu S
When device missing event arrives, device_remove_in_progress bit will be
set and hence driver has to stop sending IOCTL commands.Now the check has
been added in IOCTL path to test device_remove_in_progress bit is set, if
so then IOCTL will be failed printing failure message.

Signed-off-by: Chaitra P B 
Signed-off-by: Sathya Prakash 
Signed-off-by: Suganath Prabu S 
---
 drivers/scsi/mpt3sas/mpt3sas_base.c  | 19 +++
 drivers/scsi/mpt3sas/mpt3sas_base.h  |  5 
 drivers/scsi/mpt3sas/mpt3sas_ctl.c   | 46 ++--
 drivers/scsi/mpt3sas/mpt3sas_scsih.c | 24 ++-
 4 files changed, 86 insertions(+), 8 deletions(-)

diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c 
b/drivers/scsi/mpt3sas/mpt3sas_base.c
index 4ea81e1..9ad7f7c 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_base.c
+++ b/drivers/scsi/mpt3sas/mpt3sas_base.c
@@ -5334,6 +5334,21 @@ mpt3sas_base_attach(struct MPT3SAS_ADAPTER *ioc)
goto out_free_resources;
}
 
+   /* allocate memory for pending OS device add list */
+   ioc->pend_os_device_add_sz = (ioc->facts.MaxDevHandle / 8);
+   if (ioc->facts.MaxDevHandle % 8)
+   ioc->pend_os_device_add_sz++;
+   ioc->pend_os_device_add = kzalloc(ioc->pend_os_device_add_sz,
+   GFP_KERNEL);
+   if (!ioc->pend_os_device_add)
+   goto out_free_resources;
+
+   ioc->device_remove_in_progress_sz = ioc->pend_os_device_add_sz;
+   ioc->device_remove_in_progress =
+   kzalloc(ioc->device_remove_in_progress_sz, GFP_KERNEL);
+   if (!ioc->device_remove_in_progress)
+   goto out_free_resources;
+
ioc->fwfault_debug = mpt3sas_fwfault_debug;
 
/* base internal command bits */
@@ -5416,6 +5431,8 @@ mpt3sas_base_attach(struct MPT3SAS_ADAPTER *ioc)
kfree(ioc->reply_post_host_index);
kfree(ioc->pd_handles);
kfree(ioc->blocking_handles);
+   kfree(ioc->device_remove_in_progress);
+   kfree(ioc->pend_os_device_add);
kfree(ioc->tm_cmds.reply);
kfree(ioc->transport_cmds.reply);
kfree(ioc->scsih_cmds.reply);
@@ -5457,6 +5474,8 @@ mpt3sas_base_detach(struct MPT3SAS_ADAPTER *ioc)
kfree(ioc->reply_post_host_index);
kfree(ioc->pd_handles);
kfree(ioc->blocking_handles);
+   kfree(ioc->device_remove_in_progress);
+   kfree(ioc->pend_os_device_add);
kfree(ioc->pfacts);
kfree(ioc->ctl_cmds.reply);
kfree(ioc->ctl_cmds.sense);
diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.h 
b/drivers/scsi/mpt3sas/mpt3sas_base.h
index 3e71bc1..4221a4d 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_base.h
+++ b/drivers/scsi/mpt3sas/mpt3sas_base.h
@@ -1079,6 +1079,9 @@ struct MPT3SAS_ADAPTER {
void*pd_handles;
u16 pd_handles_sz;
 
+   void*pend_os_device_add;
+   u16 pend_os_device_add_sz;
+
/* config page */
u16 config_page_sz;
void*config_page;
@@ -1187,6 +1190,8 @@ struct MPT3SAS_ADAPTER {
struct SL_WH_EVENT_TRIGGERS_T diag_trigger_event;
struct SL_WH_SCSI_TRIGGERS_T diag_trigger_scsi;
struct SL_WH_MPI_TRIGGERS_T diag_trigger_mpi;
+   void*device_remove_in_progress;
+   u16 device_remove_in_progress_sz;
 };
 
 typedef u8 (*MPT_CALLBACK)(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 
msix_index,
diff --git a/drivers/scsi/mpt3sas/mpt3sas_ctl.c 
b/drivers/scsi/mpt3sas/mpt3sas_ctl.c
index 26cdc12..de720c9 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_ctl.c
+++ b/drivers/scsi/mpt3sas/mpt3sas_ctl.c
@@ -654,6 +654,7 @@ _ctl_do_mpt_command(struct MPT3SAS_ADAPTER *ioc, struct 
mpt3_ioctl_command karg,
size_t data_in_sz = 0;
long ret;
u16 wait_state_count;
+   u16 device_handle = MPT3SAS_INVALID_DEVICE_HANDLE;
 
issue_reset = 0;
 
@@ -738,10 +739,13 @@ _ctl_do_mpt_command(struct MPT3SAS_ADAPTER *ioc, struct 
mpt3_ioctl_command karg,
data_in_sz = karg.data_in_size;
 
if (mpi_request->Function == MPI2_FUNCTION_SCSI_IO_REQUEST ||
-   mpi_request->Function == MPI2_FUNCTION_RAID_SCSI_IO_PASSTHROUGH) {
-   if (!le16_to_cpu(mpi_request->FunctionDependent1) ||
-   le16_to_cpu(mpi_request->FunctionDependent1) >
-   ioc->facts.MaxDevHandle) {
+   mpi_request->Function == MPI2_FUNCTION_RAID_SCSI_IO_PASSTHROUGH ||
+   mpi_request->Function == MPI2_FUNCTION_SCSI_TASK_MGMT ||
+   mpi_request->Function == MPI2_FUNCTION_SATA_PASSTHROUGH) {
+
+   device_handle = le16_to_cpu(mpi_request->FunctionDependent1);
+   if (!device_handle || (device_handle >
+   ioc->facts.MaxDevHandle)) {
ret = -EINVAL;