From: Greg KH <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@kernel.org
Cc: stable-review@kernel.org, torvalds@linux-foundation.org,
akpm@linux-foundation.org, alan@lxorguk.ukuu.org.uk,
Kashyap Desai <kashyap.desai@lsi.com>,
James Bottomley <James.Bottomley@suse.de>
Subject: [patch 03/45] [SCSI] mpt2sas: Prevent sending command to FW while Host Reset
Date: Wed, 16 Sep 2009 15:36:16 -0700 [thread overview]
Message-ID: <20090916223713.647767294@mini.kroah.org> (raw)
In-Reply-To: <20090916223739.GA4789@kroah.com>
[-- Attachment #1: mpt2sas-prevent-sending-command-to-fw-while-host-reset.patch --]
[-- Type: text/plain, Size: 11946 bytes --]
2.6.31-stable review patch. If anyone has any objections, please let us know.
------------------
From: Kashyap, Desai <kashyap.desai@lsi.com>
commit 155dd4c763694222c125e65438d823f58ea653bc upstream.
This patch renames the flag for indicating host reset from
ioc_reset_in_progress to shost_recovery. It also removes the spin locks
surrounding the setting of this flag, which are unnecessary. Sanity checks on
the shost_recovery flag were added thru out the code so as to prevent sending
firmware commands during host reset. Also, the setting of the shost state to
SHOST_RECOVERY was removed to prevent deadlocks, this is actually better
handled by the shost_recovery flag.
Signed-off-by: Kashyap Desai <kashyap.desai@lsi.com>
Reviewed-by: Eric Moore <Eric.moore@lsi.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/scsi/mpt2sas/mpt2sas_base.c | 13 ++--------
drivers/scsi/mpt2sas/mpt2sas_base.h | 3 --
drivers/scsi/mpt2sas/mpt2sas_ctl.c | 16 +-----------
drivers/scsi/mpt2sas/mpt2sas_scsih.c | 40 ++++++++++++++++++-------------
drivers/scsi/mpt2sas/mpt2sas_transport.c | 29 +++++++++++++---------
5 files changed, 47 insertions(+), 54 deletions(-)
--- a/drivers/scsi/mpt2sas/mpt2sas_base.c
+++ b/drivers/scsi/mpt2sas/mpt2sas_base.c
@@ -94,7 +94,7 @@ _base_fault_reset_work(struct work_struc
int rc;
spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags);
- if (ioc->ioc_reset_in_progress)
+ if (ioc->shost_recovery)
goto rearm_timer;
spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
@@ -3501,20 +3501,13 @@ mpt2sas_base_hard_reset_handler(struct M
__func__));
spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags);
- if (ioc->ioc_reset_in_progress) {
+ if (ioc->shost_recovery) {
spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
printk(MPT2SAS_ERR_FMT "%s: busy\n",
ioc->name, __func__);
return -EBUSY;
}
- ioc->ioc_reset_in_progress = 1;
ioc->shost_recovery = 1;
- if (ioc->shost->shost_state == SHOST_RUNNING) {
- /* set back to SHOST_RUNNING in mpt2sas_scsih.c */
- scsi_host_set_state(ioc->shost, SHOST_RECOVERY);
- printk(MPT2SAS_INFO_FMT "putting controller into "
- "SHOST_RECOVERY\n", ioc->name);
- }
spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
_base_reset_handler(ioc, MPT2_IOC_PRE_RESET);
@@ -3534,7 +3527,7 @@ mpt2sas_base_hard_reset_handler(struct M
ioc->name, __func__, ((r == 0) ? "SUCCESS" : "FAILED")));
spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags);
- ioc->ioc_reset_in_progress = 0;
+ ioc->shost_recovery = 0;
spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
if (!r)
--- a/drivers/scsi/mpt2sas/mpt2sas_base.h
+++ b/drivers/scsi/mpt2sas/mpt2sas_base.h
@@ -432,7 +432,7 @@ typedef void (*MPT_ADD_SGE)(void *paddr,
* @fw_event_list: list of fw events
* @aen_event_read_flag: event log was read
* @broadcast_aen_busy: broadcast aen waiting to be serviced
- * @ioc_reset_in_progress: host reset in progress
+ * @shost_recovery: host reset in progress
* @ioc_reset_in_progress_lock:
* @ioc_link_reset_in_progress: phy/hard reset in progress
* @ignore_loginfos: ignore loginfos during task managment
@@ -545,7 +545,6 @@ struct MPT2SAS_ADAPTER {
/* misc flags */
int aen_event_read_flag;
u8 broadcast_aen_busy;
- u8 ioc_reset_in_progress;
u8 shost_recovery;
spinlock_t ioc_reset_in_progress_lock;
u8 ioc_link_reset_in_progress;
--- a/drivers/scsi/mpt2sas/mpt2sas_ctl.c
+++ b/drivers/scsi/mpt2sas/mpt2sas_ctl.c
@@ -1963,7 +1963,6 @@ _ctl_ioctl_main(struct file *file, unsig
{
enum block_state state;
long ret = -EINVAL;
- unsigned long flags;
state = (file->f_flags & O_NONBLOCK) ? NON_BLOCKING :
BLOCKING;
@@ -1989,13 +1988,8 @@ _ctl_ioctl_main(struct file *file, unsig
!ioc)
return -ENODEV;
- spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags);
- if (ioc->shost_recovery) {
- spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock,
- flags);
+ if (ioc->shost_recovery)
return -EAGAIN;
- }
- spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
if (_IOC_SIZE(cmd) == sizeof(struct mpt2_ioctl_command)) {
uarg = arg;
@@ -2098,7 +2092,6 @@ _ctl_compat_mpt_command(struct file *fil
struct mpt2_ioctl_command karg;
struct MPT2SAS_ADAPTER *ioc;
enum block_state state;
- unsigned long flags;
if (_IOC_SIZE(cmd) != sizeof(struct mpt2_ioctl_command32))
return -EINVAL;
@@ -2113,13 +2106,8 @@ _ctl_compat_mpt_command(struct file *fil
if (_ctl_verify_adapter(karg32.hdr.ioc_number, &ioc) == -1 || !ioc)
return -ENODEV;
- spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags);
- if (ioc->shost_recovery) {
- spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock,
- flags);
+ if (ioc->shost_recovery)
return -EAGAIN;
- }
- spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
memset(&karg, 0, sizeof(struct mpt2_ioctl_command));
karg.hdr.ioc_number = karg32.hdr.ioc_number;
--- a/drivers/scsi/mpt2sas/mpt2sas_scsih.c
+++ b/drivers/scsi/mpt2sas/mpt2sas_scsih.c
@@ -1785,17 +1785,18 @@ mpt2sas_scsih_issue_tm(struct MPT2SAS_AD
u32 ioc_state;
unsigned long timeleft;
u8 VF_ID = 0;
- unsigned long flags;
- spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags);
- if (ioc->tm_cmds.status != MPT2_CMD_NOT_USED ||
- ioc->shost_recovery) {
- spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
+ if (ioc->tm_cmds.status != MPT2_CMD_NOT_USED) {
+ printk(MPT2SAS_INFO_FMT "%s: tm_cmd busy!!!\n",
+ __func__, ioc->name);
+ return;
+ }
+
+ if (ioc->shost_recovery) {
printk(MPT2SAS_INFO_FMT "%s: host reset in progress!\n",
__func__, ioc->name);
return;
}
- spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
ioc_state = mpt2sas_base_get_iocstate(ioc, 0);
if (ioc_state & MPI2_DOORBELL_USED) {
@@ -2553,7 +2554,6 @@ _scsih_qcmd(struct scsi_cmnd *scmd, void
Mpi2SCSIIORequest_t *mpi_request;
u32 mpi_control;
u16 smid;
- unsigned long flags;
scmd->scsi_done = done;
sas_device_priv_data = scmd->device->hostdata;
@@ -2572,13 +2572,10 @@ _scsih_qcmd(struct scsi_cmnd *scmd, void
}
/* see if we are busy with task managment stuff */
- spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags);
- if (sas_target_priv_data->tm_busy ||
- ioc->shost_recovery || ioc->ioc_link_reset_in_progress) {
- spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
+ if (sas_target_priv_data->tm_busy)
+ return SCSI_MLQUEUE_DEVICE_BUSY;
+ else if (ioc->shost_recovery || ioc->ioc_link_reset_in_progress)
return SCSI_MLQUEUE_HOST_BUSY;
- }
- spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
if (scmd->sc_data_direction == DMA_FROM_DEVICE)
mpi_control = MPI2_SCSIIO_CONTROL_READ;
@@ -3374,6 +3371,9 @@ _scsih_expander_add(struct MPT2SAS_ADAPT
if (!handle)
return -1;
+ if (ioc->shost_recovery)
+ return -1;
+
if ((mpt2sas_config_get_expander_pg0(ioc, &mpi_reply, &expander_pg0,
MPI2_SAS_EXPAND_PGAD_FORM_HNDL, handle))) {
printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n",
@@ -3510,6 +3510,9 @@ _scsih_expander_remove(struct MPT2SAS_AD
struct _sas_node *sas_expander;
unsigned long flags;
+ if (ioc->shost_recovery)
+ return;
+
spin_lock_irqsave(&ioc->sas_node_lock, flags);
sas_expander = mpt2sas_scsih_expander_find_by_handle(ioc, handle);
spin_unlock_irqrestore(&ioc->sas_node_lock, flags);
@@ -3681,6 +3684,8 @@ _scsih_remove_device(struct MPT2SAS_ADAP
mutex_unlock(&ioc->tm_cmds.mutex);
dewtprintk(ioc, printk(MPT2SAS_INFO_FMT "issue target reset "
"done: handle(0x%04x)\n", ioc->name, device_handle));
+ if (ioc->shost_recovery)
+ goto out;
}
/* SAS_IO_UNIT_CNTR - send REMOVE_DEVICE */
@@ -3846,6 +3851,8 @@ _scsih_sas_topology_change_event(struct
"expander event\n", ioc->name));
return;
}
+ if (ioc->shost_recovery)
+ return;
if (event_data->PHY[i].PhyStatus &
MPI2_EVENT_SAS_TOPO_PHYSTATUS_VACANT)
continue;
@@ -5217,13 +5224,10 @@ _firmware_event_work(struct work_struct
}
spin_unlock_irqrestore(&ioc->fw_event_lock, flags);
- spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags);
if (ioc->shost_recovery) {
- spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
_scsih_fw_event_requeue(ioc, fw_event, 1000);
return;
}
- spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
switch (fw_event->event) {
case MPI2_EVENT_SAS_TOPOLOGY_CHANGE_LIST:
@@ -5425,6 +5429,8 @@ _scsih_expander_node_remove(struct MPT2S
if (!sas_device)
continue;
_scsih_remove_device(ioc, sas_device->handle);
+ if (ioc->shost_recovery)
+ return;
goto retry_device_search;
}
}
@@ -5446,6 +5452,8 @@ _scsih_expander_node_remove(struct MPT2S
if (!expander_sibling)
continue;
_scsih_expander_remove(ioc, expander_sibling->handle);
+ if (ioc->shost_recovery)
+ return;
goto retry_expander_search;
}
}
--- a/drivers/scsi/mpt2sas/mpt2sas_transport.c
+++ b/drivers/scsi/mpt2sas/mpt2sas_transport.c
@@ -140,11 +140,18 @@ _transport_set_identify(struct MPT2SAS_A
u32 device_info;
u32 ioc_status;
+ if (ioc->shost_recovery) {
+ printk(MPT2SAS_INFO_FMT "%s: host reset in progress!\n",
+ __func__, ioc->name);
+ return -EFAULT;
+ }
+
if ((mpt2sas_config_get_sas_device_pg0(ioc, &mpi_reply, &sas_device_pg0,
MPI2_SAS_DEVICE_PGAD_FORM_HANDLE, handle))) {
printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n",
+
ioc->name, __FILE__, __LINE__, __func__);
- return -1;
+ return -ENXIO;
}
ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
@@ -153,7 +160,7 @@ _transport_set_identify(struct MPT2SAS_A
printk(MPT2SAS_ERR_FMT "handle(0x%04x), ioc_status(0x%04x)"
"\nfailure at %s:%d/%s()!\n", ioc->name, handle, ioc_status,
__FILE__, __LINE__, __func__);
- return -1;
+ return -EIO;
}
memset(identify, 0, sizeof(identify));
@@ -288,21 +295,17 @@ _transport_expander_report_manufacture(s
void *psge;
u32 sgl_flags;
u8 issue_reset = 0;
- unsigned long flags;
void *data_out = NULL;
dma_addr_t data_out_dma;
u32 sz;
u64 *sas_address_le;
u16 wait_state_count;
- spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags);
- if (ioc->ioc_reset_in_progress) {
- spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
+ if (ioc->shost_recovery) {
printk(MPT2SAS_INFO_FMT "%s: host reset in progress!\n",
__func__, ioc->name);
return -EFAULT;
}
- spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
mutex_lock(&ioc->transport_cmds.mutex);
@@ -806,6 +809,12 @@ mpt2sas_transport_update_phy_link_change
struct _sas_node *sas_node;
struct _sas_phy *mpt2sas_phy;
+ if (ioc->shost_recovery) {
+ printk(MPT2SAS_INFO_FMT "%s: host reset in progress!\n",
+ __func__, ioc->name);
+ return;
+ }
+
spin_lock_irqsave(&ioc->sas_node_lock, flags);
sas_node = _transport_sas_node_find_by_handle(ioc, handle);
spin_unlock_irqrestore(&ioc->sas_node_lock, flags);
@@ -1025,7 +1034,6 @@ _transport_smp_handler(struct Scsi_Host
void *psge;
u32 sgl_flags;
u8 issue_reset = 0;
- unsigned long flags;
dma_addr_t dma_addr_in = 0;
dma_addr_t dma_addr_out = 0;
u16 wait_state_count;
@@ -1045,14 +1053,11 @@ _transport_smp_handler(struct Scsi_Host
return -EINVAL;
}
- spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags);
- if (ioc->ioc_reset_in_progress) {
- spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
+ if (ioc->shost_recovery) {
printk(MPT2SAS_INFO_FMT "%s: host reset in progress!\n",
__func__, ioc->name);
return -EFAULT;
}
- spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
rc = mutex_lock_interruptible(&ioc->transport_cmds.mutex);
if (rc)
next prev parent reply other threads:[~2009-09-16 22:48 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20090916223613.597295240@mini.kroah.org>
2009-09-16 22:37 ` [patch 00/45] 2.6.31.1-stable review Greg KH
2009-09-16 22:36 ` [patch 01/45] [SCSI] sg: fix oops in the error path in sg_build_indirect() Greg KH
2009-09-16 22:36 ` [patch 02/45] [SCSI] mpt2sas : Rescan topology from Interrupt context instead of work thread Greg KH
2009-09-16 22:36 ` Greg KH [this message]
2009-09-16 22:36 ` [patch 04/45] [SCSI] mpt2sas: setting SDEV into RUNNING state from Interrupt context Greg KH
2009-09-16 22:36 ` [patch 05/45] [SCSI] mpt2sas: Raid 10 Volume is showing as Raid 1E in dmesg Greg KH
2009-09-16 22:36 ` [patch 06/45] SCSI: fix oops during scsi scanning Greg KH
2009-09-16 22:36 ` [patch 07/45] SCSI: libsrp: fix memory leak in srp_ring_free() Greg KH
2009-09-16 22:36 ` [patch 08/45] cfg80211: fix looping soft lockup in find_ie() Greg KH
2009-09-16 22:36 ` [patch 09/45] ath5k: write PCU registers on initial reset Greg KH
2009-09-16 22:36 ` [patch 10/45] binfmt_elf: fix PT_INTERP bss handling Greg KH
2009-09-16 22:36 ` [patch 11/45] TPM: Fixup boot probe timeout for tpm_tis driver Greg KH
2009-09-16 22:36 ` [patch 12/45] md: Fix "strchr" [drivers/md/dm-log-userspace.ko] undefined! Greg KH
2009-09-16 22:36 ` [patch 13/45] x86/amd-iommu: fix broken check in amd_iommu_flush_all_devices Greg KH
2009-09-16 22:36 ` [patch 14/45] fix undefined reference to user_shm_unlock Greg KH
2009-09-16 22:36 ` [patch 15/45] perf_counter: Fix buffer overflow in perf_copy_attr() Greg KH
2009-09-16 22:36 ` [patch 16/45] perf_counter: Start counting time enabled when group leader gets enabled Greg KH
2009-09-16 22:36 ` [patch 17/45] powerpc/perf_counters: Reduce stack usage of power_check_constraints Greg KH
2009-09-16 22:36 ` [patch 18/45] powerpc: Fix bug where perf_counters breaks oprofile Greg KH
2009-09-16 22:36 ` [patch 19/45] powerpc/ps3: Workaround for flash memory I/O error Greg KH
2009-09-16 22:36 ` [patch 20/45] block: dont assume device has a request list backing in nr_requests store Greg KH
2009-09-16 22:36 ` [patch 21/45] agp/intel: remove restore in resume Greg KH
2009-09-16 22:36 ` [patch 22/45] ALSA: cs46xx - Fix minimum period size Greg KH
2009-09-16 22:36 ` [patch 23/45] ASoC: Fix WM835x Out4 capture enumeration Greg KH
2009-09-16 22:36 ` [patch 24/45] sound: oxygen: work around MCE when changing volume Greg KH
2009-09-16 22:36 ` [patch 25/45] mlx4_core: Allocate and map sufficient ICM memory for EQ context Greg KH
2009-09-16 22:36 ` [patch 26/45] perf stat: Change noise calculation to use stddev Greg KH
2009-09-16 22:36 ` [patch 27/45] x86: Fix x86_model test in es7000_apic_is_cluster() Greg KH
2009-09-16 22:36 ` [patch 28/45] x86/i386: Make sure stack-protector segment base is cache aligned Greg KH
2009-09-16 22:36 ` [patch 29/45] PCI: apply nv_msi_ht_cap_quirk on resume too Greg KH
2009-09-16 22:36 ` [patch 30/45] x86, pat: Fix cacheflush address in change_page_attr_set_clr() Greg KH
2009-09-16 22:36 ` [patch 31/45] ARM: 5691/1: fix cache aliasing issues between kmap() and kmap_atomic() with highmem Greg KH
2009-09-16 22:36 ` [patch 32/45] KVM guest: do not batch pte updates from interrupt context Greg KH
2009-09-16 22:36 ` [patch 33/45] KVM: Fix coalesced interrupt reporting in IOAPIC Greg KH
2009-09-16 22:36 ` [patch 34/45] KVM: VMX: Check cpl before emulating debug register access Greg KH
2009-09-16 22:36 ` [patch 35/45] KVM guest: fix bogus wallclock physical address calculation Greg KH
2009-09-16 22:36 ` [patch 36/45] KVM: x86: Disallow hypercalls for guest callers in rings > 0 Greg KH
2009-09-16 22:36 ` [patch 37/45] KVM: VMX: Fix cr8 exiting control clobbering by EPT Greg KH
2009-09-16 22:36 ` [patch 38/45] KVM: x86 emulator: Implement zero-extended immediate decoding Greg KH
2009-09-16 22:36 ` [patch 39/45] KVM: MMU: make __kvm_mmu_free_some_pages handle empty list Greg KH
2009-09-16 22:36 ` [patch 40/45] KVM: x86 emulator: fix jmp far decoding (opcode 0xea) Greg KH
2009-09-16 22:36 ` [patch 41/45] KVM: limit lapic periodic timer frequency Greg KH
2009-09-16 22:36 ` [patch 42/45] libata: fix off-by-one error in ata_tf_read_block() Greg KH
2009-09-16 22:36 ` [patch 43/45] PCI quirk: update 82576 device ids in SR-IOV quirks list Greg KH
2009-09-16 22:36 ` [patch 44/45] PCI: Unhide the SMBus on the Compaq Evo D510 USDT Greg KH
2009-09-17 7:58 ` Jean Delvare
2009-09-17 11:38 ` [stable] " Greg KH
2009-09-17 13:09 ` Jean Delvare
2009-09-17 13:26 ` Greg KH
2009-09-16 22:36 ` [patch 45/45] powerpc/pseries: Fix to handle slb resize across migration Greg KH
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20090916223713.647767294@mini.kroah.org \
--to=gregkh@suse.de \
--cc=James.Bottomley@suse.de \
--cc=akpm@linux-foundation.org \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=kashyap.desai@lsi.com \
--cc=linux-kernel@vger.kernel.org \
--cc=stable-review@kernel.org \
--cc=stable@kernel.org \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox