]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
scsi: libfc: Fixup disc_mutex handling
authorHannes Reinecke <hare@suse.de>
Fri, 30 Sep 2016 09:01:15 +0000 (11:01 +0200)
committerBrian Maly <brian.maly@oracle.com>
Sun, 12 May 2019 01:51:44 +0000 (21:51 -0400)
The list of attached 'rdata' remote port structures is RCU
protected, so there is no need to take the 'disc_mutex' when
traversing it.
Rather we should be using rcu_read_lock() and kref_get_unless_zero()
to validate the entries.
We need, however, take the disc_mutex when deleting an entry;
otherwise we risk clashes with list_add.

Orabug: 25933179

Reviewed-by: John Sobecki <john.sobecki@oracle.com>
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>
Signed-off-by: Rajan Shanmugavelu <rajan.shanmugavelu@oracle.com>
Signed-off-by: Brian Maly <brian.maly@oracle.com>
drivers/scsi/libfc/fc_rport.c

index 4ec896e42120151ce103e79c93756452386663ce..a0ceba10c679c4e15c92b5b4c30960b0f22ffe11 100644 (file)
@@ -378,7 +378,9 @@ static void fc_rport_work(struct work_struct *work)
                                mutex_unlock(&rdata->rp_mutex);
                        } else {
                                FC_RPORT_DBG(rdata, "work delete\n");
+                               mutex_lock(&lport->disc.disc_mutex);
                                list_del_rcu(&rdata->peers);
+                               mutex_unlock(&lport->disc.disc_mutex);
                                mutex_unlock(&rdata->rp_mutex);
                                kref_put(&rdata->kref, lport->tt.rport_destroy);
                        }