mirror of
https://github.com/edk2-porting/linux-next.git
synced 2025-01-14 08:34:02 +08:00
scsi: pmcraid: fix lock imbalance in pmcraid_reset_reload()
sparse found a bug that has always been present since the driver was merged: drivers/scsi/pmcraid.c:2353:12: warning: context imbalance in 'pmcraid_reset_reload' - different lock contexts for basic block Fix this by using a common unlock goto label, and also reduce the indentation level in the function. Signed-off-by: Christoph Hellwig <hch@lst.de> Reported-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
c5ce0abeb6
commit
9140260864
@ -2373,46 +2373,43 @@ static int pmcraid_reset_reload(
|
||||
spin_lock_irqsave(pinstance->host->host_lock, lock_flags);
|
||||
|
||||
if (pinstance->ioa_state == IOA_STATE_DEAD) {
|
||||
spin_unlock_irqrestore(pinstance->host->host_lock,
|
||||
lock_flags);
|
||||
pmcraid_info("reset_reload: IOA is dead\n");
|
||||
return reset;
|
||||
} else if (pinstance->ioa_state == target_state) {
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
if (pinstance->ioa_state == target_state) {
|
||||
reset = 0;
|
||||
goto out_unlock;
|
||||
}
|
||||
}
|
||||
|
||||
if (reset) {
|
||||
pmcraid_info("reset_reload: proceeding with reset\n");
|
||||
scsi_block_requests(pinstance->host);
|
||||
reset_cmd = pmcraid_get_free_cmd(pinstance);
|
||||
|
||||
if (reset_cmd == NULL) {
|
||||
pmcraid_err("no free cmnd for reset_reload\n");
|
||||
spin_unlock_irqrestore(pinstance->host->host_lock,
|
||||
lock_flags);
|
||||
return reset;
|
||||
}
|
||||
|
||||
if (shutdown_type == SHUTDOWN_NORMAL)
|
||||
pinstance->ioa_bringdown = 1;
|
||||
|
||||
pinstance->ioa_shutdown_type = shutdown_type;
|
||||
pinstance->reset_cmd = reset_cmd;
|
||||
pinstance->force_ioa_reset = reset;
|
||||
pmcraid_info("reset_reload: initiating reset\n");
|
||||
pmcraid_ioa_reset(reset_cmd);
|
||||
spin_unlock_irqrestore(pinstance->host->host_lock, lock_flags);
|
||||
pmcraid_info("reset_reload: waiting for reset to complete\n");
|
||||
wait_event(pinstance->reset_wait_q,
|
||||
!pinstance->ioa_reset_in_progress);
|
||||
|
||||
pmcraid_info("reset_reload: reset is complete !!\n");
|
||||
scsi_unblock_requests(pinstance->host);
|
||||
if (pinstance->ioa_state == target_state)
|
||||
reset = 0;
|
||||
pmcraid_info("reset_reload: proceeding with reset\n");
|
||||
scsi_block_requests(pinstance->host);
|
||||
reset_cmd = pmcraid_get_free_cmd(pinstance);
|
||||
if (reset_cmd == NULL) {
|
||||
pmcraid_err("no free cmnd for reset_reload\n");
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
if (shutdown_type == SHUTDOWN_NORMAL)
|
||||
pinstance->ioa_bringdown = 1;
|
||||
|
||||
pinstance->ioa_shutdown_type = shutdown_type;
|
||||
pinstance->reset_cmd = reset_cmd;
|
||||
pinstance->force_ioa_reset = reset;
|
||||
pmcraid_info("reset_reload: initiating reset\n");
|
||||
pmcraid_ioa_reset(reset_cmd);
|
||||
spin_unlock_irqrestore(pinstance->host->host_lock, lock_flags);
|
||||
pmcraid_info("reset_reload: waiting for reset to complete\n");
|
||||
wait_event(pinstance->reset_wait_q,
|
||||
!pinstance->ioa_reset_in_progress);
|
||||
|
||||
pmcraid_info("reset_reload: reset is complete !!\n");
|
||||
scsi_unblock_requests(pinstance->host);
|
||||
return pinstance->ioa_state != target_state;
|
||||
|
||||
out_unlock:
|
||||
spin_unlock_irqrestore(pinstance->host->host_lock, lock_flags);
|
||||
return reset;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user