aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/qla2xxx/tcm_qla2xxx.c
diff options
context:
space:
mode:
authorJoern Engel <joern@logfs.org>2014-10-03 17:35:56 -0400
committerNicholas Bellinger <nab@linux-iscsi.org>2014-10-03 17:35:56 -0400
commitf4c24db1b7ad0ce84409e15744d26c6f86a96840 (patch)
tree472122df7a7e6257823d757301cb5bc5667d1f2f /drivers/scsi/qla2xxx/tcm_qla2xxx.c
parentf56574a2b554492703030e3d3b9679c9a07a5d69 (diff)
qla_target: don't delete changed nacls
The code is currently riddled with "drop the hardware_lock to avoid a deadlock" bugs that expose races. One of those races seems to expose a valid warning in tcm_qla2xxx_clear_nacl_from_fcport_map. Add some bandaid to it. Signed-off-by: Joern Engel <joern@logfs.org> Cc: <stable@vger.kernel.org> # v3.5+ Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/scsi/qla2xxx/tcm_qla2xxx.c')
-rw-r--r--drivers/scsi/qla2xxx/tcm_qla2xxx.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/scsi/qla2xxx/tcm_qla2xxx.c b/drivers/scsi/qla2xxx/tcm_qla2xxx.c
index e2beab962096..4747d2c66024 100644
--- a/drivers/scsi/qla2xxx/tcm_qla2xxx.c
+++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.c
@@ -757,7 +757,16 @@ static void tcm_qla2xxx_clear_nacl_from_fcport_map(struct qla_tgt_sess *sess)
757 pr_debug("fc_rport domain: port_id 0x%06x\n", nacl->nport_id); 757 pr_debug("fc_rport domain: port_id 0x%06x\n", nacl->nport_id);
758 758
759 node = btree_remove32(&lport->lport_fcport_map, nacl->nport_id); 759 node = btree_remove32(&lport->lport_fcport_map, nacl->nport_id);
760 WARN_ON(node && (node != se_nacl)); 760 if (WARN_ON(node && (node != se_nacl))) {
761 /*
762 * The nacl no longer matches what we think it should be.
763 * Most likely a new dynamic acl has been added while
764 * someone dropped the hardware lock. It clearly is a
765 * bug elsewhere, but this bit can't make things worse.
766 */
767 btree_insert32(&lport->lport_fcport_map, nacl->nport_id,
768 node, GFP_ATOMIC);
769 }
761 770
762 pr_debug("Removed from fcport_map: %p for WWNN: 0x%016LX, port_id: 0x%06x\n", 771 pr_debug("Removed from fcport_map: %p for WWNN: 0x%016LX, port_id: 0x%06x\n",
763 se_nacl, nacl->nport_wwnn, nacl->nport_id); 772 se_nacl, nacl->nport_wwnn, nacl->nport_id);