target: Update copyright information to 2012
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / target / target_core_tmr.c
CommitLineData
c66ac9db
NB
1/*******************************************************************************
2 * Filename: target_core_tmr.c
3 *
4 * This file contains SPC-3 task management infrastructure
5 *
fd9a11d7 6 * (c) Copyright 2009-2012 RisingTide Systems LLC.
c66ac9db
NB
7 *
8 * Nicholas A. Bellinger <nab@kernel.org>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23 *
24 ******************************************************************************/
25
c66ac9db
NB
26#include <linux/slab.h>
27#include <linux/spinlock.h>
28#include <linux/list.h>
c53181af 29#include <linux/export.h>
c66ac9db
NB
30#include <scsi/scsi.h>
31#include <scsi/scsi_cmnd.h>
32
33#include <target/target_core_base.h>
c4795fb2
CH
34#include <target/target_core_backend.h>
35#include <target/target_core_fabric.h>
c66ac9db
NB
36#include <target/target_core_configfs.h>
37
e26d99ae 38#include "target_core_internal.h"
c66ac9db
NB
39#include "target_core_alua.h"
40#include "target_core_pr.h"
41
c8e31f26 42int core_tmr_alloc_req(
c66ac9db
NB
43 struct se_cmd *se_cmd,
44 void *fabric_tmr_ptr,
dd503a5f
RD
45 u8 function,
46 gfp_t gfp_flags)
c66ac9db
NB
47{
48 struct se_tmr_req *tmr;
49
c8e31f26 50 tmr = kzalloc(sizeof(struct se_tmr_req), gfp_flags);
6708bb27
AG
51 if (!tmr) {
52 pr_err("Unable to allocate struct se_tmr_req\n");
c8e31f26 53 return -ENOMEM;
c66ac9db 54 }
c8e31f26
AG
55
56 se_cmd->se_cmd_flags |= SCF_SCSI_TMR_CDB;
57 se_cmd->se_tmr_req = tmr;
c66ac9db
NB
58 tmr->task_cmd = se_cmd;
59 tmr->fabric_tmr_ptr = fabric_tmr_ptr;
60 tmr->function = function;
61 INIT_LIST_HEAD(&tmr->tmr_list);
62
c8e31f26 63 return 0;
c66ac9db
NB
64}
65EXPORT_SYMBOL(core_tmr_alloc_req);
66
67void core_tmr_release_req(
68 struct se_tmr_req *tmr)
69{
70 struct se_device *dev = tmr->tmr_dev;
d050ffb9 71 unsigned long flags;
c66ac9db 72
7fd29aa9 73 if (!dev) {
c8e31f26 74 kfree(tmr);
7fd29aa9
NB
75 return;
76 }
77
d050ffb9 78 spin_lock_irqsave(&dev->se_tmr_lock, flags);
c66ac9db 79 list_del(&tmr->tmr_list);
d050ffb9 80 spin_unlock_irqrestore(&dev->se_tmr_lock, flags);
7fd29aa9 81
c8e31f26 82 kfree(tmr);
c66ac9db
NB
83}
84
85static void core_tmr_handle_tas_abort(
86 struct se_node_acl *tmr_nacl,
87 struct se_cmd *cmd,
88 int tas,
89 int fe_count)
90{
6708bb27 91 if (!fe_count) {
c66ac9db
NB
92 transport_cmd_finish_abort(cmd, 1);
93 return;
94 }
95 /*
96 * TASK ABORTED status (TAS) bit support
97 */
6708bb27 98 if ((tmr_nacl &&
c66ac9db
NB
99 (tmr_nacl == cmd->se_sess->se_node_acl)) || tas)
100 transport_send_task_abort(cmd);
101
102 transport_cmd_finish_abort(cmd, 0);
103}
104
feae8564
JE
105static int target_check_cdb_and_preempt(struct list_head *list,
106 struct se_cmd *cmd)
c165f69c 107{
feae8564 108 struct t10_pr_registration *reg;
c165f69c 109
feae8564
JE
110 if (!list)
111 return 0;
112 list_for_each_entry(reg, list, pr_reg_abort_list) {
113 if (reg->pr_res_key == cmd->pr_res_key)
c165f69c
JE
114 return 0;
115 }
116
117 return 1;
118}
119
3d28934a
NB
120void core_tmr_abort_task(
121 struct se_device *dev,
122 struct se_tmr_req *tmr,
123 struct se_session *se_sess)
124{
125 struct se_cmd *se_cmd, *tmp_cmd;
126 unsigned long flags;
127 int ref_tag;
128
129 spin_lock_irqsave(&se_sess->sess_cmd_lock, flags);
130 list_for_each_entry_safe(se_cmd, tmp_cmd,
131 &se_sess->sess_cmd_list, se_cmd_list) {
132
133 if (dev != se_cmd->se_dev)
134 continue;
135 ref_tag = se_cmd->se_tfo->get_task_tag(se_cmd);
136 if (tmr->ref_task_tag != ref_tag)
137 continue;
138
139 printk("ABORT_TASK: Found referenced %s task_tag: %u\n",
140 se_cmd->se_tfo->get_fabric_name(), ref_tag);
141
ab74b3d6 142 spin_lock(&se_cmd->t_state_lock);
3d28934a
NB
143 if (se_cmd->transport_state & CMD_T_COMPLETE) {
144 printk("ABORT_TASK: ref_tag: %u already complete, skipping\n", ref_tag);
ab74b3d6 145 spin_unlock(&se_cmd->t_state_lock);
3d28934a
NB
146 spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags);
147 goto out;
148 }
149 se_cmd->transport_state |= CMD_T_ABORTED;
ab74b3d6 150 spin_unlock(&se_cmd->t_state_lock);
3d28934a
NB
151
152 list_del_init(&se_cmd->se_cmd_list);
153 kref_get(&se_cmd->cmd_kref);
154 spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags);
155
156 cancel_work_sync(&se_cmd->work);
157 transport_wait_for_tasks(se_cmd);
158 /*
159 * Now send SAM_STAT_TASK_ABORTED status for the referenced
160 * se_cmd descriptor..
161 */
162 transport_send_task_abort(se_cmd);
163 /*
164 * Also deal with possible extra acknowledge reference..
165 */
166 if (se_cmd->se_cmd_flags & SCF_ACK_KREF)
167 target_put_sess_cmd(se_sess, se_cmd);
168
169 target_put_sess_cmd(se_sess, se_cmd);
170
171 printk("ABORT_TASK: Sending TMR_FUNCTION_COMPLETE for"
172 " ref_tag: %d\n", ref_tag);
173 tmr->response = TMR_FUNCTION_COMPLETE;
174 return;
175 }
176 spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags);
177
178out:
179 printk("ABORT_TASK: Sending TMR_TASK_DOES_NOT_EXIST for ref_tag: %d\n",
180 tmr->ref_task_tag);
181 tmr->response = TMR_TASK_DOES_NOT_EXIST;
182}
183
d050ffb9 184static void core_tmr_drain_tmr_list(
c66ac9db
NB
185 struct se_device *dev,
186 struct se_tmr_req *tmr,
d050ffb9 187 struct list_head *preempt_and_abort_list)
c66ac9db 188{
d050ffb9 189 LIST_HEAD(drain_tmr_list);
c66ac9db 190 struct se_tmr_req *tmr_p, *tmr_pp;
d050ffb9 191 struct se_cmd *cmd;
c66ac9db 192 unsigned long flags;
c66ac9db
NB
193 /*
194 * Release all pending and outgoing TMRs aside from the received
195 * LUN_RESET tmr..
196 */
d050ffb9 197 spin_lock_irqsave(&dev->se_tmr_lock, flags);
c66ac9db
NB
198 list_for_each_entry_safe(tmr_p, tmr_pp, &dev->dev_tmr_list, tmr_list) {
199 /*
200 * Allow the received TMR to return with FUNCTION_COMPLETE.
201 */
abc1fd4f 202 if (tmr_p == tmr)
c66ac9db
NB
203 continue;
204
205 cmd = tmr_p->task_cmd;
6708bb27
AG
206 if (!cmd) {
207 pr_err("Unable to locate struct se_cmd for TMR\n");
c66ac9db
NB
208 continue;
209 }
210 /*
211 * If this function was called with a valid pr_res_key
212 * parameter (eg: for PROUT PREEMPT_AND_ABORT service action
213 * skip non regisration key matching TMRs.
214 */
feae8564 215 if (target_check_cdb_and_preempt(preempt_and_abort_list, cmd))
c66ac9db 216 continue;
c66ac9db 217
d050ffb9 218 spin_lock(&cmd->t_state_lock);
7d680f3b 219 if (!(cmd->transport_state & CMD_T_ACTIVE)) {
d050ffb9 220 spin_unlock(&cmd->t_state_lock);
c66ac9db
NB
221 continue;
222 }
223 if (cmd->t_state == TRANSPORT_ISTATE_PROCESSING) {
d050ffb9 224 spin_unlock(&cmd->t_state_lock);
c66ac9db
NB
225 continue;
226 }
d050ffb9
NB
227 spin_unlock(&cmd->t_state_lock);
228
6eb40b2a 229 list_move_tail(&tmr_p->tmr_list, &drain_tmr_list);
d050ffb9
NB
230 }
231 spin_unlock_irqrestore(&dev->se_tmr_lock, flags);
232
abc1fd4f 233 list_for_each_entry_safe(tmr_p, tmr_pp, &drain_tmr_list, tmr_list) {
b8a11d73 234 list_del_init(&tmr_p->tmr_list);
abc1fd4f 235 cmd = tmr_p->task_cmd;
d050ffb9 236
6708bb27 237 pr_debug("LUN_RESET: %s releasing TMR %p Function: 0x%02x,"
c66ac9db 238 " Response: 0x%02x, t_state: %d\n",
abc1fd4f
JE
239 (preempt_and_abort_list) ? "Preempt" : "", tmr_p,
240 tmr_p->function, tmr_p->response, cmd->t_state);
c66ac9db 241
8dc52b54 242 transport_cmd_finish_abort(cmd, 1);
c66ac9db 243 }
d050ffb9
NB
244}
245
cf572a96 246static void core_tmr_drain_state_list(
d050ffb9
NB
247 struct se_device *dev,
248 struct se_cmd *prout_cmd,
249 struct se_node_acl *tmr_nacl,
250 int tas,
251 struct list_head *preempt_and_abort_list)
252{
253 LIST_HEAD(drain_task_list);
cf572a96 254 struct se_cmd *cmd, *next;
d050ffb9
NB
255 unsigned long flags;
256 int fe_count;
cf572a96 257
c66ac9db 258 /*
cf572a96
CH
259 * Complete outstanding commands with TASK_ABORTED SAM status.
260 *
c66ac9db
NB
261 * This is following sam4r17, section 5.6 Aborting commands, Table 38
262 * for TMR LUN_RESET:
263 *
264 * a) "Yes" indicates that each command that is aborted on an I_T nexus
265 * other than the one that caused the SCSI device condition is
266 * completed with TASK ABORTED status, if the TAS bit is set to one in
267 * the Control mode page (see SPC-4). "No" indicates that no status is
268 * returned for aborted commands.
269 *
270 * d) If the logical unit reset is caused by a particular I_T nexus
271 * (e.g., by a LOGICAL UNIT RESET task management function), then "yes"
272 * (TASK_ABORTED status) applies.
273 *
274 * Otherwise (e.g., if triggered by a hard reset), "no"
275 * (no TASK_ABORTED SAM status) applies.
276 *
277 * Note that this seems to be independent of TAS (Task Aborted Status)
278 * in the Control Mode Page.
279 */
280 spin_lock_irqsave(&dev->execute_task_lock, flags);
cf572a96 281 list_for_each_entry_safe(cmd, next, &dev->state_list, state_list) {
c66ac9db
NB
282 /*
283 * For PREEMPT_AND_ABORT usage, only process commands
284 * with a matching reservation key.
285 */
feae8564 286 if (target_check_cdb_and_preempt(preempt_and_abort_list, cmd))
c66ac9db 287 continue;
cf572a96 288
c66ac9db
NB
289 /*
290 * Not aborting PROUT PREEMPT_AND_ABORT CDB..
291 */
292 if (prout_cmd == cmd)
293 continue;
294
cf572a96
CH
295 list_move_tail(&cmd->state_list, &drain_task_list);
296 cmd->state_active = false;
d050ffb9
NB
297 }
298 spin_unlock_irqrestore(&dev->execute_task_lock, flags);
299
300 while (!list_empty(&drain_task_list)) {
cf572a96
CH
301 cmd = list_entry(drain_task_list.next, struct se_cmd, state_list);
302 list_del(&cmd->state_list);
c66ac9db 303
cf572a96 304 pr_debug("LUN_RESET: %s cmd: %p"
f2da9dbd
CH
305 " ITT/CmdSN: 0x%08x/0x%08x, i_state: %d, t_state: %d"
306 "cdb: 0x%02x\n",
cf572a96 307 (preempt_and_abort_list) ? "Preempt" : "", cmd,
e3d6f909
AG
308 cmd->se_tfo->get_task_tag(cmd), 0,
309 cmd->se_tfo->get_cmd_state(cmd), cmd->t_state,
f2da9dbd 310 cmd->t_task_cdb[0]);
6708bb27 311 pr_debug("LUN_RESET: ITT[0x%08x] - pr_res_key: 0x%016Lx"
785fdf70 312 " -- CMD_T_ACTIVE: %d"
7d680f3b 313 " CMD_T_STOP: %d CMD_T_SENT: %d\n",
e3d6f909 314 cmd->se_tfo->get_task_tag(cmd), cmd->pr_res_key,
7d680f3b
CH
315 (cmd->transport_state & CMD_T_ACTIVE) != 0,
316 (cmd->transport_state & CMD_T_STOP) != 0,
317 (cmd->transport_state & CMD_T_SENT) != 0);
c66ac9db 318
35e0e757
CH
319 /*
320 * If the command may be queued onto a workqueue cancel it now.
321 *
322 * This is equivalent to removal from the execute queue in the
323 * loop above, but we do it down here given that
324 * cancel_work_sync may block.
325 */
326 if (cmd->t_state == TRANSPORT_COMPLETE)
327 cancel_work_sync(&cmd->work);
328
cdbb70bb 329 spin_lock_irqsave(&cmd->t_state_lock, flags);
cf572a96 330 target_stop_cmd(cmd, &flags);
c66ac9db 331
a1d8b49a 332 fe_count = atomic_read(&cmd->t_fe_count);
c66ac9db 333
7d680f3b
CH
334 if (!(cmd->transport_state & CMD_T_ACTIVE)) {
335 pr_debug("LUN_RESET: got CMD_T_ACTIVE for"
cf572a96 336 " cdb: %p, t_fe_count: %d dev: %p\n", cmd,
c66ac9db 337 fe_count, dev);
7d680f3b 338 cmd->transport_state |= CMD_T_ABORTED;
d050ffb9 339 spin_unlock_irqrestore(&cmd->t_state_lock, flags);
c66ac9db 340
d050ffb9 341 core_tmr_handle_tas_abort(tmr_nacl, cmd, tas, fe_count);
c66ac9db
NB
342 continue;
343 }
cf572a96
CH
344 pr_debug("LUN_RESET: Got !CMD_T_ACTIVE for cdb: %p,"
345 " t_fe_count: %d dev: %p\n", cmd, fe_count, dev);
7d680f3b 346 cmd->transport_state |= CMD_T_ABORTED;
a1d8b49a 347 spin_unlock_irqrestore(&cmd->t_state_lock, flags);
c66ac9db 348
d050ffb9 349 core_tmr_handle_tas_abort(tmr_nacl, cmd, tas, fe_count);
c66ac9db 350 }
d050ffb9
NB
351}
352
d050ffb9
NB
353int core_tmr_lun_reset(
354 struct se_device *dev,
355 struct se_tmr_req *tmr,
356 struct list_head *preempt_and_abort_list,
357 struct se_cmd *prout_cmd)
358{
359 struct se_node_acl *tmr_nacl = NULL;
360 struct se_portal_group *tmr_tpg = NULL;
361 int tas;
362 /*
363 * TASK_ABORTED status bit, this is configurable via ConfigFS
364 * struct se_device attributes. spc4r17 section 7.4.6 Control mode page
365 *
366 * A task aborted status (TAS) bit set to zero specifies that aborted
367 * tasks shall be terminated by the device server without any response
368 * to the application client. A TAS bit set to one specifies that tasks
369 * aborted by the actions of an I_T nexus other than the I_T nexus on
370 * which the command was received shall be completed with TASK ABORTED
371 * status (see SAM-4).
372 */
0fd97ccf 373 tas = dev->dev_attrib.emulate_tas;
d050ffb9
NB
374 /*
375 * Determine if this se_tmr is coming from a $FABRIC_MOD
376 * or struct se_device passthrough..
377 */
378 if (tmr && tmr->task_cmd && tmr->task_cmd->se_sess) {
379 tmr_nacl = tmr->task_cmd->se_sess->se_node_acl;
380 tmr_tpg = tmr->task_cmd->se_sess->se_tpg;
381 if (tmr_nacl && tmr_tpg) {
382 pr_debug("LUN_RESET: TMR caller fabric: %s"
383 " initiator port %s\n",
384 tmr_tpg->se_tpg_tfo->get_fabric_name(),
385 tmr_nacl->initiatorname);
386 }
387 }
388 pr_debug("LUN_RESET: %s starting for [%s], tas: %d\n",
389 (preempt_and_abort_list) ? "Preempt" : "TMR",
390 dev->transport->name, tas);
391
392 core_tmr_drain_tmr_list(dev, tmr, preempt_and_abort_list);
cf572a96 393 core_tmr_drain_state_list(dev, prout_cmd, tmr_nacl, tas,
d050ffb9 394 preempt_and_abort_list);
af877292 395
c66ac9db
NB
396 /*
397 * Clear any legacy SPC-2 reservation when called during
398 * LOGICAL UNIT RESET
399 */
6708bb27 400 if (!preempt_and_abort_list &&
0fd97ccf 401 (dev->dev_reservation_flags & DRF_SPC2_RESERVATIONS)) {
c66ac9db
NB
402 spin_lock(&dev->dev_reservation_lock);
403 dev->dev_reserved_node_acl = NULL;
0fd97ccf 404 dev->dev_reservation_flags &= ~DRF_SPC2_RESERVATIONS;
c66ac9db 405 spin_unlock(&dev->dev_reservation_lock);
6708bb27 406 pr_debug("LUN_RESET: SCSI-2 Released reservation\n");
c66ac9db
NB
407 }
408
1e7de68c 409 spin_lock_irq(&dev->stats_lock);
c66ac9db 410 dev->num_resets++;
1e7de68c 411 spin_unlock_irq(&dev->stats_lock);
c66ac9db 412
6708bb27 413 pr_debug("LUN_RESET: %s for [%s] Complete\n",
c66ac9db 414 (preempt_and_abort_list) ? "Preempt" : "TMR",
e3d6f909 415 dev->transport->name);
c66ac9db
NB
416 return 0;
417}
d050ffb9 418