aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/target
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/target')
-rw-r--r--drivers/target/iscsi/iscsi_target.c10
-rw-r--r--drivers/target/iscsi/iscsi_target_erl1.c4
-rw-r--r--drivers/target/iscsi/iscsi_target_erl2.c16
-rw-r--r--drivers/target/iscsi/iscsi_target_tpg.c2
-rw-r--r--drivers/target/target_core_alua.c2
-rw-r--r--drivers/target/target_core_pr.c11
-rw-r--r--drivers/target/target_core_sbc.c39
-rw-r--r--drivers/target/target_core_spc.c4
-rw-r--r--drivers/target/target_core_transport.c8
9 files changed, 59 insertions, 37 deletions
diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c
index 7f1a7ce4b771..b83ec378d04f 100644
--- a/drivers/target/iscsi/iscsi_target.c
+++ b/drivers/target/iscsi/iscsi_target.c
@@ -785,7 +785,7 @@ static void iscsit_ack_from_expstatsn(struct iscsi_conn *conn, u32 exp_statsn)
785 spin_unlock_bh(&conn->cmd_lock); 785 spin_unlock_bh(&conn->cmd_lock);
786 786
787 list_for_each_entry_safe(cmd, cmd_p, &ack_list, i_conn_node) { 787 list_for_each_entry_safe(cmd, cmd_p, &ack_list, i_conn_node) {
788 list_del(&cmd->i_conn_node); 788 list_del_init(&cmd->i_conn_node);
789 iscsit_free_cmd(cmd, false); 789 iscsit_free_cmd(cmd, false);
790 } 790 }
791} 791}
@@ -3708,7 +3708,7 @@ iscsit_immediate_queue(struct iscsi_conn *conn, struct iscsi_cmd *cmd, int state
3708 break; 3708 break;
3709 case ISTATE_REMOVE: 3709 case ISTATE_REMOVE:
3710 spin_lock_bh(&conn->cmd_lock); 3710 spin_lock_bh(&conn->cmd_lock);
3711 list_del(&cmd->i_conn_node); 3711 list_del_init(&cmd->i_conn_node);
3712 spin_unlock_bh(&conn->cmd_lock); 3712 spin_unlock_bh(&conn->cmd_lock);
3713 3713
3714 iscsit_free_cmd(cmd, false); 3714 iscsit_free_cmd(cmd, false);
@@ -4151,7 +4151,7 @@ static void iscsit_release_commands_from_conn(struct iscsi_conn *conn)
4151 spin_lock_bh(&conn->cmd_lock); 4151 spin_lock_bh(&conn->cmd_lock);
4152 list_for_each_entry_safe(cmd, cmd_tmp, &conn->conn_cmd_list, i_conn_node) { 4152 list_for_each_entry_safe(cmd, cmd_tmp, &conn->conn_cmd_list, i_conn_node) {
4153 4153
4154 list_del(&cmd->i_conn_node); 4154 list_del_init(&cmd->i_conn_node);
4155 spin_unlock_bh(&conn->cmd_lock); 4155 spin_unlock_bh(&conn->cmd_lock);
4156 4156
4157 iscsit_increment_maxcmdsn(cmd, sess); 4157 iscsit_increment_maxcmdsn(cmd, sess);
@@ -4196,6 +4196,10 @@ int iscsit_close_connection(
4196 iscsit_stop_timers_for_cmds(conn); 4196 iscsit_stop_timers_for_cmds(conn);
4197 iscsit_stop_nopin_response_timer(conn); 4197 iscsit_stop_nopin_response_timer(conn);
4198 iscsit_stop_nopin_timer(conn); 4198 iscsit_stop_nopin_timer(conn);
4199
4200 if (conn->conn_transport->iscsit_wait_conn)
4201 conn->conn_transport->iscsit_wait_conn(conn);
4202
4199 iscsit_free_queue_reqs_for_conn(conn); 4203 iscsit_free_queue_reqs_for_conn(conn);
4200 4204
4201 /* 4205 /*
diff --git a/drivers/target/iscsi/iscsi_target_erl1.c b/drivers/target/iscsi/iscsi_target_erl1.c
index e048d6439f4a..cda4d80cfaef 100644
--- a/drivers/target/iscsi/iscsi_target_erl1.c
+++ b/drivers/target/iscsi/iscsi_target_erl1.c
@@ -507,7 +507,9 @@ int iscsit_handle_status_snack(
507 u32 last_statsn; 507 u32 last_statsn;
508 int found_cmd; 508 int found_cmd;
509 509
510 if (conn->exp_statsn > begrun) { 510 if (!begrun) {
511 begrun = conn->exp_statsn;
512 } else if (conn->exp_statsn > begrun) {
511 pr_err("Got Status SNACK Begrun: 0x%08x, RunLength:" 513 pr_err("Got Status SNACK Begrun: 0x%08x, RunLength:"
512 " 0x%08x but already got ExpStatSN: 0x%08x on CID:" 514 " 0x%08x but already got ExpStatSN: 0x%08x on CID:"
513 " %hu.\n", begrun, runlength, conn->exp_statsn, 515 " %hu.\n", begrun, runlength, conn->exp_statsn,
diff --git a/drivers/target/iscsi/iscsi_target_erl2.c b/drivers/target/iscsi/iscsi_target_erl2.c
index 33be1fb1df32..4ca8fd2a70db 100644
--- a/drivers/target/iscsi/iscsi_target_erl2.c
+++ b/drivers/target/iscsi/iscsi_target_erl2.c
@@ -138,7 +138,7 @@ void iscsit_free_connection_recovery_entires(struct iscsi_session *sess)
138 list_for_each_entry_safe(cmd, cmd_tmp, 138 list_for_each_entry_safe(cmd, cmd_tmp,
139 &cr->conn_recovery_cmd_list, i_conn_node) { 139 &cr->conn_recovery_cmd_list, i_conn_node) {
140 140
141 list_del(&cmd->i_conn_node); 141 list_del_init(&cmd->i_conn_node);
142 cmd->conn = NULL; 142 cmd->conn = NULL;
143 spin_unlock(&cr->conn_recovery_cmd_lock); 143 spin_unlock(&cr->conn_recovery_cmd_lock);
144 iscsit_free_cmd(cmd, true); 144 iscsit_free_cmd(cmd, true);
@@ -160,7 +160,7 @@ void iscsit_free_connection_recovery_entires(struct iscsi_session *sess)
160 list_for_each_entry_safe(cmd, cmd_tmp, 160 list_for_each_entry_safe(cmd, cmd_tmp,
161 &cr->conn_recovery_cmd_list, i_conn_node) { 161 &cr->conn_recovery_cmd_list, i_conn_node) {
162 162
163 list_del(&cmd->i_conn_node); 163 list_del_init(&cmd->i_conn_node);
164 cmd->conn = NULL; 164 cmd->conn = NULL;
165 spin_unlock(&cr->conn_recovery_cmd_lock); 165 spin_unlock(&cr->conn_recovery_cmd_lock);
166 iscsit_free_cmd(cmd, true); 166 iscsit_free_cmd(cmd, true);
@@ -216,7 +216,7 @@ int iscsit_remove_cmd_from_connection_recovery(
216 } 216 }
217 cr = cmd->cr; 217 cr = cmd->cr;
218 218
219 list_del(&cmd->i_conn_node); 219 list_del_init(&cmd->i_conn_node);
220 return --cr->cmd_count; 220 return --cr->cmd_count;
221} 221}
222 222
@@ -297,7 +297,7 @@ int iscsit_discard_unacknowledged_ooo_cmdsns_for_conn(struct iscsi_conn *conn)
297 if (!(cmd->cmd_flags & ICF_OOO_CMDSN)) 297 if (!(cmd->cmd_flags & ICF_OOO_CMDSN))
298 continue; 298 continue;
299 299
300 list_del(&cmd->i_conn_node); 300 list_del_init(&cmd->i_conn_node);
301 301
302 spin_unlock_bh(&conn->cmd_lock); 302 spin_unlock_bh(&conn->cmd_lock);
303 iscsit_free_cmd(cmd, true); 303 iscsit_free_cmd(cmd, true);
@@ -335,7 +335,7 @@ int iscsit_prepare_cmds_for_realligance(struct iscsi_conn *conn)
335 /* 335 /*
336 * Only perform connection recovery on ISCSI_OP_SCSI_CMD or 336 * Only perform connection recovery on ISCSI_OP_SCSI_CMD or
337 * ISCSI_OP_NOOP_OUT opcodes. For all other opcodes call 337 * ISCSI_OP_NOOP_OUT opcodes. For all other opcodes call
338 * list_del(&cmd->i_conn_node); to release the command to the 338 * list_del_init(&cmd->i_conn_node); to release the command to the
339 * session pool and remove it from the connection's list. 339 * session pool and remove it from the connection's list.
340 * 340 *
341 * Also stop the DataOUT timer, which will be restarted after 341 * Also stop the DataOUT timer, which will be restarted after
@@ -351,7 +351,7 @@ int iscsit_prepare_cmds_for_realligance(struct iscsi_conn *conn)
351 " CID: %hu\n", cmd->iscsi_opcode, 351 " CID: %hu\n", cmd->iscsi_opcode,
352 cmd->init_task_tag, cmd->cmd_sn, conn->cid); 352 cmd->init_task_tag, cmd->cmd_sn, conn->cid);
353 353
354 list_del(&cmd->i_conn_node); 354 list_del_init(&cmd->i_conn_node);
355 spin_unlock_bh(&conn->cmd_lock); 355 spin_unlock_bh(&conn->cmd_lock);
356 iscsit_free_cmd(cmd, true); 356 iscsit_free_cmd(cmd, true);
357 spin_lock_bh(&conn->cmd_lock); 357 spin_lock_bh(&conn->cmd_lock);
@@ -371,7 +371,7 @@ int iscsit_prepare_cmds_for_realligance(struct iscsi_conn *conn)
371 */ 371 */
372 if (!(cmd->cmd_flags & ICF_OOO_CMDSN) && !cmd->immediate_cmd && 372 if (!(cmd->cmd_flags & ICF_OOO_CMDSN) && !cmd->immediate_cmd &&
373 iscsi_sna_gte(cmd->cmd_sn, conn->sess->exp_cmd_sn)) { 373 iscsi_sna_gte(cmd->cmd_sn, conn->sess->exp_cmd_sn)) {
374 list_del(&cmd->i_conn_node); 374 list_del_init(&cmd->i_conn_node);
375 spin_unlock_bh(&conn->cmd_lock); 375 spin_unlock_bh(&conn->cmd_lock);
376 iscsit_free_cmd(cmd, true); 376 iscsit_free_cmd(cmd, true);
377 spin_lock_bh(&conn->cmd_lock); 377 spin_lock_bh(&conn->cmd_lock);
@@ -393,7 +393,7 @@ int iscsit_prepare_cmds_for_realligance(struct iscsi_conn *conn)
393 393
394 cmd->sess = conn->sess; 394 cmd->sess = conn->sess;
395 395
396 list_del(&cmd->i_conn_node); 396 list_del_init(&cmd->i_conn_node);
397 spin_unlock_bh(&conn->cmd_lock); 397 spin_unlock_bh(&conn->cmd_lock);
398 398
399 iscsit_free_all_datain_reqs(cmd); 399 iscsit_free_all_datain_reqs(cmd);
diff --git a/drivers/target/iscsi/iscsi_target_tpg.c b/drivers/target/iscsi/iscsi_target_tpg.c
index 39761837608d..44a5471de00f 100644
--- a/drivers/target/iscsi/iscsi_target_tpg.c
+++ b/drivers/target/iscsi/iscsi_target_tpg.c
@@ -137,7 +137,7 @@ struct iscsi_portal_group *iscsit_get_tpg_from_np(
137 list_for_each_entry(tpg, &tiqn->tiqn_tpg_list, tpg_list) { 137 list_for_each_entry(tpg, &tiqn->tiqn_tpg_list, tpg_list) {
138 138
139 spin_lock(&tpg->tpg_state_lock); 139 spin_lock(&tpg->tpg_state_lock);
140 if (tpg->tpg_state == TPG_STATE_FREE) { 140 if (tpg->tpg_state != TPG_STATE_ACTIVE) {
141 spin_unlock(&tpg->tpg_state_lock); 141 spin_unlock(&tpg->tpg_state_lock);
142 continue; 142 continue;
143 } 143 }
diff --git a/drivers/target/target_core_alua.c b/drivers/target/target_core_alua.c
index 12da9b386169..c3d9df6aaf5f 100644
--- a/drivers/target/target_core_alua.c
+++ b/drivers/target/target_core_alua.c
@@ -500,7 +500,7 @@ static inline int core_alua_state_lba_dependent(
500 500
501 if (segment_mult) { 501 if (segment_mult) {
502 u64 tmp = lba; 502 u64 tmp = lba;
503 start_lba = sector_div(tmp, segment_size * segment_mult); 503 start_lba = do_div(tmp, segment_size * segment_mult);
504 504
505 last_lba = first_lba + segment_size - 1; 505 last_lba = first_lba + segment_size - 1;
506 if (start_lba >= first_lba && 506 if (start_lba >= first_lba &&
diff --git a/drivers/target/target_core_pr.c b/drivers/target/target_core_pr.c
index 2f5d77932c80..3013287a2aaa 100644
--- a/drivers/target/target_core_pr.c
+++ b/drivers/target/target_core_pr.c
@@ -2009,7 +2009,7 @@ core_scsi3_emulate_pro_register(struct se_cmd *cmd, u64 res_key, u64 sa_res_key,
2009 struct t10_reservation *pr_tmpl = &dev->t10_pr; 2009 struct t10_reservation *pr_tmpl = &dev->t10_pr;
2010 unsigned char isid_buf[PR_REG_ISID_LEN], *isid_ptr = NULL; 2010 unsigned char isid_buf[PR_REG_ISID_LEN], *isid_ptr = NULL;
2011 sense_reason_t ret = TCM_NO_SENSE; 2011 sense_reason_t ret = TCM_NO_SENSE;
2012 int pr_holder = 0; 2012 int pr_holder = 0, type;
2013 2013
2014 if (!se_sess || !se_lun) { 2014 if (!se_sess || !se_lun) {
2015 pr_err("SPC-3 PR: se_sess || struct se_lun is NULL!\n"); 2015 pr_err("SPC-3 PR: se_sess || struct se_lun is NULL!\n");
@@ -2131,6 +2131,7 @@ core_scsi3_emulate_pro_register(struct se_cmd *cmd, u64 res_key, u64 sa_res_key,
2131 ret = TCM_RESERVATION_CONFLICT; 2131 ret = TCM_RESERVATION_CONFLICT;
2132 goto out; 2132 goto out;
2133 } 2133 }
2134 type = pr_reg->pr_res_type;
2134 2135
2135 spin_lock(&pr_tmpl->registration_lock); 2136 spin_lock(&pr_tmpl->registration_lock);
2136 /* 2137 /*
@@ -2161,6 +2162,7 @@ core_scsi3_emulate_pro_register(struct se_cmd *cmd, u64 res_key, u64 sa_res_key,
2161 * Release the calling I_T Nexus registration now.. 2162 * Release the calling I_T Nexus registration now..
2162 */ 2163 */
2163 __core_scsi3_free_registration(cmd->se_dev, pr_reg, NULL, 1); 2164 __core_scsi3_free_registration(cmd->se_dev, pr_reg, NULL, 1);
2165 pr_reg = NULL;
2164 2166
2165 /* 2167 /*
2166 * From spc4r17, section 5.7.11.3 Unregistering 2168 * From spc4r17, section 5.7.11.3 Unregistering
@@ -2174,8 +2176,8 @@ core_scsi3_emulate_pro_register(struct se_cmd *cmd, u64 res_key, u64 sa_res_key,
2174 * RESERVATIONS RELEASED. 2176 * RESERVATIONS RELEASED.
2175 */ 2177 */
2176 if (pr_holder && 2178 if (pr_holder &&
2177 (pr_reg->pr_res_type == PR_TYPE_WRITE_EXCLUSIVE_REGONLY || 2179 (type == PR_TYPE_WRITE_EXCLUSIVE_REGONLY ||
2178 pr_reg->pr_res_type == PR_TYPE_EXCLUSIVE_ACCESS_REGONLY)) { 2180 type == PR_TYPE_EXCLUSIVE_ACCESS_REGONLY)) {
2179 list_for_each_entry(pr_reg_p, 2181 list_for_each_entry(pr_reg_p,
2180 &pr_tmpl->registration_list, 2182 &pr_tmpl->registration_list,
2181 pr_reg_list) { 2183 pr_reg_list) {
@@ -2194,7 +2196,8 @@ core_scsi3_emulate_pro_register(struct se_cmd *cmd, u64 res_key, u64 sa_res_key,
2194 ret = core_scsi3_update_and_write_aptpl(dev, aptpl); 2196 ret = core_scsi3_update_and_write_aptpl(dev, aptpl);
2195 2197
2196out: 2198out:
2197 core_scsi3_put_pr_reg(pr_reg); 2199 if (pr_reg)
2200 core_scsi3_put_pr_reg(pr_reg);
2198 return ret; 2201 return ret;
2199} 2202}
2200 2203
diff --git a/drivers/target/target_core_sbc.c b/drivers/target/target_core_sbc.c
index fa3cae393e13..77e6531fb0a1 100644
--- a/drivers/target/target_core_sbc.c
+++ b/drivers/target/target_core_sbc.c
@@ -1074,23 +1074,36 @@ sbc_dif_copy_prot(struct se_cmd *cmd, unsigned int sectors, bool read,
1074 struct scatterlist *psg; 1074 struct scatterlist *psg;
1075 void *paddr, *addr; 1075 void *paddr, *addr;
1076 unsigned int i, len, left; 1076 unsigned int i, len, left;
1077 unsigned int offset = sg_off;
1077 1078
1078 left = sectors * dev->prot_length; 1079 left = sectors * dev->prot_length;
1079 1080
1080 for_each_sg(cmd->t_prot_sg, psg, cmd->t_prot_nents, i) { 1081 for_each_sg(cmd->t_prot_sg, psg, cmd->t_prot_nents, i) {
1082 unsigned int psg_len, copied = 0;
1081 1083
1082 len = min(psg->length, left);
1083 paddr = kmap_atomic(sg_page(psg)) + psg->offset; 1084 paddr = kmap_atomic(sg_page(psg)) + psg->offset;
1084 addr = kmap_atomic(sg_page(sg)) + sg_off; 1085 psg_len = min(left, psg->length);
1086 while (psg_len) {
1087 len = min(psg_len, sg->length - offset);
1088 addr = kmap_atomic(sg_page(sg)) + sg->offset + offset;
1085 1089
1086 if (read) 1090 if (read)
1087 memcpy(paddr, addr, len); 1091 memcpy(paddr + copied, addr, len);
1088 else 1092 else
1089 memcpy(addr, paddr, len); 1093 memcpy(addr, paddr + copied, len);
1090 1094
1091 left -= len; 1095 left -= len;
1096 offset += len;
1097 copied += len;
1098 psg_len -= len;
1099
1100 if (offset >= sg->length) {
1101 sg = sg_next(sg);
1102 offset = 0;
1103 }
1104 kunmap_atomic(addr);
1105 }
1092 kunmap_atomic(paddr); 1106 kunmap_atomic(paddr);
1093 kunmap_atomic(addr);
1094 } 1107 }
1095} 1108}
1096 1109
@@ -1155,7 +1168,7 @@ sbc_dif_verify_read(struct se_cmd *cmd, sector_t start, unsigned int sectors,
1155{ 1168{
1156 struct se_device *dev = cmd->se_dev; 1169 struct se_device *dev = cmd->se_dev;
1157 struct se_dif_v1_tuple *sdt; 1170 struct se_dif_v1_tuple *sdt;
1158 struct scatterlist *dsg; 1171 struct scatterlist *dsg, *psg = sg;
1159 sector_t sector = start; 1172 sector_t sector = start;
1160 void *daddr, *paddr; 1173 void *daddr, *paddr;
1161 int i, j, offset = sg_off; 1174 int i, j, offset = sg_off;
@@ -1163,14 +1176,14 @@ sbc_dif_verify_read(struct se_cmd *cmd, sector_t start, unsigned int sectors,
1163 1176
1164 for_each_sg(cmd->t_data_sg, dsg, cmd->t_data_nents, i) { 1177 for_each_sg(cmd->t_data_sg, dsg, cmd->t_data_nents, i) {
1165 daddr = kmap_atomic(sg_page(dsg)) + dsg->offset; 1178 daddr = kmap_atomic(sg_page(dsg)) + dsg->offset;
1166 paddr = kmap_atomic(sg_page(sg)) + sg->offset; 1179 paddr = kmap_atomic(sg_page(psg)) + sg->offset;
1167 1180
1168 for (j = 0; j < dsg->length; j += dev->dev_attrib.block_size) { 1181 for (j = 0; j < dsg->length; j += dev->dev_attrib.block_size) {
1169 1182
1170 if (offset >= sg->length) { 1183 if (offset >= psg->length) {
1171 kunmap_atomic(paddr); 1184 kunmap_atomic(paddr);
1172 sg = sg_next(sg); 1185 psg = sg_next(psg);
1173 paddr = kmap_atomic(sg_page(sg)) + sg->offset; 1186 paddr = kmap_atomic(sg_page(psg)) + psg->offset;
1174 offset = 0; 1187 offset = 0;
1175 } 1188 }
1176 1189
diff --git a/drivers/target/target_core_spc.c b/drivers/target/target_core_spc.c
index 43c5ca9878bc..3bebc71ea033 100644
--- a/drivers/target/target_core_spc.c
+++ b/drivers/target/target_core_spc.c
@@ -440,8 +440,8 @@ check_scsi_name:
440 padding = ((-scsi_target_len) & 3); 440 padding = ((-scsi_target_len) & 3);
441 if (padding) 441 if (padding)
442 scsi_target_len += padding; 442 scsi_target_len += padding;
443 if (scsi_name_len > 256) 443 if (scsi_target_len > 256)
444 scsi_name_len = 256; 444 scsi_target_len = 256;
445 445
446 buf[off-1] = scsi_target_len; 446 buf[off-1] = scsi_target_len;
447 off += scsi_target_len; 447 off += scsi_target_len;
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c
index c50fd9f11aab..2956250b7225 100644
--- a/drivers/target/target_core_transport.c
+++ b/drivers/target/target_core_transport.c
@@ -669,9 +669,6 @@ void target_complete_cmd(struct se_cmd *cmd, u8 scsi_status)
669 return; 669 return;
670 } 670 }
671 671
672 if (!success)
673 cmd->transport_state |= CMD_T_FAILED;
674
675 /* 672 /*
676 * Check for case where an explicit ABORT_TASK has been received 673 * Check for case where an explicit ABORT_TASK has been received
677 * and transport_wait_for_tasks() will be waiting for completion.. 674 * and transport_wait_for_tasks() will be waiting for completion..
@@ -681,7 +678,7 @@ void target_complete_cmd(struct se_cmd *cmd, u8 scsi_status)
681 spin_unlock_irqrestore(&cmd->t_state_lock, flags); 678 spin_unlock_irqrestore(&cmd->t_state_lock, flags);
682 complete(&cmd->t_transport_stop_comp); 679 complete(&cmd->t_transport_stop_comp);
683 return; 680 return;
684 } else if (cmd->transport_state & CMD_T_FAILED) { 681 } else if (!success) {
685 INIT_WORK(&cmd->work, target_complete_failure_work); 682 INIT_WORK(&cmd->work, target_complete_failure_work);
686 } else { 683 } else {
687 INIT_WORK(&cmd->work, target_complete_ok_work); 684 INIT_WORK(&cmd->work, target_complete_ok_work);
@@ -1604,6 +1601,9 @@ void transport_generic_request_failure(struct se_cmd *cmd,
1604 case TCM_CHECK_CONDITION_ABORT_CMD: 1601 case TCM_CHECK_CONDITION_ABORT_CMD:
1605 case TCM_CHECK_CONDITION_UNIT_ATTENTION: 1602 case TCM_CHECK_CONDITION_UNIT_ATTENTION:
1606 case TCM_CHECK_CONDITION_NOT_READY: 1603 case TCM_CHECK_CONDITION_NOT_READY:
1604 case TCM_LOGICAL_BLOCK_GUARD_CHECK_FAILED:
1605 case TCM_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED:
1606 case TCM_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED:
1607 break; 1607 break;
1608 case TCM_OUT_OF_RESOURCES: 1608 case TCM_OUT_OF_RESOURCES:
1609 sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; 1609 sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;