lkml.org 
[lkml]   [2018]   [Sep]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 150/173] scsi: libfc: fixup sleeping function called from invalid context
    Date
    4.14-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Hannes Reinecke <hare@suse.de>

    [ Upstream commit fa519f701d27198a2858bb108fc18ea9d8c106a7 ]

    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>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/scsi/libfc/fc_disc.c | 7 ++++---
    1 file changed, 4 insertions(+), 3 deletions(-)

    --- a/drivers/scsi/libfc/fc_disc.c
    +++ b/drivers/scsi/libfc/fc_disc.c
    @@ -294,9 +294,11 @@ static void fc_disc_done(struct fc_disc
    * 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) {
    @@ -307,7 +309,6 @@ static void fc_disc_done(struct fc_disc
    }
    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);

    \
     
     \ /
      Last update: 2018-09-24 14:53    [W:4.322 / U:0.740 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site