From: Hannes Reinecke Date: Tue, 26 Mar 2019 07:38:44 +0000 (-0700) Subject: scsi: qedf: fixup locking in qedf_restart_rport() X-Git-Tag: v5.2-rc1~130^2~176 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6d1368e8f987;p=thirdparty%2Fkernel%2Flinux.git scsi: qedf: fixup locking in qedf_restart_rport() fc_rport_create() needs to be called with disc_mutex held. And we should re-assign the 'rdata' pointer in case it got changed. Signed-off-by: Hannes Reinecke Signed-off-by: Saurav Kashyap Signed-off-by: Martin K. Petersen --- diff --git a/drivers/scsi/qedf/qedf_els.c b/drivers/scsi/qedf/qedf_els.c index ac2bfc26bcdbc..aad1f7c464fd1 100644 --- a/drivers/scsi/qedf/qedf_els.c +++ b/drivers/scsi/qedf/qedf_els.c @@ -380,10 +380,16 @@ void qedf_restart_rport(struct qedf_rport *fcport) QEDF_ERR(&(fcport->qedf->dbg_ctx), "LOGO port_id=%x.\n", port_id); fc_rport_logoff(rdata); + mutex_lock(&lport->disc.disc_mutex); /* Recreate the rport and log back in */ rdata = fc_rport_create(lport, port_id); - if (rdata) + if (rdata) { + mutex_unlock(&lport->disc.disc_mutex); fc_rport_login(rdata); + fcport->rdata = rdata; + } else { + mutex_unlock(&lport->disc.disc_mutex); + } } clear_bit(QEDF_RPORT_IN_RESET, &fcport->flags); }