diff options
-rw-r--r-- | drivers/scsi/qla2xxx/qla_target.c | 56 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_target.h | 4 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/tcm_qla2xxx.c | 39 |
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 */ |
640 | void qlt_unreg_sess(struct qla_tgt_sess *sess) | 640 | static 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 | } |
654 | EXPORT_SYMBOL(qlt_unreg_sess); | ||
655 | 656 | ||
657 | void 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 | } | ||
665 | EXPORT_SYMBOL(qlt_put_sess); | ||
656 | 666 | ||
657 | static int qlt_reset(struct scsi_qla_host *vha, void *iocb, int mcmd) | 667 | static 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 | ||
5995 | out_term: | 6002 | out_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 *); | |||
1101 | extern int qlt_lport_register(void *, u64, u64, u64, | 1101 | extern 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)); |
1103 | extern void qlt_lport_deregister(struct scsi_qla_host *); | 1103 | extern void qlt_lport_deregister(struct scsi_qla_host *); |
1104 | extern void qlt_unreg_sess(struct qla_tgt_sess *); | 1104 | void qlt_put_sess(struct qla_tgt_sess *sess); |
1105 | extern void qlt_fc_port_added(struct scsi_qla_host *, fc_port_t *); | 1105 | extern void qlt_fc_port_added(struct scsi_qla_host *, fc_port_t *); |
1106 | extern void qlt_fc_port_deleted(struct scsi_qla_host *, fc_port_t *, int); | 1106 | extern void qlt_fc_port_deleted(struct scsi_qla_host *, fc_port_t *, int); |
1107 | extern int __init qlt_init(void); | 1107 | extern 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 | ||
342 | static 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 | |||
358 | static void tcm_qla2xxx_close_session(struct se_session *se_sess) | 342 | static 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 | ||
761 | static 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 | |||
769 | static 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 | |||
778 | static void tcm_qla2xxx_shutdown_sess(struct qla_tgt_sess *sess) | 746 | static 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, |