1e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger/******************************************************************************* 2e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger * This file contains error recovery level two functions used by 3e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger * the iSCSI Target driver. 4e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger * 54c76251e8e8f704ed7eace603a8041458a1ed16fNicholas Bellinger * (c) Copyright 2007-2013 Datera, Inc. 6e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger * 7e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger * Author: Nicholas A. Bellinger <nab@linux-iscsi.org> 8e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger * 9e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger * This program is free software; you can redistribute it and/or modify 10e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger * it under the terms of the GNU General Public License as published by 11e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger * the Free Software Foundation; either version 2 of the License, or 12e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger * (at your option) any later version. 13e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger * 14e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger * This program is distributed in the hope that it will be useful, 15e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger * but WITHOUT ANY WARRANTY; without even the implied warranty of 16e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger * GNU General Public License for more details. 18e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger ******************************************************************************/ 19e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 20e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger#include <scsi/iscsi_proto.h> 21e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger#include <target/target_core_base.h> 22c4795fb20edf2fe2c862c8fe9f8b681edeb79ac1Christoph Hellwig#include <target/target_core_fabric.h> 23e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 24e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger#include "iscsi_target_core.h" 25e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger#include "iscsi_target_datain_values.h" 26e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger#include "iscsi_target_util.h" 27e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger#include "iscsi_target_erl0.h" 28e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger#include "iscsi_target_erl1.h" 29e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger#include "iscsi_target_erl2.h" 30e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger#include "iscsi_target.h" 31e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 32e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger/* 33e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger * FIXME: Does RData SNACK apply here as well? 34e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger */ 35e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellingervoid iscsit_create_conn_recovery_datain_values( 36e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger struct iscsi_cmd *cmd, 3750e5c87de4c244662e47b28e499ace885d62248fChristoph Hellwig __be32 exp_data_sn) 38e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger{ 39e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger u32 data_sn = 0; 40e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger struct iscsi_conn *conn = cmd->conn; 41e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 42e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger cmd->next_burst_len = 0; 43e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger cmd->read_data_done = 0; 44e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 4550e5c87de4c244662e47b28e499ace885d62248fChristoph Hellwig while (be32_to_cpu(exp_data_sn) > data_sn) { 46e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger if ((cmd->next_burst_len + 47e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger conn->conn_ops->MaxRecvDataSegmentLength) < 48e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger conn->sess->sess_ops->MaxBurstLength) { 49e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger cmd->read_data_done += 50e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger conn->conn_ops->MaxRecvDataSegmentLength; 51e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger cmd->next_burst_len += 52e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger conn->conn_ops->MaxRecvDataSegmentLength; 53e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger } else { 54e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger cmd->read_data_done += 55e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger (conn->sess->sess_ops->MaxBurstLength - 56e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger cmd->next_burst_len); 57e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger cmd->next_burst_len = 0; 58e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger } 59e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger data_sn++; 60e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger } 61e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger} 62e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 63e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellingervoid iscsit_create_conn_recovery_dataout_values( 64e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger struct iscsi_cmd *cmd) 65e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger{ 66e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger u32 write_data_done = 0; 67e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger struct iscsi_conn *conn = cmd->conn; 68e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 69e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger cmd->data_sn = 0; 70e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger cmd->next_burst_len = 0; 71e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 72e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger while (cmd->write_data_done > write_data_done) { 73e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger if ((write_data_done + conn->sess->sess_ops->MaxBurstLength) <= 74e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger cmd->write_data_done) 75e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger write_data_done += conn->sess->sess_ops->MaxBurstLength; 76e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger else 77e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger break; 78e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger } 79e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 80e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger cmd->write_data_done = write_data_done; 81e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger} 82e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 83e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellingerstatic int iscsit_attach_active_connection_recovery_entry( 84e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger struct iscsi_session *sess, 85e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger struct iscsi_conn_recovery *cr) 86e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger{ 87e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_lock(&sess->cr_a_lock); 88e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger list_add_tail(&cr->cr_list, &sess->cr_active_list); 89e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_unlock(&sess->cr_a_lock); 90e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 91e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger return 0; 92e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger} 93e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 94e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellingerstatic int iscsit_attach_inactive_connection_recovery_entry( 95e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger struct iscsi_session *sess, 96e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger struct iscsi_conn_recovery *cr) 97e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger{ 98e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_lock(&sess->cr_i_lock); 99e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger list_add_tail(&cr->cr_list, &sess->cr_inactive_list); 100e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 101e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger sess->conn_recovery_count++; 102e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger pr_debug("Incremented connection recovery count to %u for" 103e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger " SID: %u\n", sess->conn_recovery_count, sess->sid); 104e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_unlock(&sess->cr_i_lock); 105e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 106e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger return 0; 107e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger} 108e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 109e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellingerstruct iscsi_conn_recovery *iscsit_get_inactive_connection_recovery_entry( 110e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger struct iscsi_session *sess, 111e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger u16 cid) 112e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger{ 113e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger struct iscsi_conn_recovery *cr; 114e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 115e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_lock(&sess->cr_i_lock); 116e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger list_for_each_entry(cr, &sess->cr_inactive_list, cr_list) { 117e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger if (cr->cid == cid) { 118e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_unlock(&sess->cr_i_lock); 119e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger return cr; 120e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger } 121e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger } 122e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_unlock(&sess->cr_i_lock); 123e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 124e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger return NULL; 125e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger} 126e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 127e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellingervoid iscsit_free_connection_recovery_entires(struct iscsi_session *sess) 128e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger{ 129e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger struct iscsi_cmd *cmd, *cmd_tmp; 130e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger struct iscsi_conn_recovery *cr, *cr_tmp; 131e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 132e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_lock(&sess->cr_a_lock); 133e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger list_for_each_entry_safe(cr, cr_tmp, &sess->cr_active_list, cr_list) { 134e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger list_del(&cr->cr_list); 135e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_unlock(&sess->cr_a_lock); 136e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 137e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_lock(&cr->conn_recovery_cmd_lock); 138e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger list_for_each_entry_safe(cmd, cmd_tmp, 1392fbb471e7821e3a12334054cd90aa3f3edb22cc3Andy Grover &cr->conn_recovery_cmd_list, i_conn_node) { 140e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 1415159d763f60af693a3fcec45dce2021f66e528a4Nicholas Bellinger list_del_init(&cmd->i_conn_node); 142e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger cmd->conn = NULL; 143e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_unlock(&cr->conn_recovery_cmd_lock); 144aafc9d158b0039e600fc429246c7bb04a111fb26Nicholas Bellinger iscsit_free_cmd(cmd, true); 145e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_lock(&cr->conn_recovery_cmd_lock); 146e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger } 147e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_unlock(&cr->conn_recovery_cmd_lock); 148e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_lock(&sess->cr_a_lock); 149e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 150e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger kfree(cr); 151e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger } 152e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_unlock(&sess->cr_a_lock); 153e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 154e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_lock(&sess->cr_i_lock); 155e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger list_for_each_entry_safe(cr, cr_tmp, &sess->cr_inactive_list, cr_list) { 156e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger list_del(&cr->cr_list); 157e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_unlock(&sess->cr_i_lock); 158e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 159e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_lock(&cr->conn_recovery_cmd_lock); 160e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger list_for_each_entry_safe(cmd, cmd_tmp, 1612fbb471e7821e3a12334054cd90aa3f3edb22cc3Andy Grover &cr->conn_recovery_cmd_list, i_conn_node) { 162e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 1635159d763f60af693a3fcec45dce2021f66e528a4Nicholas Bellinger list_del_init(&cmd->i_conn_node); 164e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger cmd->conn = NULL; 165e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_unlock(&cr->conn_recovery_cmd_lock); 166aafc9d158b0039e600fc429246c7bb04a111fb26Nicholas Bellinger iscsit_free_cmd(cmd, true); 167e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_lock(&cr->conn_recovery_cmd_lock); 168e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger } 169e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_unlock(&cr->conn_recovery_cmd_lock); 170e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_lock(&sess->cr_i_lock); 171e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 172e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger kfree(cr); 173e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger } 174e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_unlock(&sess->cr_i_lock); 175e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger} 176e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 177e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellingerint iscsit_remove_active_connection_recovery_entry( 178e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger struct iscsi_conn_recovery *cr, 179e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger struct iscsi_session *sess) 180e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger{ 181e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_lock(&sess->cr_a_lock); 182e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger list_del(&cr->cr_list); 183e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 184e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger sess->conn_recovery_count--; 185e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger pr_debug("Decremented connection recovery count to %u for" 186e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger " SID: %u\n", sess->conn_recovery_count, sess->sid); 187e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_unlock(&sess->cr_a_lock); 188e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 189e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger kfree(cr); 190e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 191e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger return 0; 192e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger} 193e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 194fceb5bc7be7d9a98459fb1e44e1b1bedef094b2cChristoph Hellwigstatic void iscsit_remove_inactive_connection_recovery_entry( 195e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger struct iscsi_conn_recovery *cr, 196e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger struct iscsi_session *sess) 197e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger{ 198e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_lock(&sess->cr_i_lock); 199e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger list_del(&cr->cr_list); 200e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_unlock(&sess->cr_i_lock); 201e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger} 202e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 203e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger/* 204e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger * Called with cr->conn_recovery_cmd_lock help. 205e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger */ 206e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellingerint iscsit_remove_cmd_from_connection_recovery( 207e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger struct iscsi_cmd *cmd, 208e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger struct iscsi_session *sess) 209e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger{ 210e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger struct iscsi_conn_recovery *cr; 211e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 212e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger if (!cmd->cr) { 213e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger pr_err("struct iscsi_conn_recovery pointer for ITT: 0x%08x" 214e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger " is NULL!\n", cmd->init_task_tag); 215e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger BUG(); 216e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger } 217e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger cr = cmd->cr; 218e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 2195159d763f60af693a3fcec45dce2021f66e528a4Nicholas Bellinger list_del_init(&cmd->i_conn_node); 220e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger return --cr->cmd_count; 221e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger} 222e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 223e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellingervoid iscsit_discard_cr_cmds_by_expstatsn( 224e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger struct iscsi_conn_recovery *cr, 225e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger u32 exp_statsn) 226e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger{ 227e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger u32 dropped_count = 0; 228e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger struct iscsi_cmd *cmd, *cmd_tmp; 229e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger struct iscsi_session *sess = cr->sess; 230e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 231e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_lock(&cr->conn_recovery_cmd_lock); 232e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger list_for_each_entry_safe(cmd, cmd_tmp, 2332fbb471e7821e3a12334054cd90aa3f3edb22cc3Andy Grover &cr->conn_recovery_cmd_list, i_conn_node) { 234e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 235e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger if (((cmd->deferred_i_state != ISTATE_SENT_STATUS) && 236e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger (cmd->deferred_i_state != ISTATE_REMOVE)) || 237e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger (cmd->stat_sn >= exp_statsn)) { 238e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger continue; 239e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger } 240e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 241e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger dropped_count++; 242e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger pr_debug("Dropping Acknowledged ITT: 0x%08x, StatSN:" 243e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger " 0x%08x, CID: %hu.\n", cmd->init_task_tag, 244e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger cmd->stat_sn, cr->cid); 245e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 246e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger iscsit_remove_cmd_from_connection_recovery(cmd, sess); 247e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 248e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_unlock(&cr->conn_recovery_cmd_lock); 249aafc9d158b0039e600fc429246c7bb04a111fb26Nicholas Bellinger iscsit_free_cmd(cmd, true); 250e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_lock(&cr->conn_recovery_cmd_lock); 251e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger } 252e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_unlock(&cr->conn_recovery_cmd_lock); 253e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 254e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger pr_debug("Dropped %u total acknowledged commands on" 255e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger " CID: %hu less than old ExpStatSN: 0x%08x\n", 256e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger dropped_count, cr->cid, exp_statsn); 257e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 258e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger if (!cr->cmd_count) { 259e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger pr_debug("No commands to be reassigned for failed" 260e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger " connection CID: %hu on SID: %u\n", 261e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger cr->cid, sess->sid); 262e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger iscsit_remove_inactive_connection_recovery_entry(cr, sess); 263e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger iscsit_attach_active_connection_recovery_entry(sess, cr); 264e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger pr_debug("iSCSI connection recovery successful for CID:" 265e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger " %hu on SID: %u\n", cr->cid, sess->sid); 266e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger iscsit_remove_active_connection_recovery_entry(cr, sess); 267e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger } else { 268e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger iscsit_remove_inactive_connection_recovery_entry(cr, sess); 269e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger iscsit_attach_active_connection_recovery_entry(sess, cr); 270e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger } 271e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger} 272e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 273e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellingerint iscsit_discard_unacknowledged_ooo_cmdsns_for_conn(struct iscsi_conn *conn) 274e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger{ 275e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger u32 dropped_count = 0; 276e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger struct iscsi_cmd *cmd, *cmd_tmp; 277e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger struct iscsi_ooo_cmdsn *ooo_cmdsn, *ooo_cmdsn_tmp; 278e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger struct iscsi_session *sess = conn->sess; 279e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 280e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger mutex_lock(&sess->cmdsn_mutex); 281e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger list_for_each_entry_safe(ooo_cmdsn, ooo_cmdsn_tmp, 282e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger &sess->sess_ooo_cmdsn_list, ooo_list) { 283e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 284e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger if (ooo_cmdsn->cid != conn->cid) 285e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger continue; 286e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 287e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger dropped_count++; 288e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger pr_debug("Dropping unacknowledged CmdSN:" 289e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger " 0x%08x during connection recovery on CID: %hu\n", 290e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger ooo_cmdsn->cmdsn, conn->cid); 291e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger iscsit_remove_ooo_cmdsn(sess, ooo_cmdsn); 292e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger } 293e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger mutex_unlock(&sess->cmdsn_mutex); 294e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 295e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_lock_bh(&conn->cmd_lock); 2962fbb471e7821e3a12334054cd90aa3f3edb22cc3Andy Grover list_for_each_entry_safe(cmd, cmd_tmp, &conn->conn_cmd_list, i_conn_node) { 297e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger if (!(cmd->cmd_flags & ICF_OOO_CMDSN)) 298e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger continue; 299e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 3005159d763f60af693a3fcec45dce2021f66e528a4Nicholas Bellinger list_del_init(&cmd->i_conn_node); 301e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 302e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_unlock_bh(&conn->cmd_lock); 303aafc9d158b0039e600fc429246c7bb04a111fb26Nicholas Bellinger iscsit_free_cmd(cmd, true); 304e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_lock_bh(&conn->cmd_lock); 305e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger } 306e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_unlock_bh(&conn->cmd_lock); 307e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 308e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger pr_debug("Dropped %u total unacknowledged commands on CID:" 309e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger " %hu for ExpCmdSN: 0x%08x.\n", dropped_count, conn->cid, 310e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger sess->exp_cmd_sn); 311e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger return 0; 312e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger} 313e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 314e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellingerint iscsit_prepare_cmds_for_realligance(struct iscsi_conn *conn) 315e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger{ 316e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger u32 cmd_count = 0; 317e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger struct iscsi_cmd *cmd, *cmd_tmp; 318e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger struct iscsi_conn_recovery *cr; 319e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 320e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger /* 321e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger * Allocate an struct iscsi_conn_recovery for this connection. 322e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger * Each struct iscsi_cmd contains an struct iscsi_conn_recovery pointer 323e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger * (struct iscsi_cmd->cr) so we need to allocate this before preparing the 324e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger * connection's command list for connection recovery. 325e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger */ 326e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger cr = kzalloc(sizeof(struct iscsi_conn_recovery), GFP_KERNEL); 327e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger if (!cr) { 328e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger pr_err("Unable to allocate memory for" 329e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger " struct iscsi_conn_recovery.\n"); 330e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger return -1; 331e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger } 332e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger INIT_LIST_HEAD(&cr->cr_list); 333e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger INIT_LIST_HEAD(&cr->conn_recovery_cmd_list); 334e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_lock_init(&cr->conn_recovery_cmd_lock); 335e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger /* 336e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger * Only perform connection recovery on ISCSI_OP_SCSI_CMD or 337e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger * ISCSI_OP_NOOP_OUT opcodes. For all other opcodes call 3385159d763f60af693a3fcec45dce2021f66e528a4Nicholas Bellinger * list_del_init(&cmd->i_conn_node); to release the command to the 339e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger * session pool and remove it from the connection's list. 340e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger * 341e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger * Also stop the DataOUT timer, which will be restarted after 342e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger * sending the TMR response. 343e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger */ 344e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_lock_bh(&conn->cmd_lock); 3452fbb471e7821e3a12334054cd90aa3f3edb22cc3Andy Grover list_for_each_entry_safe(cmd, cmd_tmp, &conn->conn_cmd_list, i_conn_node) { 346e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 347e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger if ((cmd->iscsi_opcode != ISCSI_OP_SCSI_CMD) && 348e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger (cmd->iscsi_opcode != ISCSI_OP_NOOP_OUT)) { 349e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger pr_debug("Not performing realligence on" 350e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger " Opcode: 0x%02x, ITT: 0x%08x, CmdSN: 0x%08x," 351e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger " CID: %hu\n", cmd->iscsi_opcode, 352e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger cmd->init_task_tag, cmd->cmd_sn, conn->cid); 353e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 3545159d763f60af693a3fcec45dce2021f66e528a4Nicholas Bellinger list_del_init(&cmd->i_conn_node); 355e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_unlock_bh(&conn->cmd_lock); 356aafc9d158b0039e600fc429246c7bb04a111fb26Nicholas Bellinger iscsit_free_cmd(cmd, true); 357e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_lock_bh(&conn->cmd_lock); 358e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger continue; 359e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger } 360e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 361e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger /* 362e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger * Special case where commands greater than or equal to 363e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger * the session's ExpCmdSN are attached to the connection 364e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger * list but not to the out of order CmdSN list. The one 365e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger * obvious case is when a command with immediate data 366e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger * attached must only check the CmdSN against ExpCmdSN 367e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger * after the data is received. The special case below 368e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger * is when the connection fails before data is received, 369e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger * but also may apply to other PDUs, so it has been 370e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger * made generic here. 371e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger */ 372e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger if (!(cmd->cmd_flags & ICF_OOO_CMDSN) && !cmd->immediate_cmd && 37364fe4f4f181cc2fe97d4176bf6ee6e3725ae33ecRoland Dreier iscsi_sna_gte(cmd->cmd_sn, conn->sess->exp_cmd_sn)) { 3745159d763f60af693a3fcec45dce2021f66e528a4Nicholas Bellinger list_del_init(&cmd->i_conn_node); 375e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_unlock_bh(&conn->cmd_lock); 376aafc9d158b0039e600fc429246c7bb04a111fb26Nicholas Bellinger iscsit_free_cmd(cmd, true); 377e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_lock_bh(&conn->cmd_lock); 378e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger continue; 379e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger } 380e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 381e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger cmd_count++; 382e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger pr_debug("Preparing Opcode: 0x%02x, ITT: 0x%08x," 383e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger " CmdSN: 0x%08x, StatSN: 0x%08x, CID: %hu for" 384e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger " realligence.\n", cmd->iscsi_opcode, 385e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger cmd->init_task_tag, cmd->cmd_sn, cmd->stat_sn, 386e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger conn->cid); 387e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 388e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger cmd->deferred_i_state = cmd->i_state; 389e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger cmd->i_state = ISTATE_IN_CONNECTION_RECOVERY; 390e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 391e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger if (cmd->data_direction == DMA_TO_DEVICE) 392e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger iscsit_stop_dataout_timer(cmd); 393e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 394e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger cmd->sess = conn->sess; 395e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 3965159d763f60af693a3fcec45dce2021f66e528a4Nicholas Bellinger list_del_init(&cmd->i_conn_node); 397e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_unlock_bh(&conn->cmd_lock); 398e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 399e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger iscsit_free_all_datain_reqs(cmd); 400e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 401d270190a75e5b859c6d8eed8d4095fbb45f78264Nicholas Bellinger transport_wait_for_tasks(&cmd->se_cmd); 402e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger /* 403e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger * Add the struct iscsi_cmd to the connection recovery cmd list 404e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger */ 405e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_lock(&cr->conn_recovery_cmd_lock); 4062fbb471e7821e3a12334054cd90aa3f3edb22cc3Andy Grover list_add_tail(&cmd->i_conn_node, &cr->conn_recovery_cmd_list); 407e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_unlock(&cr->conn_recovery_cmd_lock); 408e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 409e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_lock_bh(&conn->cmd_lock); 410e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger cmd->cr = cr; 411e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger cmd->conn = NULL; 412e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger } 413e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger spin_unlock_bh(&conn->cmd_lock); 414e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger /* 415e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger * Fill in the various values in the preallocated struct iscsi_conn_recovery. 416e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger */ 417e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger cr->cid = conn->cid; 418e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger cr->cmd_count = cmd_count; 419e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger cr->maxrecvdatasegmentlength = conn->conn_ops->MaxRecvDataSegmentLength; 4201c417f39c1f896206f0d5bfec65cd61a8f5e69b8Nicholas Bellinger cr->maxxmitdatasegmentlength = conn->conn_ops->MaxXmitDataSegmentLength; 421e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger cr->sess = conn->sess; 422e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 423e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger iscsit_attach_inactive_connection_recovery_entry(conn->sess, cr); 424e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 425e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger return 0; 426e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger} 427e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 428e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellingerint iscsit_connection_recovery_transport_reset(struct iscsi_conn *conn) 429e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger{ 430e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger atomic_set(&conn->connection_recovery, 1); 431e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 432e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger if (iscsit_close_connection(conn) < 0) 433e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger return -1; 434e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger 435e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger return 0; 436e48354ce078c079996f89d715dfa44814b4eba01Nicholas Bellinger} 437