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