OSDN Git Service

scsi: mpt3sas: Fix a race condition in mpt3sas_base_hard_reset_handler()
authorBart Van Assche <bart.vanassche@wdc.com>
Fri, 15 Jun 2018 21:41:59 +0000 (14:41 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 20 Jun 2018 02:02:25 +0000 (22:02 -0400)
Since ioc->shost_recovery is set after ioc->reset_in_progress_mutex is
obtained, if concurrent resets are issued there is a short time during
which ioc->reset_in_progress_mutex is locked and ioc->shost_recovery ==
0. Avoid that this can cause trouble by unconditionally locking
ioc->shost_recovery.

Signed-off-by: Bart Van Assche <bart.vanassche@wdc.com>
Cc: Sathya Prakash <sathya.prakash@broadcom.com>
Cc: Chaitra P B <chaitra.basappa@broadcom.com>
Cc: Suganath Prabu Subramani <suganath-prabu.subramani@broadcom.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/mpt3sas/mpt3sas_base.c
drivers/scsi/mpt3sas/mpt3sas_base.h

index 340db9e..107c9b4 100644 (file)
@@ -6959,14 +6959,7 @@ mpt3sas_base_hard_reset_handler(struct MPT3SAS_ADAPTER *ioc,
                mpt3sas_halt_firmware(ioc);
 
        /* wait for an active reset in progress to complete */
-       if (!mutex_trylock(&ioc->reset_in_progress_mutex)) {
-               do {
-                       ssleep(1);
-               } while (ioc->shost_recovery == 1);
-               dtmprintk(ioc, pr_info(MPT3SAS_FMT "%s: exit\n", ioc->name,
-                   __func__));
-               return ioc->ioc_reset_in_progress_status;
-       }
+       mutex_lock(&ioc->reset_in_progress_mutex);
 
        spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags);
        ioc->shost_recovery = 1;
@@ -7015,7 +7008,6 @@ mpt3sas_base_hard_reset_handler(struct MPT3SAS_ADAPTER *ioc,
            ioc->name, __func__, ((r == 0) ? "SUCCESS" : "FAILED")));
 
        spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags);
-       ioc->ioc_reset_in_progress_status = r;
        ioc->shost_recovery = 0;
        spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
        ioc->ioc_reset_count++;
index 247a9e6..f137c51 100644 (file)
@@ -1166,7 +1166,6 @@ struct MPT3SAS_ADAPTER {
        struct mutex    reset_in_progress_mutex;
        spinlock_t      ioc_reset_in_progress_lock;
        u8              ioc_link_reset_in_progress;
-       u8              ioc_reset_in_progress_status;
 
        u8              ignore_loginfos;
        u8              remove_host;