]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - drivers/scsi/ipr.c
UBUNTU: Ubuntu-4.13.0-45.50
[mirror_ubuntu-artful-kernel.git] / drivers / scsi / ipr.c
index b0c68d24db011ba9465dd31a41c05acd4f13c283..f838bd73befa8f3b2fe915b8bbbe1990c563de1f 100644 (file)
@@ -3351,6 +3351,16 @@ static void ipr_worker_thread(struct work_struct *work)
                return;
        }
 
+       if (ioa_cfg->scsi_unblock) {
+               ioa_cfg->scsi_unblock = 0;
+               ioa_cfg->scsi_blocked = 0;
+               spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+               scsi_unblock_requests(ioa_cfg->host);
+               spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+               if (ioa_cfg->scsi_blocked)
+                       scsi_block_requests(ioa_cfg->host);
+       }
+
        if (!ioa_cfg->scan_enabled) {
                spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
                return;
@@ -4935,6 +4945,7 @@ static int ipr_slave_configure(struct scsi_device *sdev)
                }
                if (ipr_is_vset_device(res)) {
                        sdev->scsi_level = SCSI_SPC_3;
+                       sdev->no_report_opcodes = 1;
                        blk_queue_rq_timeout(sdev->request_queue,
                                             IPR_VSET_RW_TIMEOUT);
                        blk_queue_max_hw_sectors(sdev->request_queue, IPR_VSET_MAX_SECTORS);
@@ -7211,9 +7222,8 @@ static int ipr_ioa_bringdown_done(struct ipr_cmnd *ipr_cmd)
        ENTER;
        if (!ioa_cfg->hrrq[IPR_INIT_HRRQ].removing_ioa) {
                ipr_trace;
-               spin_unlock_irq(ioa_cfg->host->host_lock);
-               scsi_unblock_requests(ioa_cfg->host);
-               spin_lock_irq(ioa_cfg->host->host_lock);
+               ioa_cfg->scsi_unblock = 1;
+               schedule_work(&ioa_cfg->work_q);
        }
 
        ioa_cfg->in_reset_reload = 0;
@@ -7287,13 +7297,7 @@ static int ipr_ioa_reset_done(struct ipr_cmnd *ipr_cmd)
        list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
        wake_up_all(&ioa_cfg->reset_wait_q);
 
-       spin_unlock(ioa_cfg->host->host_lock);
-       scsi_unblock_requests(ioa_cfg->host);
-       spin_lock(ioa_cfg->host->host_lock);
-
-       if (!ioa_cfg->hrrq[IPR_INIT_HRRQ].allow_cmds)
-               scsi_block_requests(ioa_cfg->host);
-
+       ioa_cfg->scsi_unblock = 1;
        schedule_work(&ioa_cfg->work_q);
        LEAVE;
        return IPR_RC_JOB_RETURN;
@@ -9249,8 +9253,11 @@ static void _ipr_initiate_ioa_reset(struct ipr_ioa_cfg *ioa_cfg,
                spin_unlock(&ioa_cfg->hrrq[i]._lock);
        }
        wmb();
-       if (!ioa_cfg->hrrq[IPR_INIT_HRRQ].removing_ioa)
+       if (!ioa_cfg->hrrq[IPR_INIT_HRRQ].removing_ioa) {
+               ioa_cfg->scsi_unblock = 0;
+               ioa_cfg->scsi_blocked = 1;
                scsi_block_requests(ioa_cfg->host);
+       }
 
        ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg);
        ioa_cfg->reset_cmd = ipr_cmd;
@@ -9306,9 +9313,8 @@ static void ipr_initiate_ioa_reset(struct ipr_ioa_cfg *ioa_cfg,
                        wake_up_all(&ioa_cfg->reset_wait_q);
 
                        if (!ioa_cfg->hrrq[IPR_INIT_HRRQ].removing_ioa) {
-                               spin_unlock_irq(ioa_cfg->host->host_lock);
-                               scsi_unblock_requests(ioa_cfg->host);
-                               spin_lock_irq(ioa_cfg->host->host_lock);
+                               ioa_cfg->scsi_unblock = 1;
+                               schedule_work(&ioa_cfg->work_q);
                        }
                        return;
                } else {