On 09/24/2015 02:38 PM, Matthew R. Ochs wrote: > diff --git a/drivers/scsi/cxlflash/main.c b/drivers/scsi/cxlflash/main.c > index 3e3ccf1..6e85c77 100644 > --- a/drivers/scsi/cxlflash/main.c > +++ b/drivers/scsi/cxlflash/main.c > @@ -2383,16 +2397,14 @@ static pci_ers_result_t cxlflash_pci_error_detected(struct pci_dev *pdev, > switch (state) { > case pci_channel_io_frozen: > cfg->state = STATE_LIMBO; > - > - /* Turn off legacy I/O */ > scsi_block_requests(cfg->host); > + drain_ioctls(cfg); I don't see this addressing the deadlock with an outstanding read_cap16 during EEH I identified in the previous review. Am I missing something here? > rc = cxlflash_mark_contexts_error(cfg); > if (unlikely(rc)) > dev_err(dev, "%s: Failed to mark user contexts!(%d)\n", > __func__, rc); > term_mc(cfg, UNDO_START); > stop_afu(cfg); > - > return PCI_ERS_RESULT_NEED_RESET; > case pci_channel_io_perm_failure: > cfg->state = STATE_FAILTERM; > diff --git a/drivers/scsi/cxlflash/superpipe.c b/drivers/scsi/cxlflash/superpipe.c > index 28aa9d9..544ef09 100644 > --- a/drivers/scsi/cxlflash/superpipe.c > +++ b/drivers/scsi/cxlflash/superpipe.c > @@ -1214,6 +1214,48 @@ static const struct file_operations null_fops = { > }; > > /** > + * check_state() - checks and responds to the current adapter state > + * @cfg: Internal structure associated with the host. > + * @ioctl: Indicates if on an ioctl thread. > + * > + * This routine can block and should only be used on process context. > + * When blocking on an ioctl thread, the ioctl read semaphore should be > + * let up to allow for draining actively running ioctls. Also note that > + * when waking up from waiting in reset, the state is unknown and must > + * be checked again before proceeding. > + * > + * Return: 0 on success, -errno on failure > + */ > +static int check_state(struct cxlflash_cfg *cfg, bool ioctl) Looks like you missed this cleanup. The second parameter is not needed, since all the callers set it to true. > +{ > + struct device *dev = &cfg->dev->dev; > + int rc = 0; > + > +retry: > + switch (cfg->state) { > + case STATE_LIMBO: > + dev_dbg(dev, "%s: Limbo state, going to wait...\n", __func__); > + if (ioctl) > + up_read(&cfg->ioctl_rwsem); > + rc = wait_event_interruptible(cfg->limbo_waitq, > + cfg->state != STATE_LIMBO); > + if (ioctl) > + down_read(&cfg->ioctl_rwsem); > + if (unlikely(rc)) > + break; > + goto retry; > + case STATE_FAILTERM: > + dev_dbg(dev, "%s: Failed/Terminating!\n", __func__); > + rc = -ENODEV; > + break; > + default: > + break; > + } > + > + return rc; > +} > + > +/** > * cxlflash_disk_attach() - attach a LUN to a context > * @sdev: SCSI device associated with LUN. > * @attach: Attach ioctl data structure. -- Brian King Power Linux I/O IBM Linux Technology Center -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html