aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/scsi/qla2xxx/qla_target.c56
-rw-r--r--drivers/scsi/qla2xxx/qla_target.h4
-rw-r--r--drivers/scsi/qla2xxx/tcm_qla2xxx.c39
3 files changed, 35 insertions, 64 deletions
diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c
index 8a44d1541eb4..ca39deb4ff5b 100644
--- a/drivers/scsi/qla2xxx/qla_target.c
+++ b/drivers/scsi/qla2xxx/qla_target.c
@@ -637,8 +637,10 @@ static void qlt_free_session_done(struct work_struct *work)
637} 637}
638 638
639/* ha->tgt.sess_lock supposed to be held on entry */ 639/* ha->tgt.sess_lock supposed to be held on entry */
640void qlt_unreg_sess(struct qla_tgt_sess *sess) 640static void qlt_release_session(struct kref *kref)
641{ 641{
642 struct qla_tgt_sess *sess =
643 container_of(kref, struct qla_tgt_sess, sess_kref);
642 struct scsi_qla_host *vha = sess->vha; 644 struct scsi_qla_host *vha = sess->vha;
643 645
644 if (sess->se_sess) 646 if (sess->se_sess)
@@ -651,8 +653,16 @@ void qlt_unreg_sess(struct qla_tgt_sess *sess)
651 INIT_WORK(&sess->free_work, qlt_free_session_done); 653 INIT_WORK(&sess->free_work, qlt_free_session_done);
652 schedule_work(&sess->free_work); 654 schedule_work(&sess->free_work);
653} 655}
654EXPORT_SYMBOL(qlt_unreg_sess);
655 656
657void qlt_put_sess(struct qla_tgt_sess *sess)
658{
659 if (!sess)
660 return;
661
662 assert_spin_locked(&sess->vha->hw->tgt.sess_lock);
663 kref_put(&sess->sess_kref, qlt_release_session);
664}
665EXPORT_SYMBOL(qlt_put_sess);
656 666
657static int qlt_reset(struct scsi_qla_host *vha, void *iocb, int mcmd) 667static int qlt_reset(struct scsi_qla_host *vha, void *iocb, int mcmd)
658{ 668{
@@ -857,12 +867,9 @@ static void qlt_del_sess_work_fn(struct delayed_work *work)
857 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf004, 867 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf004,
858 "Timeout: sess %p about to be deleted\n", 868 "Timeout: sess %p about to be deleted\n",
859 sess); 869 sess);
860 if (sess->se_sess) { 870 if (sess->se_sess)
861 ha->tgt.tgt_ops->shutdown_sess(sess); 871 ha->tgt.tgt_ops->shutdown_sess(sess);
862 ha->tgt.tgt_ops->put_sess(sess); 872 qlt_put_sess(sess);
863 } else {
864 qlt_unreg_sess(sess);
865 }
866 } else { 873 } else {
867 schedule_delayed_work(&tgt->sess_del_work, 874 schedule_delayed_work(&tgt->sess_del_work,
868 sess->expires - elapsed); 875 sess->expires - elapsed);
@@ -917,7 +924,7 @@ static struct qla_tgt_sess *qlt_create_sess(
917 } 924 }
918 } 925 }
919 926
920 kref_get(&sess->se_sess->sess_kref); 927 kref_get(&sess->sess_kref);
921 ha->tgt.tgt_ops->update_sess(sess, fcport->d_id, fcport->loop_id, 928 ha->tgt.tgt_ops->update_sess(sess, fcport->d_id, fcport->loop_id,
922 (fcport->flags & FCF_CONF_COMP_SUPPORTED)); 929 (fcport->flags & FCF_CONF_COMP_SUPPORTED));
923 930
@@ -947,6 +954,7 @@ static struct qla_tgt_sess *qlt_create_sess(
947 sess->s_id = fcport->d_id; 954 sess->s_id = fcport->d_id;
948 sess->loop_id = fcport->loop_id; 955 sess->loop_id = fcport->loop_id;
949 sess->local = local; 956 sess->local = local;
957 kref_init(&sess->sess_kref);
950 INIT_LIST_HEAD(&sess->del_list_entry); 958 INIT_LIST_HEAD(&sess->del_list_entry);
951 959
952 /* Under normal circumstances we want to logout from firmware when 960 /* Under normal circumstances we want to logout from firmware when
@@ -991,7 +999,7 @@ static struct qla_tgt_sess *qlt_create_sess(
991 * Take an extra reference to ->sess_kref here to handle qla_tgt_sess 999 * Take an extra reference to ->sess_kref here to handle qla_tgt_sess
992 * access across ->tgt.sess_lock reaquire. 1000 * access across ->tgt.sess_lock reaquire.
993 */ 1001 */
994 kref_get(&sess->se_sess->sess_kref); 1002 kref_get(&sess->sess_kref);
995 } 1003 }
996 1004
997 return sess; 1005 return sess;
@@ -1035,7 +1043,7 @@ void qlt_fc_port_added(struct scsi_qla_host *vha, fc_port_t *fcport)
1035 spin_unlock_irqrestore(&ha->tgt.sess_lock, flags); 1043 spin_unlock_irqrestore(&ha->tgt.sess_lock, flags);
1036 return; 1044 return;
1037 } else { 1045 } else {
1038 kref_get(&sess->se_sess->sess_kref); 1046 kref_get(&sess->sess_kref);
1039 1047
1040 if (sess->deleted) { 1048 if (sess->deleted) {
1041 qlt_undelete_sess(sess); 1049 qlt_undelete_sess(sess);
@@ -1060,7 +1068,7 @@ void qlt_fc_port_added(struct scsi_qla_host *vha, fc_port_t *fcport)
1060 fcport->port_name, sess->loop_id); 1068 fcport->port_name, sess->loop_id);
1061 sess->local = 0; 1069 sess->local = 0;
1062 } 1070 }
1063 ha->tgt.tgt_ops->put_sess(sess); 1071 qlt_put_sess(sess);
1064 spin_unlock_irqrestore(&ha->tgt.sess_lock, flags); 1072 spin_unlock_irqrestore(&ha->tgt.sess_lock, flags);
1065} 1073}
1066 1074
@@ -3817,7 +3825,7 @@ static void __qlt_do_work(struct qla_tgt_cmd *cmd)
3817 * Drop extra session reference from qla_tgt_handle_cmd_for_atio*( 3825 * Drop extra session reference from qla_tgt_handle_cmd_for_atio*(
3818 */ 3826 */
3819 spin_lock_irqsave(&ha->tgt.sess_lock, flags); 3827 spin_lock_irqsave(&ha->tgt.sess_lock, flags);
3820 ha->tgt.tgt_ops->put_sess(sess); 3828 qlt_put_sess(sess);
3821 spin_unlock_irqrestore(&ha->tgt.sess_lock, flags); 3829 spin_unlock_irqrestore(&ha->tgt.sess_lock, flags);
3822 return; 3830 return;
3823 3831
@@ -3836,7 +3844,7 @@ out_term:
3836 spin_unlock_irqrestore(&ha->hardware_lock, flags); 3844 spin_unlock_irqrestore(&ha->hardware_lock, flags);
3837 3845
3838 spin_lock_irqsave(&ha->tgt.sess_lock, flags); 3846 spin_lock_irqsave(&ha->tgt.sess_lock, flags);
3839 ha->tgt.tgt_ops->put_sess(sess); 3847 qlt_put_sess(sess);
3840 spin_unlock_irqrestore(&ha->tgt.sess_lock, flags); 3848 spin_unlock_irqrestore(&ha->tgt.sess_lock, flags);
3841} 3849}
3842 3850
@@ -3936,13 +3944,13 @@ static void qlt_create_sess_from_atio(struct work_struct *work)
3936 if (!cmd) { 3944 if (!cmd) {
3937 spin_lock_irqsave(&ha->hardware_lock, flags); 3945 spin_lock_irqsave(&ha->hardware_lock, flags);
3938 qlt_send_busy(vha, &op->atio, SAM_STAT_BUSY); 3946 qlt_send_busy(vha, &op->atio, SAM_STAT_BUSY);
3939 ha->tgt.tgt_ops->put_sess(sess); 3947 qlt_put_sess(sess);
3940 spin_unlock_irqrestore(&ha->hardware_lock, flags); 3948 spin_unlock_irqrestore(&ha->hardware_lock, flags);
3941 kfree(op); 3949 kfree(op);
3942 return; 3950 return;
3943 } 3951 }
3944 /* 3952 /*
3945 * __qlt_do_work() will call ha->tgt.tgt_ops->put_sess() to release 3953 * __qlt_do_work() will call qlt_put_sess() to release
3946 * the extra reference taken above by qlt_make_local_sess() 3954 * the extra reference taken above by qlt_make_local_sess()
3947 */ 3955 */
3948 __qlt_do_work(cmd); 3956 __qlt_do_work(cmd);
@@ -4003,13 +4011,13 @@ static int qlt_handle_cmd_for_atio(struct scsi_qla_host *vha,
4003 /* 4011 /*
4004 * Do kref_get() before returning + dropping qla_hw_data->hardware_lock. 4012 * Do kref_get() before returning + dropping qla_hw_data->hardware_lock.
4005 */ 4013 */
4006 kref_get(&sess->se_sess->sess_kref); 4014 kref_get(&sess->sess_kref);
4007 4015
4008 cmd = qlt_get_tag(vha, sess, atio); 4016 cmd = qlt_get_tag(vha, sess, atio);
4009 if (!cmd) { 4017 if (!cmd) {
4010 ql_dbg(ql_dbg_io, vha, 0x3062, 4018 ql_dbg(ql_dbg_io, vha, 0x3062,
4011 "qla_target(%d): Allocation of cmd failed\n", vha->vp_idx); 4019 "qla_target(%d): Allocation of cmd failed\n", vha->vp_idx);
4012 ha->tgt.tgt_ops->put_sess(sess); 4020 qlt_put_sess(sess);
4013 return -ENOMEM; 4021 return -ENOMEM;
4014 } 4022 }
4015 4023
@@ -5911,7 +5919,7 @@ static void qlt_abort_work(struct qla_tgt *tgt,
5911 goto out_term2; 5919 goto out_term2;
5912 } 5920 }
5913 5921
5914 kref_get(&sess->se_sess->sess_kref); 5922 kref_get(&sess->sess_kref);
5915 } 5923 }
5916 5924
5917 spin_lock_irqsave(&ha->hardware_lock, flags); 5925 spin_lock_irqsave(&ha->hardware_lock, flags);
@@ -5924,7 +5932,7 @@ static void qlt_abort_work(struct qla_tgt *tgt,
5924 goto out_term; 5932 goto out_term;
5925 spin_unlock_irqrestore(&ha->hardware_lock, flags); 5933 spin_unlock_irqrestore(&ha->hardware_lock, flags);
5926 5934
5927 ha->tgt.tgt_ops->put_sess(sess); 5935 qlt_put_sess(sess);
5928 spin_unlock_irqrestore(&ha->tgt.sess_lock, flags2); 5936 spin_unlock_irqrestore(&ha->tgt.sess_lock, flags2);
5929 return; 5937 return;
5930 5938
@@ -5935,8 +5943,7 @@ out_term:
5935 qlt_24xx_send_abts_resp(vha, &prm->abts, FCP_TMF_REJECTED, false); 5943 qlt_24xx_send_abts_resp(vha, &prm->abts, FCP_TMF_REJECTED, false);
5936 spin_unlock_irqrestore(&ha->hardware_lock, flags); 5944 spin_unlock_irqrestore(&ha->hardware_lock, flags);
5937 5945
5938 if (sess) 5946 qlt_put_sess(sess);
5939 ha->tgt.tgt_ops->put_sess(sess);
5940 spin_unlock_irqrestore(&ha->tgt.sess_lock, flags2); 5947 spin_unlock_irqrestore(&ha->tgt.sess_lock, flags2);
5941} 5948}
5942 5949
@@ -5976,7 +5983,7 @@ static void qlt_tmr_work(struct qla_tgt *tgt,
5976 goto out_term; 5983 goto out_term;
5977 } 5984 }
5978 5985
5979 kref_get(&sess->se_sess->sess_kref); 5986 kref_get(&sess->sess_kref);
5980 } 5987 }
5981 5988
5982 iocb = a; 5989 iocb = a;
@@ -5988,14 +5995,13 @@ static void qlt_tmr_work(struct qla_tgt *tgt,
5988 if (rc != 0) 5995 if (rc != 0)
5989 goto out_term; 5996 goto out_term;
5990 5997
5991 ha->tgt.tgt_ops->put_sess(sess); 5998 qlt_put_sess(sess);
5992 spin_unlock_irqrestore(&ha->tgt.sess_lock, flags); 5999 spin_unlock_irqrestore(&ha->tgt.sess_lock, flags);
5993 return; 6000 return;
5994 6001
5995out_term: 6002out_term:
5996 qlt_send_term_exchange(vha, NULL, &prm->tm_iocb2, 1, 0); 6003 qlt_send_term_exchange(vha, NULL, &prm->tm_iocb2, 1, 0);
5997 if (sess) 6004 qlt_put_sess(sess);
5998 ha->tgt.tgt_ops->put_sess(sess);
5999 spin_unlock_irqrestore(&ha->tgt.sess_lock, flags); 6005 spin_unlock_irqrestore(&ha->tgt.sess_lock, flags);
6000} 6006}
6001 6007
diff --git a/drivers/scsi/qla2xxx/qla_target.h b/drivers/scsi/qla2xxx/qla_target.h
index d857feeb6514..f26c5f60eedd 100644
--- a/drivers/scsi/qla2xxx/qla_target.h
+++ b/drivers/scsi/qla2xxx/qla_target.h
@@ -738,7 +738,6 @@ struct qla_tgt_func_tmpl {
738 struct qla_tgt_sess *(*find_sess_by_s_id)(struct scsi_qla_host *, 738 struct qla_tgt_sess *(*find_sess_by_s_id)(struct scsi_qla_host *,
739 const uint8_t *); 739 const uint8_t *);
740 void (*clear_nacl_from_fcport_map)(struct qla_tgt_sess *); 740 void (*clear_nacl_from_fcport_map)(struct qla_tgt_sess *);
741 void (*put_sess)(struct qla_tgt_sess *);
742 void (*shutdown_sess)(struct qla_tgt_sess *); 741 void (*shutdown_sess)(struct qla_tgt_sess *);
743}; 742};
744 743
@@ -930,6 +929,7 @@ struct qla_tgt_sess {
930 int generation; 929 int generation;
931 930
932 struct se_session *se_sess; 931 struct se_session *se_sess;
932 struct kref sess_kref;
933 struct scsi_qla_host *vha; 933 struct scsi_qla_host *vha;
934 struct qla_tgt *tgt; 934 struct qla_tgt *tgt;
935 935
@@ -1101,7 +1101,7 @@ extern int qlt_remove_target(struct qla_hw_data *, struct scsi_qla_host *);
1101extern int qlt_lport_register(void *, u64, u64, u64, 1101extern int qlt_lport_register(void *, u64, u64, u64,
1102 int (*callback)(struct scsi_qla_host *, void *, u64, u64)); 1102 int (*callback)(struct scsi_qla_host *, void *, u64, u64));
1103extern void qlt_lport_deregister(struct scsi_qla_host *); 1103extern void qlt_lport_deregister(struct scsi_qla_host *);
1104extern void qlt_unreg_sess(struct qla_tgt_sess *); 1104void qlt_put_sess(struct qla_tgt_sess *sess);
1105extern void qlt_fc_port_added(struct scsi_qla_host *, fc_port_t *); 1105extern void qlt_fc_port_added(struct scsi_qla_host *, fc_port_t *);
1106extern void qlt_fc_port_deleted(struct scsi_qla_host *, fc_port_t *, int); 1106extern void qlt_fc_port_deleted(struct scsi_qla_host *, fc_port_t *, int);
1107extern int __init qlt_init(void); 1107extern int __init qlt_init(void);
diff --git a/drivers/scsi/qla2xxx/tcm_qla2xxx.c b/drivers/scsi/qla2xxx/tcm_qla2xxx.c
index c1461d225f08..675f75bafc3c 100644
--- a/drivers/scsi/qla2xxx/tcm_qla2xxx.c
+++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.c
@@ -339,22 +339,6 @@ static void tcm_qla2xxx_release_cmd(struct se_cmd *se_cmd)
339 qlt_free_cmd(cmd); 339 qlt_free_cmd(cmd);
340} 340}
341 341
342static int tcm_qla2xxx_shutdown_session(struct se_session *se_sess)
343{
344 struct qla_tgt_sess *sess = se_sess->fabric_sess_ptr;
345 struct scsi_qla_host *vha;
346 unsigned long flags;
347
348 BUG_ON(!sess);
349 vha = sess->vha;
350
351 spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags);
352 target_sess_cmd_list_set_waiting(se_sess);
353 spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags);
354
355 return 1;
356}
357
358static void tcm_qla2xxx_close_session(struct se_session *se_sess) 342static void tcm_qla2xxx_close_session(struct se_session *se_sess)
359{ 343{
360 struct qla_tgt_sess *sess = se_sess->fabric_sess_ptr; 344 struct qla_tgt_sess *sess = se_sess->fabric_sess_ptr;
@@ -365,7 +349,8 @@ static void tcm_qla2xxx_close_session(struct se_session *se_sess)
365 vha = sess->vha; 349 vha = sess->vha;
366 350
367 spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags); 351 spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags);
368 qlt_unreg_sess(sess); 352 target_sess_cmd_list_set_waiting(se_sess);
353 qlt_put_sess(sess);
369 spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags); 354 spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags);
370} 355}
371 356
@@ -758,23 +743,6 @@ static void tcm_qla2xxx_clear_nacl_from_fcport_map(struct qla_tgt_sess *sess)
758 tcm_qla2xxx_clear_sess_lookup(lport, nacl, sess); 743 tcm_qla2xxx_clear_sess_lookup(lport, nacl, sess);
759} 744}
760 745
761static void tcm_qla2xxx_release_session(struct kref *kref)
762{
763 struct se_session *se_sess = container_of(kref,
764 struct se_session, sess_kref);
765
766 qlt_unreg_sess(se_sess->fabric_sess_ptr);
767}
768
769static void tcm_qla2xxx_put_sess(struct qla_tgt_sess *sess)
770{
771 if (!sess)
772 return;
773
774 assert_spin_locked(&sess->vha->hw->tgt.sess_lock);
775 kref_put(&sess->se_sess->sess_kref, tcm_qla2xxx_release_session);
776}
777
778static void tcm_qla2xxx_shutdown_sess(struct qla_tgt_sess *sess) 746static void tcm_qla2xxx_shutdown_sess(struct qla_tgt_sess *sess)
779{ 747{
780 assert_spin_locked(&sess->vha->hw->tgt.sess_lock); 748 assert_spin_locked(&sess->vha->hw->tgt.sess_lock);
@@ -1579,7 +1547,6 @@ static struct qla_tgt_func_tmpl tcm_qla2xxx_template = {
1579 .find_sess_by_s_id = tcm_qla2xxx_find_sess_by_s_id, 1547 .find_sess_by_s_id = tcm_qla2xxx_find_sess_by_s_id,
1580 .find_sess_by_loop_id = tcm_qla2xxx_find_sess_by_loop_id, 1548 .find_sess_by_loop_id = tcm_qla2xxx_find_sess_by_loop_id,
1581 .clear_nacl_from_fcport_map = tcm_qla2xxx_clear_nacl_from_fcport_map, 1549 .clear_nacl_from_fcport_map = tcm_qla2xxx_clear_nacl_from_fcport_map,
1582 .put_sess = tcm_qla2xxx_put_sess,
1583 .shutdown_sess = tcm_qla2xxx_shutdown_sess, 1550 .shutdown_sess = tcm_qla2xxx_shutdown_sess,
1584}; 1551};
1585 1552
@@ -1847,7 +1814,6 @@ static const struct target_core_fabric_ops tcm_qla2xxx_ops = {
1847 .tpg_get_inst_index = tcm_qla2xxx_tpg_get_inst_index, 1814 .tpg_get_inst_index = tcm_qla2xxx_tpg_get_inst_index,
1848 .check_stop_free = tcm_qla2xxx_check_stop_free, 1815 .check_stop_free = tcm_qla2xxx_check_stop_free,
1849 .release_cmd = tcm_qla2xxx_release_cmd, 1816 .release_cmd = tcm_qla2xxx_release_cmd,
1850 .shutdown_session = tcm_qla2xxx_shutdown_session,
1851 .close_session = tcm_qla2xxx_close_session, 1817 .close_session = tcm_qla2xxx_close_session,
1852 .sess_get_index = tcm_qla2xxx_sess_get_index, 1818 .sess_get_index = tcm_qla2xxx_sess_get_index,
1853 .sess_get_initiator_sid = NULL, 1819 .sess_get_initiator_sid = NULL,
@@ -1890,7 +1856,6 @@ static const struct target_core_fabric_ops tcm_qla2xxx_npiv_ops = {
1890 .tpg_get_inst_index = tcm_qla2xxx_tpg_get_inst_index, 1856 .tpg_get_inst_index = tcm_qla2xxx_tpg_get_inst_index,
1891 .check_stop_free = tcm_qla2xxx_check_stop_free, 1857 .check_stop_free = tcm_qla2xxx_check_stop_free,
1892 .release_cmd = tcm_qla2xxx_release_cmd, 1858 .release_cmd = tcm_qla2xxx_release_cmd,
1893 .shutdown_session = tcm_qla2xxx_shutdown_session,
1894 .close_session = tcm_qla2xxx_close_session, 1859 .close_session = tcm_qla2xxx_close_session,
1895 .sess_get_index = tcm_qla2xxx_sess_get_index, 1860 .sess_get_index = tcm_qla2xxx_sess_get_index,
1896 .sess_get_initiator_sid = NULL, 1861 .sess_get_initiator_sid = NULL,