mptfusion: schedule_target_reset from all Reset context
Subsystems (2)
PATCH 5/8 mptfusion: schedule_target_reset from all Reset context
Issue:
target reset will be queued to driver's internal queue to get schedule later. When driver add target into internal target_reset queue we will block IOs on those target using scsi midlayer API. Now due to some cause driver is not executing those target_reset list and it is always in block state.
Changes:
now we are clearing target_reset queue from all other Callback context instead of only DeviceReset context.Now wherever driver is clearing taskmgmt_in_progress flag it is considering target_reset queue cleanup also.
Signed-off-by Kashyap Desai <[email protected]>
---
drivers/message/fusion/mptbase.h +2 -0
@@ -580,6 +580,7 @@ struct mptfc_rport_infotypedef void (*MPT_ADD_SGE )(void *pAddr,u32 flagslength,dma_addr_t dma_addr);typedef void (*MPT_ADD_CHAIN )(void *pAddr,u8 next,u16 length,dma_addr_t dma_addr); +typedef void (*MPT_SCHEDULE_TARGET_RESET )(void *ioc);/* * Adapter Structure - pci_dev specific. Maximum: MPT_MAX_ADAPTERS
@@ -738,6 +739,7 @@ typedef struct _MPT_ADAPTERint taskmgmt_in_progress;u8 taskmgmt_quiesce_io;u8 ioc_reset_in_progress; +MPT_SCHEDULE_TARGET_RESET schedule_target_reset;struct work_struct sas_persist_task;struct work_struct fc_setup_reset_work;
drivers/message/fusion/mptctl.c +11 -3
@@ -261,10 +261,16 @@ mptctl_reply(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req, MPT_FRAME_HDR *reply)/* We are done, issue wake up */ if (ioc->ioctl_cmds.status &MPT_MGMT_STATUS_PENDING ) { -if (req->u.hdr.Function ==MPI_FUNCTION_SCSI_TASK_MGMT ) +if (req->u.hdr.Function ==MPI_FUNCTION_SCSI_TASK_MGMT ) {mpt_clear_taskmgmt_in_progress_flag (ioc); - ioc->ioctl_cmds.status &= ~MPT_MGMT_STATUS_PENDING ; -complete (&ioc->ioctl_cmds.done); + ioc->ioctl_cmds.status &= ~MPT_MGMT_STATUS_PENDING ; +complete (&ioc->ioctl_cmds.done); +if (ioc->bus_type ==SAS ) + ioc->schedule_target_reset (ioc); + }else { + ioc->ioctl_cmds.status &= ~MPT_MGMT_STATUS_PENDING ; +complete (&ioc->ioctl_cmds.done); + } } out_continuation:
@@ -298,6 +304,8 @@ mptctl_taskmgmt_reply(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)mpt_clear_taskmgmt_in_progress_flag (ioc); ioc->taskmgmt_cmds.status &= ~MPT_MGMT_STATUS_PENDING ;complete (&ioc->taskmgmt_cmds.done); +if (ioc->bus_type ==SAS ) + ioc->schedule_target_reset (ioc);return 1 ; }return 0 ;
drivers/message/fusion/mptsas.c +41 -18
83 lines not on this page · raw message
drivers/message/fusion/mptscsih.c +2 -0
@@ -2134,6 +2134,8 @@ mptscsih_taskmgmt_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf,mpt_clear_taskmgmt_in_progress_flag (ioc); ioc->taskmgmt_cmds.status &= ~MPT_MGMT_STATUS_PENDING ;complete (&ioc->taskmgmt_cmds.done); +if (ioc->bus_type ==SAS ) + ioc->schedule_target_reset (ioc);return 1 ; }return 0 ;