Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*******************************************************************************
0003  * This file contains the iSCSI Target specific utility functions.
0004  *
0005  * (c) Copyright 2007-2013 Datera, Inc.
0006  *
0007  * Author: Nicholas A. Bellinger <nab@linux-iscsi.org>
0008  *
0009  ******************************************************************************/
0010 
0011 #include <linux/list.h>
0012 #include <linux/sched/signal.h>
0013 #include <net/ipv6.h>         /* ipv6_addr_equal() */
0014 #include <scsi/scsi_tcq.h>
0015 #include <scsi/iscsi_proto.h>
0016 #include <target/target_core_base.h>
0017 #include <target/target_core_fabric.h>
0018 #include <target/iscsi/iscsi_transport.h>
0019 
0020 #include <target/iscsi/iscsi_target_core.h>
0021 #include "iscsi_target_parameters.h"
0022 #include "iscsi_target_seq_pdu_list.h"
0023 #include "iscsi_target_datain_values.h"
0024 #include "iscsi_target_erl0.h"
0025 #include "iscsi_target_erl1.h"
0026 #include "iscsi_target_erl2.h"
0027 #include "iscsi_target_tpg.h"
0028 #include "iscsi_target_util.h"
0029 #include "iscsi_target.h"
0030 
0031 extern struct list_head g_tiqn_list;
0032 extern spinlock_t tiqn_lock;
0033 
0034 int iscsit_add_r2t_to_list(
0035     struct iscsit_cmd *cmd,
0036     u32 offset,
0037     u32 xfer_len,
0038     int recovery,
0039     u32 r2t_sn)
0040 {
0041     struct iscsi_r2t *r2t;
0042 
0043     lockdep_assert_held(&cmd->r2t_lock);
0044 
0045     WARN_ON_ONCE((s32)xfer_len < 0);
0046 
0047     r2t = kmem_cache_zalloc(lio_r2t_cache, GFP_ATOMIC);
0048     if (!r2t) {
0049         pr_err("Unable to allocate memory for struct iscsi_r2t.\n");
0050         return -1;
0051     }
0052     INIT_LIST_HEAD(&r2t->r2t_list);
0053 
0054     r2t->recovery_r2t = recovery;
0055     r2t->r2t_sn = (!r2t_sn) ? cmd->r2t_sn++ : r2t_sn;
0056     r2t->offset = offset;
0057     r2t->xfer_len = xfer_len;
0058     list_add_tail(&r2t->r2t_list, &cmd->cmd_r2t_list);
0059     spin_unlock_bh(&cmd->r2t_lock);
0060 
0061     iscsit_add_cmd_to_immediate_queue(cmd, cmd->conn, ISTATE_SEND_R2T);
0062 
0063     spin_lock_bh(&cmd->r2t_lock);
0064     return 0;
0065 }
0066 
0067 struct iscsi_r2t *iscsit_get_r2t_for_eos(
0068     struct iscsit_cmd *cmd,
0069     u32 offset,
0070     u32 length)
0071 {
0072     struct iscsi_r2t *r2t;
0073 
0074     spin_lock_bh(&cmd->r2t_lock);
0075     list_for_each_entry(r2t, &cmd->cmd_r2t_list, r2t_list) {
0076         if ((r2t->offset <= offset) &&
0077             (r2t->offset + r2t->xfer_len) >= (offset + length)) {
0078             spin_unlock_bh(&cmd->r2t_lock);
0079             return r2t;
0080         }
0081     }
0082     spin_unlock_bh(&cmd->r2t_lock);
0083 
0084     pr_err("Unable to locate R2T for Offset: %u, Length:"
0085             " %u\n", offset, length);
0086     return NULL;
0087 }
0088 
0089 struct iscsi_r2t *iscsit_get_r2t_from_list(struct iscsit_cmd *cmd)
0090 {
0091     struct iscsi_r2t *r2t;
0092 
0093     spin_lock_bh(&cmd->r2t_lock);
0094     list_for_each_entry(r2t, &cmd->cmd_r2t_list, r2t_list) {
0095         if (!r2t->sent_r2t) {
0096             spin_unlock_bh(&cmd->r2t_lock);
0097             return r2t;
0098         }
0099     }
0100     spin_unlock_bh(&cmd->r2t_lock);
0101 
0102     pr_err("Unable to locate next R2T to send for ITT:"
0103             " 0x%08x.\n", cmd->init_task_tag);
0104     return NULL;
0105 }
0106 
0107 void iscsit_free_r2t(struct iscsi_r2t *r2t, struct iscsit_cmd *cmd)
0108 {
0109     lockdep_assert_held(&cmd->r2t_lock);
0110 
0111     list_del(&r2t->r2t_list);
0112     kmem_cache_free(lio_r2t_cache, r2t);
0113 }
0114 
0115 void iscsit_free_r2ts_from_list(struct iscsit_cmd *cmd)
0116 {
0117     struct iscsi_r2t *r2t, *r2t_tmp;
0118 
0119     spin_lock_bh(&cmd->r2t_lock);
0120     list_for_each_entry_safe(r2t, r2t_tmp, &cmd->cmd_r2t_list, r2t_list)
0121         iscsit_free_r2t(r2t, cmd);
0122     spin_unlock_bh(&cmd->r2t_lock);
0123 }
0124 
0125 static int iscsit_wait_for_tag(struct se_session *se_sess, int state, int *cpup)
0126 {
0127     int tag = -1;
0128     DEFINE_SBQ_WAIT(wait);
0129     struct sbq_wait_state *ws;
0130     struct sbitmap_queue *sbq;
0131 
0132     if (state == TASK_RUNNING)
0133         return tag;
0134 
0135     sbq = &se_sess->sess_tag_pool;
0136     ws = &sbq->ws[0];
0137     for (;;) {
0138         sbitmap_prepare_to_wait(sbq, ws, &wait, state);
0139         if (signal_pending_state(state, current))
0140             break;
0141         tag = sbitmap_queue_get(sbq, cpup);
0142         if (tag >= 0)
0143             break;
0144         schedule();
0145     }
0146 
0147     sbitmap_finish_wait(sbq, ws, &wait);
0148     return tag;
0149 }
0150 
0151 /*
0152  * May be called from software interrupt (timer) context for allocating
0153  * iSCSI NopINs.
0154  */
0155 struct iscsit_cmd *iscsit_allocate_cmd(struct iscsit_conn *conn, int state)
0156 {
0157     struct iscsit_cmd *cmd;
0158     struct se_session *se_sess = conn->sess->se_sess;
0159     int size, tag, cpu;
0160 
0161     tag = sbitmap_queue_get(&se_sess->sess_tag_pool, &cpu);
0162     if (tag < 0)
0163         tag = iscsit_wait_for_tag(se_sess, state, &cpu);
0164     if (tag < 0)
0165         return NULL;
0166 
0167     size = sizeof(struct iscsit_cmd) + conn->conn_transport->priv_size;
0168     cmd = (struct iscsit_cmd *)(se_sess->sess_cmd_map + (tag * size));
0169     memset(cmd, 0, size);
0170 
0171     cmd->se_cmd.map_tag = tag;
0172     cmd->se_cmd.map_cpu = cpu;
0173     cmd->conn = conn;
0174     cmd->data_direction = DMA_NONE;
0175     INIT_LIST_HEAD(&cmd->i_conn_node);
0176     INIT_LIST_HEAD(&cmd->datain_list);
0177     INIT_LIST_HEAD(&cmd->cmd_r2t_list);
0178     spin_lock_init(&cmd->datain_lock);
0179     spin_lock_init(&cmd->dataout_timeout_lock);
0180     spin_lock_init(&cmd->istate_lock);
0181     spin_lock_init(&cmd->error_lock);
0182     spin_lock_init(&cmd->r2t_lock);
0183     timer_setup(&cmd->dataout_timer, iscsit_handle_dataout_timeout, 0);
0184 
0185     return cmd;
0186 }
0187 EXPORT_SYMBOL(iscsit_allocate_cmd);
0188 
0189 struct iscsi_seq *iscsit_get_seq_holder_for_datain(
0190     struct iscsit_cmd *cmd,
0191     u32 seq_send_order)
0192 {
0193     u32 i;
0194 
0195     for (i = 0; i < cmd->seq_count; i++)
0196         if (cmd->seq_list[i].seq_send_order == seq_send_order)
0197             return &cmd->seq_list[i];
0198 
0199     return NULL;
0200 }
0201 
0202 struct iscsi_seq *iscsit_get_seq_holder_for_r2t(struct iscsit_cmd *cmd)
0203 {
0204     u32 i;
0205 
0206     if (!cmd->seq_list) {
0207         pr_err("struct iscsit_cmd->seq_list is NULL!\n");
0208         return NULL;
0209     }
0210 
0211     for (i = 0; i < cmd->seq_count; i++) {
0212         if (cmd->seq_list[i].type != SEQTYPE_NORMAL)
0213             continue;
0214         if (cmd->seq_list[i].seq_send_order == cmd->seq_send_order) {
0215             cmd->seq_send_order++;
0216             return &cmd->seq_list[i];
0217         }
0218     }
0219 
0220     return NULL;
0221 }
0222 
0223 struct iscsi_r2t *iscsit_get_holder_for_r2tsn(
0224     struct iscsit_cmd *cmd,
0225     u32 r2t_sn)
0226 {
0227     struct iscsi_r2t *r2t;
0228 
0229     spin_lock_bh(&cmd->r2t_lock);
0230     list_for_each_entry(r2t, &cmd->cmd_r2t_list, r2t_list) {
0231         if (r2t->r2t_sn == r2t_sn) {
0232             spin_unlock_bh(&cmd->r2t_lock);
0233             return r2t;
0234         }
0235     }
0236     spin_unlock_bh(&cmd->r2t_lock);
0237 
0238     return NULL;
0239 }
0240 
0241 static inline int iscsit_check_received_cmdsn(struct iscsit_session *sess, u32 cmdsn)
0242 {
0243     u32 max_cmdsn;
0244     int ret;
0245 
0246     /*
0247      * This is the proper method of checking received CmdSN against
0248      * ExpCmdSN and MaxCmdSN values, as well as accounting for out
0249      * or order CmdSNs due to multiple connection sessions and/or
0250      * CRC failures.
0251      */
0252     max_cmdsn = atomic_read(&sess->max_cmd_sn);
0253     if (iscsi_sna_gt(cmdsn, max_cmdsn)) {
0254         pr_err("Received CmdSN: 0x%08x is greater than"
0255                " MaxCmdSN: 0x%08x, ignoring.\n", cmdsn, max_cmdsn);
0256         ret = CMDSN_MAXCMDSN_OVERRUN;
0257 
0258     } else if (cmdsn == sess->exp_cmd_sn) {
0259         sess->exp_cmd_sn++;
0260         pr_debug("Received CmdSN matches ExpCmdSN,"
0261               " incremented ExpCmdSN to: 0x%08x\n",
0262               sess->exp_cmd_sn);
0263         ret = CMDSN_NORMAL_OPERATION;
0264 
0265     } else if (iscsi_sna_gt(cmdsn, sess->exp_cmd_sn)) {
0266         pr_debug("Received CmdSN: 0x%08x is greater"
0267               " than ExpCmdSN: 0x%08x, not acknowledging.\n",
0268               cmdsn, sess->exp_cmd_sn);
0269         ret = CMDSN_HIGHER_THAN_EXP;
0270 
0271     } else {
0272         pr_err("Received CmdSN: 0x%08x is less than"
0273                " ExpCmdSN: 0x%08x, ignoring.\n", cmdsn,
0274                sess->exp_cmd_sn);
0275         ret = CMDSN_LOWER_THAN_EXP;
0276     }
0277 
0278     return ret;
0279 }
0280 
0281 /*
0282  * Commands may be received out of order if MC/S is in use.
0283  * Ensure they are executed in CmdSN order.
0284  */
0285 int iscsit_sequence_cmd(struct iscsit_conn *conn, struct iscsit_cmd *cmd,
0286             unsigned char *buf, __be32 cmdsn)
0287 {
0288     int ret, cmdsn_ret;
0289     bool reject = false;
0290     u8 reason = ISCSI_REASON_BOOKMARK_NO_RESOURCES;
0291 
0292     mutex_lock(&conn->sess->cmdsn_mutex);
0293 
0294     cmdsn_ret = iscsit_check_received_cmdsn(conn->sess, be32_to_cpu(cmdsn));
0295     switch (cmdsn_ret) {
0296     case CMDSN_NORMAL_OPERATION:
0297         ret = iscsit_execute_cmd(cmd, 0);
0298         if ((ret >= 0) && !list_empty(&conn->sess->sess_ooo_cmdsn_list))
0299             iscsit_execute_ooo_cmdsns(conn->sess);
0300         else if (ret < 0) {
0301             reject = true;
0302             ret = CMDSN_ERROR_CANNOT_RECOVER;
0303         }
0304         break;
0305     case CMDSN_HIGHER_THAN_EXP:
0306         ret = iscsit_handle_ooo_cmdsn(conn->sess, cmd, be32_to_cpu(cmdsn));
0307         if (ret < 0) {
0308             reject = true;
0309             ret = CMDSN_ERROR_CANNOT_RECOVER;
0310             break;
0311         }
0312         ret = CMDSN_HIGHER_THAN_EXP;
0313         break;
0314     case CMDSN_LOWER_THAN_EXP:
0315     case CMDSN_MAXCMDSN_OVERRUN:
0316     default:
0317         cmd->i_state = ISTATE_REMOVE;
0318         iscsit_add_cmd_to_immediate_queue(cmd, conn, cmd->i_state);
0319         /*
0320          * Existing callers for iscsit_sequence_cmd() will silently
0321          * ignore commands with CMDSN_LOWER_THAN_EXP, so force this
0322          * return for CMDSN_MAXCMDSN_OVERRUN as well..
0323          */
0324         ret = CMDSN_LOWER_THAN_EXP;
0325         break;
0326     }
0327     mutex_unlock(&conn->sess->cmdsn_mutex);
0328 
0329     if (reject)
0330         iscsit_reject_cmd(cmd, reason, buf);
0331 
0332     return ret;
0333 }
0334 EXPORT_SYMBOL(iscsit_sequence_cmd);
0335 
0336 int iscsit_check_unsolicited_dataout(struct iscsit_cmd *cmd, unsigned char *buf)
0337 {
0338     struct iscsit_conn *conn = cmd->conn;
0339     struct se_cmd *se_cmd = &cmd->se_cmd;
0340     struct iscsi_data *hdr = (struct iscsi_data *) buf;
0341     u32 payload_length = ntoh24(hdr->dlength);
0342 
0343     if (conn->sess->sess_ops->InitialR2T) {
0344         pr_err("Received unexpected unsolicited data"
0345             " while InitialR2T=Yes, protocol error.\n");
0346         transport_send_check_condition_and_sense(se_cmd,
0347                 TCM_UNEXPECTED_UNSOLICITED_DATA, 0);
0348         return -1;
0349     }
0350 
0351     if ((cmd->first_burst_len + payload_length) >
0352          conn->sess->sess_ops->FirstBurstLength) {
0353         pr_err("Total %u bytes exceeds FirstBurstLength: %u"
0354             " for this Unsolicited DataOut Burst.\n",
0355             (cmd->first_burst_len + payload_length),
0356                 conn->sess->sess_ops->FirstBurstLength);
0357         transport_send_check_condition_and_sense(se_cmd,
0358                 TCM_INCORRECT_AMOUNT_OF_DATA, 0);
0359         return -1;
0360     }
0361 
0362     if (!(hdr->flags & ISCSI_FLAG_CMD_FINAL))
0363         return 0;
0364 
0365     if (((cmd->first_burst_len + payload_length) != cmd->se_cmd.data_length) &&
0366         ((cmd->first_burst_len + payload_length) !=
0367           conn->sess->sess_ops->FirstBurstLength)) {
0368         pr_err("Unsolicited non-immediate data received %u"
0369             " does not equal FirstBurstLength: %u, and does"
0370             " not equal ExpXferLen %u.\n",
0371             (cmd->first_burst_len + payload_length),
0372             conn->sess->sess_ops->FirstBurstLength, cmd->se_cmd.data_length);
0373         transport_send_check_condition_and_sense(se_cmd,
0374                 TCM_INCORRECT_AMOUNT_OF_DATA, 0);
0375         return -1;
0376     }
0377     return 0;
0378 }
0379 
0380 struct iscsit_cmd *iscsit_find_cmd_from_itt(
0381     struct iscsit_conn *conn,
0382     itt_t init_task_tag)
0383 {
0384     struct iscsit_cmd *cmd;
0385 
0386     spin_lock_bh(&conn->cmd_lock);
0387     list_for_each_entry(cmd, &conn->conn_cmd_list, i_conn_node) {
0388         if (cmd->init_task_tag == init_task_tag) {
0389             spin_unlock_bh(&conn->cmd_lock);
0390             return cmd;
0391         }
0392     }
0393     spin_unlock_bh(&conn->cmd_lock);
0394 
0395     pr_err("Unable to locate ITT: 0x%08x on CID: %hu",
0396             init_task_tag, conn->cid);
0397     return NULL;
0398 }
0399 EXPORT_SYMBOL(iscsit_find_cmd_from_itt);
0400 
0401 struct iscsit_cmd *iscsit_find_cmd_from_itt_or_dump(
0402     struct iscsit_conn *conn,
0403     itt_t init_task_tag,
0404     u32 length)
0405 {
0406     struct iscsit_cmd *cmd;
0407 
0408     spin_lock_bh(&conn->cmd_lock);
0409     list_for_each_entry(cmd, &conn->conn_cmd_list, i_conn_node) {
0410         if (cmd->cmd_flags & ICF_GOT_LAST_DATAOUT)
0411             continue;
0412         if (cmd->init_task_tag == init_task_tag) {
0413             spin_unlock_bh(&conn->cmd_lock);
0414             return cmd;
0415         }
0416     }
0417     spin_unlock_bh(&conn->cmd_lock);
0418 
0419     pr_err("Unable to locate ITT: 0x%08x on CID: %hu,"
0420             " dumping payload\n", init_task_tag, conn->cid);
0421     if (length)
0422         iscsit_dump_data_payload(conn, length, 1);
0423 
0424     return NULL;
0425 }
0426 EXPORT_SYMBOL(iscsit_find_cmd_from_itt_or_dump);
0427 
0428 struct iscsit_cmd *iscsit_find_cmd_from_ttt(
0429     struct iscsit_conn *conn,
0430     u32 targ_xfer_tag)
0431 {
0432     struct iscsit_cmd *cmd = NULL;
0433 
0434     spin_lock_bh(&conn->cmd_lock);
0435     list_for_each_entry(cmd, &conn->conn_cmd_list, i_conn_node) {
0436         if (cmd->targ_xfer_tag == targ_xfer_tag) {
0437             spin_unlock_bh(&conn->cmd_lock);
0438             return cmd;
0439         }
0440     }
0441     spin_unlock_bh(&conn->cmd_lock);
0442 
0443     pr_err("Unable to locate TTT: 0x%08x on CID: %hu\n",
0444             targ_xfer_tag, conn->cid);
0445     return NULL;
0446 }
0447 
0448 int iscsit_find_cmd_for_recovery(
0449     struct iscsit_session *sess,
0450     struct iscsit_cmd **cmd_ptr,
0451     struct iscsi_conn_recovery **cr_ptr,
0452     itt_t init_task_tag)
0453 {
0454     struct iscsit_cmd *cmd = NULL;
0455     struct iscsi_conn_recovery *cr;
0456     /*
0457      * Scan through the inactive connection recovery list's command list.
0458      * If init_task_tag matches the command is still alligent.
0459      */
0460     spin_lock(&sess->cr_i_lock);
0461     list_for_each_entry(cr, &sess->cr_inactive_list, cr_list) {
0462         spin_lock(&cr->conn_recovery_cmd_lock);
0463         list_for_each_entry(cmd, &cr->conn_recovery_cmd_list, i_conn_node) {
0464             if (cmd->init_task_tag == init_task_tag) {
0465                 spin_unlock(&cr->conn_recovery_cmd_lock);
0466                 spin_unlock(&sess->cr_i_lock);
0467 
0468                 *cr_ptr = cr;
0469                 *cmd_ptr = cmd;
0470                 return -2;
0471             }
0472         }
0473         spin_unlock(&cr->conn_recovery_cmd_lock);
0474     }
0475     spin_unlock(&sess->cr_i_lock);
0476     /*
0477      * Scan through the active connection recovery list's command list.
0478      * If init_task_tag matches the command is ready to be reassigned.
0479      */
0480     spin_lock(&sess->cr_a_lock);
0481     list_for_each_entry(cr, &sess->cr_active_list, cr_list) {
0482         spin_lock(&cr->conn_recovery_cmd_lock);
0483         list_for_each_entry(cmd, &cr->conn_recovery_cmd_list, i_conn_node) {
0484             if (cmd->init_task_tag == init_task_tag) {
0485                 spin_unlock(&cr->conn_recovery_cmd_lock);
0486                 spin_unlock(&sess->cr_a_lock);
0487 
0488                 *cr_ptr = cr;
0489                 *cmd_ptr = cmd;
0490                 return 0;
0491             }
0492         }
0493         spin_unlock(&cr->conn_recovery_cmd_lock);
0494     }
0495     spin_unlock(&sess->cr_a_lock);
0496 
0497     return -1;
0498 }
0499 
0500 void iscsit_add_cmd_to_immediate_queue(
0501     struct iscsit_cmd *cmd,
0502     struct iscsit_conn *conn,
0503     u8 state)
0504 {
0505     struct iscsi_queue_req *qr;
0506 
0507     qr = kmem_cache_zalloc(lio_qr_cache, GFP_ATOMIC);
0508     if (!qr) {
0509         pr_err("Unable to allocate memory for"
0510                 " struct iscsi_queue_req\n");
0511         return;
0512     }
0513     INIT_LIST_HEAD(&qr->qr_list);
0514     qr->cmd = cmd;
0515     qr->state = state;
0516 
0517     spin_lock_bh(&conn->immed_queue_lock);
0518     list_add_tail(&qr->qr_list, &conn->immed_queue_list);
0519     atomic_inc(&cmd->immed_queue_count);
0520     atomic_set(&conn->check_immediate_queue, 1);
0521     spin_unlock_bh(&conn->immed_queue_lock);
0522 
0523     wake_up(&conn->queues_wq);
0524 }
0525 EXPORT_SYMBOL(iscsit_add_cmd_to_immediate_queue);
0526 
0527 struct iscsi_queue_req *iscsit_get_cmd_from_immediate_queue(struct iscsit_conn *conn)
0528 {
0529     struct iscsi_queue_req *qr;
0530 
0531     spin_lock_bh(&conn->immed_queue_lock);
0532     if (list_empty(&conn->immed_queue_list)) {
0533         spin_unlock_bh(&conn->immed_queue_lock);
0534         return NULL;
0535     }
0536     qr = list_first_entry(&conn->immed_queue_list,
0537                   struct iscsi_queue_req, qr_list);
0538 
0539     list_del(&qr->qr_list);
0540     if (qr->cmd)
0541         atomic_dec(&qr->cmd->immed_queue_count);
0542     spin_unlock_bh(&conn->immed_queue_lock);
0543 
0544     return qr;
0545 }
0546 
0547 static void iscsit_remove_cmd_from_immediate_queue(
0548     struct iscsit_cmd *cmd,
0549     struct iscsit_conn *conn)
0550 {
0551     struct iscsi_queue_req *qr, *qr_tmp;
0552 
0553     spin_lock_bh(&conn->immed_queue_lock);
0554     if (!atomic_read(&cmd->immed_queue_count)) {
0555         spin_unlock_bh(&conn->immed_queue_lock);
0556         return;
0557     }
0558 
0559     list_for_each_entry_safe(qr, qr_tmp, &conn->immed_queue_list, qr_list) {
0560         if (qr->cmd != cmd)
0561             continue;
0562 
0563         atomic_dec(&qr->cmd->immed_queue_count);
0564         list_del(&qr->qr_list);
0565         kmem_cache_free(lio_qr_cache, qr);
0566     }
0567     spin_unlock_bh(&conn->immed_queue_lock);
0568 
0569     if (atomic_read(&cmd->immed_queue_count)) {
0570         pr_err("ITT: 0x%08x immed_queue_count: %d\n",
0571             cmd->init_task_tag,
0572             atomic_read(&cmd->immed_queue_count));
0573     }
0574 }
0575 
0576 int iscsit_add_cmd_to_response_queue(
0577     struct iscsit_cmd *cmd,
0578     struct iscsit_conn *conn,
0579     u8 state)
0580 {
0581     struct iscsi_queue_req *qr;
0582 
0583     qr = kmem_cache_zalloc(lio_qr_cache, GFP_ATOMIC);
0584     if (!qr) {
0585         pr_err("Unable to allocate memory for"
0586             " struct iscsi_queue_req\n");
0587         return -ENOMEM;
0588     }
0589     INIT_LIST_HEAD(&qr->qr_list);
0590     qr->cmd = cmd;
0591     qr->state = state;
0592 
0593     spin_lock_bh(&conn->response_queue_lock);
0594     list_add_tail(&qr->qr_list, &conn->response_queue_list);
0595     atomic_inc(&cmd->response_queue_count);
0596     spin_unlock_bh(&conn->response_queue_lock);
0597 
0598     wake_up(&conn->queues_wq);
0599     return 0;
0600 }
0601 
0602 struct iscsi_queue_req *iscsit_get_cmd_from_response_queue(struct iscsit_conn *conn)
0603 {
0604     struct iscsi_queue_req *qr;
0605 
0606     spin_lock_bh(&conn->response_queue_lock);
0607     if (list_empty(&conn->response_queue_list)) {
0608         spin_unlock_bh(&conn->response_queue_lock);
0609         return NULL;
0610     }
0611 
0612     qr = list_first_entry(&conn->response_queue_list,
0613                   struct iscsi_queue_req, qr_list);
0614 
0615     list_del(&qr->qr_list);
0616     if (qr->cmd)
0617         atomic_dec(&qr->cmd->response_queue_count);
0618     spin_unlock_bh(&conn->response_queue_lock);
0619 
0620     return qr;
0621 }
0622 
0623 static void iscsit_remove_cmd_from_response_queue(
0624     struct iscsit_cmd *cmd,
0625     struct iscsit_conn *conn)
0626 {
0627     struct iscsi_queue_req *qr, *qr_tmp;
0628 
0629     spin_lock_bh(&conn->response_queue_lock);
0630     if (!atomic_read(&cmd->response_queue_count)) {
0631         spin_unlock_bh(&conn->response_queue_lock);
0632         return;
0633     }
0634 
0635     list_for_each_entry_safe(qr, qr_tmp, &conn->response_queue_list,
0636                 qr_list) {
0637         if (qr->cmd != cmd)
0638             continue;
0639 
0640         atomic_dec(&qr->cmd->response_queue_count);
0641         list_del(&qr->qr_list);
0642         kmem_cache_free(lio_qr_cache, qr);
0643     }
0644     spin_unlock_bh(&conn->response_queue_lock);
0645 
0646     if (atomic_read(&cmd->response_queue_count)) {
0647         pr_err("ITT: 0x%08x response_queue_count: %d\n",
0648             cmd->init_task_tag,
0649             atomic_read(&cmd->response_queue_count));
0650     }
0651 }
0652 
0653 bool iscsit_conn_all_queues_empty(struct iscsit_conn *conn)
0654 {
0655     bool empty;
0656 
0657     spin_lock_bh(&conn->immed_queue_lock);
0658     empty = list_empty(&conn->immed_queue_list);
0659     spin_unlock_bh(&conn->immed_queue_lock);
0660 
0661     if (!empty)
0662         return empty;
0663 
0664     spin_lock_bh(&conn->response_queue_lock);
0665     empty = list_empty(&conn->response_queue_list);
0666     spin_unlock_bh(&conn->response_queue_lock);
0667 
0668     return empty;
0669 }
0670 
0671 void iscsit_free_queue_reqs_for_conn(struct iscsit_conn *conn)
0672 {
0673     struct iscsi_queue_req *qr, *qr_tmp;
0674 
0675     spin_lock_bh(&conn->immed_queue_lock);
0676     list_for_each_entry_safe(qr, qr_tmp, &conn->immed_queue_list, qr_list) {
0677         list_del(&qr->qr_list);
0678         if (qr->cmd)
0679             atomic_dec(&qr->cmd->immed_queue_count);
0680 
0681         kmem_cache_free(lio_qr_cache, qr);
0682     }
0683     spin_unlock_bh(&conn->immed_queue_lock);
0684 
0685     spin_lock_bh(&conn->response_queue_lock);
0686     list_for_each_entry_safe(qr, qr_tmp, &conn->response_queue_list,
0687             qr_list) {
0688         list_del(&qr->qr_list);
0689         if (qr->cmd)
0690             atomic_dec(&qr->cmd->response_queue_count);
0691 
0692         kmem_cache_free(lio_qr_cache, qr);
0693     }
0694     spin_unlock_bh(&conn->response_queue_lock);
0695 }
0696 
0697 void iscsit_release_cmd(struct iscsit_cmd *cmd)
0698 {
0699     struct iscsit_session *sess;
0700     struct se_cmd *se_cmd = &cmd->se_cmd;
0701 
0702     WARN_ON(!list_empty(&cmd->i_conn_node));
0703 
0704     if (cmd->conn)
0705         sess = cmd->conn->sess;
0706     else
0707         sess = cmd->sess;
0708 
0709     BUG_ON(!sess || !sess->se_sess);
0710 
0711     kfree(cmd->buf_ptr);
0712     kfree(cmd->pdu_list);
0713     kfree(cmd->seq_list);
0714     kfree(cmd->tmr_req);
0715     kfree(cmd->overflow_buf);
0716     kfree(cmd->iov_data);
0717     kfree(cmd->text_in_ptr);
0718 
0719     target_free_tag(sess->se_sess, se_cmd);
0720 }
0721 EXPORT_SYMBOL(iscsit_release_cmd);
0722 
0723 void __iscsit_free_cmd(struct iscsit_cmd *cmd, bool check_queues)
0724 {
0725     struct iscsit_conn *conn = cmd->conn;
0726 
0727     WARN_ON(!list_empty(&cmd->i_conn_node));
0728 
0729     if (cmd->data_direction == DMA_TO_DEVICE) {
0730         iscsit_stop_dataout_timer(cmd);
0731         iscsit_free_r2ts_from_list(cmd);
0732     }
0733     if (cmd->data_direction == DMA_FROM_DEVICE)
0734         iscsit_free_all_datain_reqs(cmd);
0735 
0736     if (conn && check_queues) {
0737         iscsit_remove_cmd_from_immediate_queue(cmd, conn);
0738         iscsit_remove_cmd_from_response_queue(cmd, conn);
0739     }
0740 
0741     if (conn && conn->conn_transport->iscsit_unmap_cmd)
0742         conn->conn_transport->iscsit_unmap_cmd(conn, cmd);
0743 }
0744 
0745 void iscsit_free_cmd(struct iscsit_cmd *cmd, bool shutdown)
0746 {
0747     struct se_cmd *se_cmd = cmd->se_cmd.se_tfo ? &cmd->se_cmd : NULL;
0748     int rc;
0749 
0750     WARN_ON(!list_empty(&cmd->i_conn_node));
0751 
0752     __iscsit_free_cmd(cmd, shutdown);
0753     if (se_cmd) {
0754         rc = transport_generic_free_cmd(se_cmd, shutdown);
0755         if (!rc && shutdown && se_cmd->se_sess) {
0756             __iscsit_free_cmd(cmd, shutdown);
0757             target_put_sess_cmd(se_cmd);
0758         }
0759     } else {
0760         iscsit_release_cmd(cmd);
0761     }
0762 }
0763 EXPORT_SYMBOL(iscsit_free_cmd);
0764 
0765 bool iscsit_check_session_usage_count(struct iscsit_session *sess,
0766                       bool can_sleep)
0767 {
0768     spin_lock_bh(&sess->session_usage_lock);
0769     if (sess->session_usage_count != 0) {
0770         sess->session_waiting_on_uc = 1;
0771         spin_unlock_bh(&sess->session_usage_lock);
0772         if (!can_sleep)
0773             return true;
0774 
0775         wait_for_completion(&sess->session_waiting_on_uc_comp);
0776         return false;
0777     }
0778     spin_unlock_bh(&sess->session_usage_lock);
0779 
0780     return false;
0781 }
0782 
0783 void iscsit_dec_session_usage_count(struct iscsit_session *sess)
0784 {
0785     spin_lock_bh(&sess->session_usage_lock);
0786     sess->session_usage_count--;
0787 
0788     if (!sess->session_usage_count && sess->session_waiting_on_uc)
0789         complete(&sess->session_waiting_on_uc_comp);
0790 
0791     spin_unlock_bh(&sess->session_usage_lock);
0792 }
0793 
0794 void iscsit_inc_session_usage_count(struct iscsit_session *sess)
0795 {
0796     spin_lock_bh(&sess->session_usage_lock);
0797     sess->session_usage_count++;
0798     spin_unlock_bh(&sess->session_usage_lock);
0799 }
0800 
0801 struct iscsit_conn *iscsit_get_conn_from_cid(struct iscsit_session *sess, u16 cid)
0802 {
0803     struct iscsit_conn *conn;
0804 
0805     spin_lock_bh(&sess->conn_lock);
0806     list_for_each_entry(conn, &sess->sess_conn_list, conn_list) {
0807         if ((conn->cid == cid) &&
0808             (conn->conn_state == TARG_CONN_STATE_LOGGED_IN)) {
0809             iscsit_inc_conn_usage_count(conn);
0810             spin_unlock_bh(&sess->conn_lock);
0811             return conn;
0812         }
0813     }
0814     spin_unlock_bh(&sess->conn_lock);
0815 
0816     return NULL;
0817 }
0818 
0819 struct iscsit_conn *iscsit_get_conn_from_cid_rcfr(struct iscsit_session *sess, u16 cid)
0820 {
0821     struct iscsit_conn *conn;
0822 
0823     spin_lock_bh(&sess->conn_lock);
0824     list_for_each_entry(conn, &sess->sess_conn_list, conn_list) {
0825         if (conn->cid == cid) {
0826             iscsit_inc_conn_usage_count(conn);
0827             spin_lock(&conn->state_lock);
0828             atomic_set(&conn->connection_wait_rcfr, 1);
0829             spin_unlock(&conn->state_lock);
0830             spin_unlock_bh(&sess->conn_lock);
0831             return conn;
0832         }
0833     }
0834     spin_unlock_bh(&sess->conn_lock);
0835 
0836     return NULL;
0837 }
0838 
0839 void iscsit_check_conn_usage_count(struct iscsit_conn *conn)
0840 {
0841     spin_lock_bh(&conn->conn_usage_lock);
0842     if (conn->conn_usage_count != 0) {
0843         conn->conn_waiting_on_uc = 1;
0844         spin_unlock_bh(&conn->conn_usage_lock);
0845 
0846         wait_for_completion(&conn->conn_waiting_on_uc_comp);
0847         return;
0848     }
0849     spin_unlock_bh(&conn->conn_usage_lock);
0850 }
0851 
0852 void iscsit_dec_conn_usage_count(struct iscsit_conn *conn)
0853 {
0854     spin_lock_bh(&conn->conn_usage_lock);
0855     conn->conn_usage_count--;
0856 
0857     if (!conn->conn_usage_count && conn->conn_waiting_on_uc)
0858         complete(&conn->conn_waiting_on_uc_comp);
0859 
0860     spin_unlock_bh(&conn->conn_usage_lock);
0861 }
0862 
0863 void iscsit_inc_conn_usage_count(struct iscsit_conn *conn)
0864 {
0865     spin_lock_bh(&conn->conn_usage_lock);
0866     conn->conn_usage_count++;
0867     spin_unlock_bh(&conn->conn_usage_lock);
0868 }
0869 
0870 static int iscsit_add_nopin(struct iscsit_conn *conn, int want_response)
0871 {
0872     u8 state;
0873     struct iscsit_cmd *cmd;
0874 
0875     cmd = iscsit_allocate_cmd(conn, TASK_RUNNING);
0876     if (!cmd)
0877         return -1;
0878 
0879     cmd->iscsi_opcode = ISCSI_OP_NOOP_IN;
0880     state = (want_response) ? ISTATE_SEND_NOPIN_WANT_RESPONSE :
0881                 ISTATE_SEND_NOPIN_NO_RESPONSE;
0882     cmd->init_task_tag = RESERVED_ITT;
0883     cmd->targ_xfer_tag = (want_response) ?
0884                  session_get_next_ttt(conn->sess) : 0xFFFFFFFF;
0885     spin_lock_bh(&conn->cmd_lock);
0886     list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list);
0887     spin_unlock_bh(&conn->cmd_lock);
0888 
0889     if (want_response)
0890         iscsit_start_nopin_response_timer(conn);
0891     iscsit_add_cmd_to_immediate_queue(cmd, conn, state);
0892 
0893     return 0;
0894 }
0895 
0896 void iscsit_handle_nopin_response_timeout(struct timer_list *t)
0897 {
0898     struct iscsit_conn *conn = from_timer(conn, t, nopin_response_timer);
0899     struct iscsit_session *sess = conn->sess;
0900 
0901     iscsit_inc_conn_usage_count(conn);
0902 
0903     spin_lock_bh(&conn->nopin_timer_lock);
0904     if (conn->nopin_response_timer_flags & ISCSI_TF_STOP) {
0905         spin_unlock_bh(&conn->nopin_timer_lock);
0906         iscsit_dec_conn_usage_count(conn);
0907         return;
0908     }
0909 
0910     pr_err("Did not receive response to NOPIN on CID: %hu, failing"
0911         " connection for I_T Nexus %s,i,0x%6phN,%s,t,0x%02x\n",
0912         conn->cid, sess->sess_ops->InitiatorName, sess->isid,
0913         sess->tpg->tpg_tiqn->tiqn, (u32)sess->tpg->tpgt);
0914     conn->nopin_response_timer_flags &= ~ISCSI_TF_RUNNING;
0915     spin_unlock_bh(&conn->nopin_timer_lock);
0916 
0917     iscsit_fill_cxn_timeout_err_stats(sess);
0918     iscsit_cause_connection_reinstatement(conn, 0);
0919     iscsit_dec_conn_usage_count(conn);
0920 }
0921 
0922 void iscsit_mod_nopin_response_timer(struct iscsit_conn *conn)
0923 {
0924     struct iscsit_session *sess = conn->sess;
0925     struct iscsi_node_attrib *na = iscsit_tpg_get_node_attrib(sess);
0926 
0927     spin_lock_bh(&conn->nopin_timer_lock);
0928     if (!(conn->nopin_response_timer_flags & ISCSI_TF_RUNNING)) {
0929         spin_unlock_bh(&conn->nopin_timer_lock);
0930         return;
0931     }
0932 
0933     mod_timer(&conn->nopin_response_timer,
0934         (get_jiffies_64() + na->nopin_response_timeout * HZ));
0935     spin_unlock_bh(&conn->nopin_timer_lock);
0936 }
0937 
0938 void iscsit_start_nopin_response_timer(struct iscsit_conn *conn)
0939 {
0940     struct iscsit_session *sess = conn->sess;
0941     struct iscsi_node_attrib *na = iscsit_tpg_get_node_attrib(sess);
0942 
0943     spin_lock_bh(&conn->nopin_timer_lock);
0944     if (conn->nopin_response_timer_flags & ISCSI_TF_RUNNING) {
0945         spin_unlock_bh(&conn->nopin_timer_lock);
0946         return;
0947     }
0948 
0949     conn->nopin_response_timer_flags &= ~ISCSI_TF_STOP;
0950     conn->nopin_response_timer_flags |= ISCSI_TF_RUNNING;
0951     mod_timer(&conn->nopin_response_timer,
0952           jiffies + na->nopin_response_timeout * HZ);
0953 
0954     pr_debug("Started NOPIN Response Timer on CID: %d to %u"
0955         " seconds\n", conn->cid, na->nopin_response_timeout);
0956     spin_unlock_bh(&conn->nopin_timer_lock);
0957 }
0958 
0959 void iscsit_stop_nopin_response_timer(struct iscsit_conn *conn)
0960 {
0961     spin_lock_bh(&conn->nopin_timer_lock);
0962     if (!(conn->nopin_response_timer_flags & ISCSI_TF_RUNNING)) {
0963         spin_unlock_bh(&conn->nopin_timer_lock);
0964         return;
0965     }
0966     conn->nopin_response_timer_flags |= ISCSI_TF_STOP;
0967     spin_unlock_bh(&conn->nopin_timer_lock);
0968 
0969     del_timer_sync(&conn->nopin_response_timer);
0970 
0971     spin_lock_bh(&conn->nopin_timer_lock);
0972     conn->nopin_response_timer_flags &= ~ISCSI_TF_RUNNING;
0973     spin_unlock_bh(&conn->nopin_timer_lock);
0974 }
0975 
0976 void iscsit_handle_nopin_timeout(struct timer_list *t)
0977 {
0978     struct iscsit_conn *conn = from_timer(conn, t, nopin_timer);
0979 
0980     iscsit_inc_conn_usage_count(conn);
0981 
0982     spin_lock_bh(&conn->nopin_timer_lock);
0983     if (conn->nopin_timer_flags & ISCSI_TF_STOP) {
0984         spin_unlock_bh(&conn->nopin_timer_lock);
0985         iscsit_dec_conn_usage_count(conn);
0986         return;
0987     }
0988     conn->nopin_timer_flags &= ~ISCSI_TF_RUNNING;
0989     spin_unlock_bh(&conn->nopin_timer_lock);
0990 
0991     iscsit_add_nopin(conn, 1);
0992     iscsit_dec_conn_usage_count(conn);
0993 }
0994 
0995 void __iscsit_start_nopin_timer(struct iscsit_conn *conn)
0996 {
0997     struct iscsit_session *sess = conn->sess;
0998     struct iscsi_node_attrib *na = iscsit_tpg_get_node_attrib(sess);
0999 
1000     lockdep_assert_held(&conn->nopin_timer_lock);
1001 
1002     /*
1003     * NOPIN timeout is disabled.
1004      */
1005     if (!na->nopin_timeout)
1006         return;
1007 
1008     if (conn->nopin_timer_flags & ISCSI_TF_RUNNING)
1009         return;
1010 
1011     conn->nopin_timer_flags &= ~ISCSI_TF_STOP;
1012     conn->nopin_timer_flags |= ISCSI_TF_RUNNING;
1013     mod_timer(&conn->nopin_timer, jiffies + na->nopin_timeout * HZ);
1014 
1015     pr_debug("Started NOPIN Timer on CID: %d at %u second"
1016         " interval\n", conn->cid, na->nopin_timeout);
1017 }
1018 
1019 void iscsit_start_nopin_timer(struct iscsit_conn *conn)
1020 {
1021     spin_lock_bh(&conn->nopin_timer_lock);
1022     __iscsit_start_nopin_timer(conn);
1023     spin_unlock_bh(&conn->nopin_timer_lock);
1024 }
1025 
1026 void iscsit_stop_nopin_timer(struct iscsit_conn *conn)
1027 {
1028     spin_lock_bh(&conn->nopin_timer_lock);
1029     if (!(conn->nopin_timer_flags & ISCSI_TF_RUNNING)) {
1030         spin_unlock_bh(&conn->nopin_timer_lock);
1031         return;
1032     }
1033     conn->nopin_timer_flags |= ISCSI_TF_STOP;
1034     spin_unlock_bh(&conn->nopin_timer_lock);
1035 
1036     del_timer_sync(&conn->nopin_timer);
1037 
1038     spin_lock_bh(&conn->nopin_timer_lock);
1039     conn->nopin_timer_flags &= ~ISCSI_TF_RUNNING;
1040     spin_unlock_bh(&conn->nopin_timer_lock);
1041 }
1042 
1043 int iscsit_send_tx_data(
1044     struct iscsit_cmd *cmd,
1045     struct iscsit_conn *conn,
1046     int use_misc)
1047 {
1048     int tx_sent, tx_size;
1049     u32 iov_count;
1050     struct kvec *iov;
1051 
1052 send_data:
1053     tx_size = cmd->tx_size;
1054 
1055     if (!use_misc) {
1056         iov = &cmd->iov_data[0];
1057         iov_count = cmd->iov_data_count;
1058     } else {
1059         iov = &cmd->iov_misc[0];
1060         iov_count = cmd->iov_misc_count;
1061     }
1062 
1063     tx_sent = tx_data(conn, &iov[0], iov_count, tx_size);
1064     if (tx_size != tx_sent) {
1065         if (tx_sent == -EAGAIN) {
1066             pr_err("tx_data() returned -EAGAIN\n");
1067             goto send_data;
1068         } else
1069             return -1;
1070     }
1071     cmd->tx_size = 0;
1072 
1073     return 0;
1074 }
1075 
1076 int iscsit_fe_sendpage_sg(
1077     struct iscsit_cmd *cmd,
1078     struct iscsit_conn *conn)
1079 {
1080     struct scatterlist *sg = cmd->first_data_sg;
1081     struct kvec iov;
1082     u32 tx_hdr_size, data_len;
1083     u32 offset = cmd->first_data_sg_off;
1084     int tx_sent, iov_off;
1085 
1086 send_hdr:
1087     tx_hdr_size = ISCSI_HDR_LEN;
1088     if (conn->conn_ops->HeaderDigest)
1089         tx_hdr_size += ISCSI_CRC_LEN;
1090 
1091     iov.iov_base = cmd->pdu;
1092     iov.iov_len = tx_hdr_size;
1093 
1094     tx_sent = tx_data(conn, &iov, 1, tx_hdr_size);
1095     if (tx_hdr_size != tx_sent) {
1096         if (tx_sent == -EAGAIN) {
1097             pr_err("tx_data() returned -EAGAIN\n");
1098             goto send_hdr;
1099         }
1100         return -1;
1101     }
1102 
1103     data_len = cmd->tx_size - tx_hdr_size - cmd->padding;
1104     /*
1105      * Set iov_off used by padding and data digest tx_data() calls below
1106      * in order to determine proper offset into cmd->iov_data[]
1107      */
1108     if (conn->conn_ops->DataDigest) {
1109         data_len -= ISCSI_CRC_LEN;
1110         if (cmd->padding)
1111             iov_off = (cmd->iov_data_count - 2);
1112         else
1113             iov_off = (cmd->iov_data_count - 1);
1114     } else {
1115         iov_off = (cmd->iov_data_count - 1);
1116     }
1117     /*
1118      * Perform sendpage() for each page in the scatterlist
1119      */
1120     while (data_len) {
1121         u32 space = (sg->length - offset);
1122         u32 sub_len = min_t(u32, data_len, space);
1123 send_pg:
1124         tx_sent = conn->sock->ops->sendpage(conn->sock,
1125                     sg_page(sg), sg->offset + offset, sub_len, 0);
1126         if (tx_sent != sub_len) {
1127             if (tx_sent == -EAGAIN) {
1128                 pr_err("tcp_sendpage() returned"
1129                         " -EAGAIN\n");
1130                 goto send_pg;
1131             }
1132 
1133             pr_err("tcp_sendpage() failure: %d\n",
1134                     tx_sent);
1135             return -1;
1136         }
1137 
1138         data_len -= sub_len;
1139         offset = 0;
1140         sg = sg_next(sg);
1141     }
1142 
1143 send_padding:
1144     if (cmd->padding) {
1145         struct kvec *iov_p = &cmd->iov_data[iov_off++];
1146 
1147         tx_sent = tx_data(conn, iov_p, 1, cmd->padding);
1148         if (cmd->padding != tx_sent) {
1149             if (tx_sent == -EAGAIN) {
1150                 pr_err("tx_data() returned -EAGAIN\n");
1151                 goto send_padding;
1152             }
1153             return -1;
1154         }
1155     }
1156 
1157 send_datacrc:
1158     if (conn->conn_ops->DataDigest) {
1159         struct kvec *iov_d = &cmd->iov_data[iov_off];
1160 
1161         tx_sent = tx_data(conn, iov_d, 1, ISCSI_CRC_LEN);
1162         if (ISCSI_CRC_LEN != tx_sent) {
1163             if (tx_sent == -EAGAIN) {
1164                 pr_err("tx_data() returned -EAGAIN\n");
1165                 goto send_datacrc;
1166             }
1167             return -1;
1168         }
1169     }
1170 
1171     return 0;
1172 }
1173 
1174 /*
1175  *      This function is used for mainly sending a ISCSI_TARG_LOGIN_RSP PDU
1176  *      back to the Initiator when an expection condition occurs with the
1177  *      errors set in status_class and status_detail.
1178  *
1179  *      Parameters:     iSCSI Connection, Status Class, Status Detail.
1180  *      Returns:        0 on success, -1 on error.
1181  */
1182 int iscsit_tx_login_rsp(struct iscsit_conn *conn, u8 status_class, u8 status_detail)
1183 {
1184     struct iscsi_login_rsp *hdr;
1185     struct iscsi_login *login = conn->conn_login;
1186 
1187     login->login_failed = 1;
1188     iscsit_collect_login_stats(conn, status_class, status_detail);
1189 
1190     memset(&login->rsp[0], 0, ISCSI_HDR_LEN);
1191 
1192     hdr = (struct iscsi_login_rsp *)&login->rsp[0];
1193     hdr->opcode     = ISCSI_OP_LOGIN_RSP;
1194     hdr->status_class   = status_class;
1195     hdr->status_detail  = status_detail;
1196     hdr->itt        = conn->login_itt;
1197 
1198     return conn->conn_transport->iscsit_put_login_tx(conn, login, 0);
1199 }
1200 
1201 void iscsit_print_session_params(struct iscsit_session *sess)
1202 {
1203     struct iscsit_conn *conn;
1204 
1205     pr_debug("-----------------------------[Session Params for"
1206         " SID: %u]-----------------------------\n", sess->sid);
1207     spin_lock_bh(&sess->conn_lock);
1208     list_for_each_entry(conn, &sess->sess_conn_list, conn_list)
1209         iscsi_dump_conn_ops(conn->conn_ops);
1210     spin_unlock_bh(&sess->conn_lock);
1211 
1212     iscsi_dump_sess_ops(sess->sess_ops);
1213 }
1214 
1215 int rx_data(
1216     struct iscsit_conn *conn,
1217     struct kvec *iov,
1218     int iov_count,
1219     int data)
1220 {
1221     int rx_loop = 0, total_rx = 0;
1222     struct msghdr msg;
1223 
1224     if (!conn || !conn->sock || !conn->conn_ops)
1225         return -1;
1226 
1227     memset(&msg, 0, sizeof(struct msghdr));
1228     iov_iter_kvec(&msg.msg_iter, READ, iov, iov_count, data);
1229 
1230     while (msg_data_left(&msg)) {
1231         rx_loop = sock_recvmsg(conn->sock, &msg, MSG_WAITALL);
1232         if (rx_loop <= 0) {
1233             pr_debug("rx_loop: %d total_rx: %d\n",
1234                 rx_loop, total_rx);
1235             return rx_loop;
1236         }
1237         total_rx += rx_loop;
1238         pr_debug("rx_loop: %d, total_rx: %d, data: %d\n",
1239                 rx_loop, total_rx, data);
1240     }
1241 
1242     return total_rx;
1243 }
1244 
1245 int tx_data(
1246     struct iscsit_conn *conn,
1247     struct kvec *iov,
1248     int iov_count,
1249     int data)
1250 {
1251     struct msghdr msg;
1252     int total_tx = 0;
1253 
1254     if (!conn || !conn->sock || !conn->conn_ops)
1255         return -1;
1256 
1257     if (data <= 0) {
1258         pr_err("Data length is: %d\n", data);
1259         return -1;
1260     }
1261 
1262     memset(&msg, 0, sizeof(struct msghdr));
1263 
1264     iov_iter_kvec(&msg.msg_iter, WRITE, iov, iov_count, data);
1265 
1266     while (msg_data_left(&msg)) {
1267         int tx_loop = sock_sendmsg(conn->sock, &msg);
1268         if (tx_loop <= 0) {
1269             pr_debug("tx_loop: %d total_tx %d\n",
1270                 tx_loop, total_tx);
1271             return tx_loop;
1272         }
1273         total_tx += tx_loop;
1274         pr_debug("tx_loop: %d, total_tx: %d, data: %d\n",
1275                     tx_loop, total_tx, data);
1276     }
1277 
1278     return total_tx;
1279 }
1280 
1281 void iscsit_collect_login_stats(
1282     struct iscsit_conn *conn,
1283     u8 status_class,
1284     u8 status_detail)
1285 {
1286     struct iscsi_param *intrname = NULL;
1287     struct iscsi_tiqn *tiqn;
1288     struct iscsi_login_stats *ls;
1289 
1290     tiqn = iscsit_snmp_get_tiqn(conn);
1291     if (!tiqn)
1292         return;
1293 
1294     ls = &tiqn->login_stats;
1295 
1296     spin_lock(&ls->lock);
1297     if (status_class == ISCSI_STATUS_CLS_SUCCESS)
1298         ls->accepts++;
1299     else if (status_class == ISCSI_STATUS_CLS_REDIRECT) {
1300         ls->redirects++;
1301         ls->last_fail_type = ISCSI_LOGIN_FAIL_REDIRECT;
1302     } else if ((status_class == ISCSI_STATUS_CLS_INITIATOR_ERR)  &&
1303          (status_detail == ISCSI_LOGIN_STATUS_AUTH_FAILED)) {
1304         ls->authenticate_fails++;
1305         ls->last_fail_type =  ISCSI_LOGIN_FAIL_AUTHENTICATE;
1306     } else if ((status_class == ISCSI_STATUS_CLS_INITIATOR_ERR)  &&
1307          (status_detail == ISCSI_LOGIN_STATUS_TGT_FORBIDDEN)) {
1308         ls->authorize_fails++;
1309         ls->last_fail_type = ISCSI_LOGIN_FAIL_AUTHORIZE;
1310     } else if ((status_class == ISCSI_STATUS_CLS_INITIATOR_ERR) &&
1311          (status_detail == ISCSI_LOGIN_STATUS_INIT_ERR)) {
1312         ls->negotiate_fails++;
1313         ls->last_fail_type = ISCSI_LOGIN_FAIL_NEGOTIATE;
1314     } else {
1315         ls->other_fails++;
1316         ls->last_fail_type = ISCSI_LOGIN_FAIL_OTHER;
1317     }
1318 
1319     /* Save initiator name, ip address and time, if it is a failed login */
1320     if (status_class != ISCSI_STATUS_CLS_SUCCESS) {
1321         if (conn->param_list)
1322             intrname = iscsi_find_param_from_key(INITIATORNAME,
1323                                  conn->param_list);
1324         strlcpy(ls->last_intr_fail_name,
1325                (intrname ? intrname->value : "Unknown"),
1326                sizeof(ls->last_intr_fail_name));
1327 
1328         ls->last_intr_fail_ip_family = conn->login_family;
1329 
1330         ls->last_intr_fail_sockaddr = conn->login_sockaddr;
1331         ls->last_fail_time = get_jiffies_64();
1332     }
1333 
1334     spin_unlock(&ls->lock);
1335 }
1336 
1337 struct iscsi_tiqn *iscsit_snmp_get_tiqn(struct iscsit_conn *conn)
1338 {
1339     struct iscsi_portal_group *tpg;
1340 
1341     if (!conn)
1342         return NULL;
1343 
1344     tpg = conn->tpg;
1345     if (!tpg)
1346         return NULL;
1347 
1348     if (!tpg->tpg_tiqn)
1349         return NULL;
1350 
1351     return tpg->tpg_tiqn;
1352 }
1353 
1354 void iscsit_fill_cxn_timeout_err_stats(struct iscsit_session *sess)
1355 {
1356     struct iscsi_portal_group *tpg = sess->tpg;
1357     struct iscsi_tiqn *tiqn = tpg->tpg_tiqn;
1358 
1359     if (!tiqn)
1360         return;
1361 
1362     spin_lock_bh(&tiqn->sess_err_stats.lock);
1363     strlcpy(tiqn->sess_err_stats.last_sess_fail_rem_name,
1364             sess->sess_ops->InitiatorName,
1365             sizeof(tiqn->sess_err_stats.last_sess_fail_rem_name));
1366     tiqn->sess_err_stats.last_sess_failure_type =
1367             ISCSI_SESS_ERR_CXN_TIMEOUT;
1368     tiqn->sess_err_stats.cxn_timeout_errors++;
1369     atomic_long_inc(&sess->conn_timeout_errors);
1370     spin_unlock_bh(&tiqn->sess_err_stats.lock);
1371 }