]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
scsi: libfc: fixup 'sleeping function called from invalid context'
authorHannes Reinecke <hare@suse.de>
Wed, 4 Jul 2018 11:59:16 +0000 (13:59 +0200)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 11 Jul 2018 02:42:47 +0000 (22:42 -0400)
fc_rport_login() will be calling mutex_lock() while running inside an
RCU-protected section, triggering the warning 'sleeping function called
from invalid context'.  To fix this we can drop the rcu functions here
altogether as the disc mutex protecting the list itself is already held,
preventing any list manipulation.

Fixes: a407c593398c ("scsi: libfc: Fixup disc_mutex handling")
Signed-off-by: Hannes Reinecke <hare@suse.com>
Acked-by: Johannes Thumshirn <jth@kernel.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/libfc/fc_disc.c

index 6125df787200854a69da676a7ce922da42d16e31..c1756b9b3ea55f5791102b27c52a7d82b7d126cd 100644 (file)
@@ -287,9 +287,11 @@ static void fc_disc_done(struct fc_disc *disc, enum fc_disc_event event)
         * discovery, reverify or log them in.  Otherwise, log them out.
         * Skip ports which were never discovered.  These are the dNS port
         * and ports which were created by PLOGI.
+        *
+        * We don't need to use the _rcu variant here as the rport list
+        * is protected by the disc mutex which is already held on entry.
         */
-       rcu_read_lock();
-       list_for_each_entry_rcu(rdata, &disc->rports, peers) {
+       list_for_each_entry(rdata, &disc->rports, peers) {
                if (!kref_get_unless_zero(&rdata->kref))
                        continue;
                if (rdata->disc_id) {
@@ -300,7 +302,6 @@ static void fc_disc_done(struct fc_disc *disc, enum fc_disc_event event)
                }
                kref_put(&rdata->kref, fc_rport_destroy);
        }
-       rcu_read_unlock();
        mutex_unlock(&disc->disc_mutex);
        disc->disc_callback(lport, event);
        mutex_lock(&disc->disc_mutex);