target: increase iblock task sizes
[deliverable/linux.git] / drivers / target / target_core_pr.c
CommitLineData
c66ac9db
NB
1/*******************************************************************************
2 * Filename: target_core_pr.c
3 *
4 * This file contains SPC-3 compliant persistent reservations and
5 * legacy SPC-2 reservations with compatible reservation handling (CRH=1)
6 *
7 * Copyright (c) 2009, 2010 Rising Tide Systems
8 * Copyright (c) 2009, 2010 Linux-iSCSI.org
9 *
10 * Nicholas A. Bellinger <nab@kernel.org>
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
25 *
26 ******************************************************************************/
27
c66ac9db
NB
28#include <linux/slab.h>
29#include <linux/spinlock.h>
30#include <linux/list.h>
31#include <scsi/scsi.h>
32#include <scsi/scsi_cmnd.h>
33#include <asm/unaligned.h>
34
35#include <target/target_core_base.h>
c4795fb2
CH
36#include <target/target_core_backend.h>
37#include <target/target_core_fabric.h>
c66ac9db
NB
38#include <target/target_core_configfs.h>
39
e26d99ae 40#include "target_core_internal.h"
c66ac9db
NB
41#include "target_core_pr.h"
42#include "target_core_ua.h"
43
44/*
45 * Used for Specify Initiator Ports Capable Bit (SPEC_I_PT)
46 */
47struct pr_transport_id_holder {
48 int dest_local_nexus;
49 struct t10_pr_registration *dest_pr_reg;
50 struct se_portal_group *dest_tpg;
51 struct se_node_acl *dest_node_acl;
52 struct se_dev_entry *dest_se_deve;
53 struct list_head dest_list;
54};
55
56int core_pr_dump_initiator_port(
57 struct t10_pr_registration *pr_reg,
58 char *buf,
59 u32 size)
60{
6708bb27 61 if (!pr_reg->isid_present_at_reg)
c66ac9db
NB
62 return 0;
63
64 snprintf(buf, size, ",i,0x%s", &pr_reg->pr_reg_isid[0]);
65 return 1;
66}
67
68static void __core_scsi3_complete_pro_release(struct se_device *, struct se_node_acl *,
69 struct t10_pr_registration *, int);
70
71static int core_scsi2_reservation_seq_non_holder(
72 struct se_cmd *cmd,
73 unsigned char *cdb,
74 u32 pr_reg_type)
75{
76 switch (cdb[0]) {
77 case INQUIRY:
78 case RELEASE:
79 case RELEASE_10:
80 return 0;
81 default:
82 return 1;
83 }
84
85 return 1;
86}
87
88static int core_scsi2_reservation_check(struct se_cmd *cmd, u32 *pr_reg_type)
89{
90 struct se_device *dev = cmd->se_dev;
91 struct se_session *sess = cmd->se_sess;
92 int ret;
93
6708bb27 94 if (!sess)
c66ac9db
NB
95 return 0;
96
97 spin_lock(&dev->dev_reservation_lock);
98 if (!dev->dev_reserved_node_acl || !sess) {
99 spin_unlock(&dev->dev_reservation_lock);
100 return 0;
101 }
102 if (dev->dev_reserved_node_acl != sess->se_node_acl) {
103 spin_unlock(&dev->dev_reservation_lock);
e3d6f909 104 return -EINVAL;
c66ac9db
NB
105 }
106 if (!(dev->dev_flags & DF_SPC2_RESERVATIONS_WITH_ISID)) {
107 spin_unlock(&dev->dev_reservation_lock);
108 return 0;
109 }
e3d6f909 110 ret = (dev->dev_res_bin_isid == sess->sess_bin_isid) ? 0 : -EINVAL;
c66ac9db
NB
111 spin_unlock(&dev->dev_reservation_lock);
112
113 return ret;
114}
115
eacac00c
CH
116static struct t10_pr_registration *core_scsi3_locate_pr_reg(struct se_device *,
117 struct se_node_acl *, struct se_session *);
118static void core_scsi3_put_pr_reg(struct t10_pr_registration *);
119
120static int target_check_scsi2_reservation_conflict(struct se_cmd *cmd, int *ret)
121{
122 struct se_session *se_sess = cmd->se_sess;
123 struct se_subsystem_dev *su_dev = cmd->se_dev->se_sub_dev;
124 struct t10_pr_registration *pr_reg;
125 struct t10_reservation *pr_tmpl = &su_dev->t10_pr;
126 int crh = (su_dev->t10_pr.res_type == SPC3_PERSISTENT_RESERVATIONS);
127 int conflict = 0;
128
129 if (!crh)
130 return false;
131
132 pr_reg = core_scsi3_locate_pr_reg(cmd->se_dev, se_sess->se_node_acl,
133 se_sess);
134 if (pr_reg) {
135 /*
136 * From spc4r17 5.7.3 Exceptions to SPC-2 RESERVE and RELEASE
137 * behavior
138 *
139 * A RESERVE(6) or RESERVE(10) command shall complete with GOOD
140 * status, but no reservation shall be established and the
141 * persistent reservation shall not be changed, if the command
142 * is received from a) and b) below.
143 *
144 * A RELEASE(6) or RELEASE(10) command shall complete with GOOD
145 * status, but the persistent reservation shall not be released,
146 * if the command is received from a) and b)
147 *
148 * a) An I_T nexus that is a persistent reservation holder; or
149 * b) An I_T nexus that is registered if a registrants only or
150 * all registrants type persistent reservation is present.
151 *
152 * In all other cases, a RESERVE(6) command, RESERVE(10) command,
153 * RELEASE(6) command, or RELEASE(10) command shall be processed
154 * as defined in SPC-2.
155 */
156 if (pr_reg->pr_res_holder) {
157 core_scsi3_put_pr_reg(pr_reg);
158 *ret = 0;
159 return false;
160 }
161 if ((pr_reg->pr_res_type == PR_TYPE_WRITE_EXCLUSIVE_REGONLY) ||
162 (pr_reg->pr_res_type == PR_TYPE_EXCLUSIVE_ACCESS_REGONLY) ||
163 (pr_reg->pr_res_type == PR_TYPE_WRITE_EXCLUSIVE_ALLREG) ||
164 (pr_reg->pr_res_type == PR_TYPE_EXCLUSIVE_ACCESS_ALLREG)) {
165 core_scsi3_put_pr_reg(pr_reg);
166 *ret = 0;
167 return true;
168 }
169 core_scsi3_put_pr_reg(pr_reg);
170 conflict = 1;
171 } else {
172 /*
173 * Following spc2r20 5.5.1 Reservations overview:
174 *
175 * If a logical unit has executed a PERSISTENT RESERVE OUT
176 * command with the REGISTER or the REGISTER AND IGNORE
177 * EXISTING KEY service action and is still registered by any
178 * initiator, all RESERVE commands and all RELEASE commands
179 * regardless of initiator shall conflict and shall terminate
180 * with a RESERVATION CONFLICT status.
181 */
182 spin_lock(&pr_tmpl->registration_lock);
183 conflict = (list_empty(&pr_tmpl->registration_list)) ? 0 : 1;
184 spin_unlock(&pr_tmpl->registration_lock);
185 }
186
187 if (conflict) {
188 pr_err("Received legacy SPC-2 RESERVE/RELEASE"
189 " while active SPC-3 registrations exist,"
190 " returning RESERVATION_CONFLICT\n");
03e98c9e 191 cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT;
eacac00c
CH
192 return true;
193 }
194
195 return false;
196}
197
e76a35d6 198int target_scsi2_reservation_release(struct se_task *task)
c66ac9db 199{
e76a35d6 200 struct se_cmd *cmd = task->task_se_cmd;
c66ac9db
NB
201 struct se_device *dev = cmd->se_dev;
202 struct se_session *sess = cmd->se_sess;
203 struct se_portal_group *tpg = sess->se_tpg;
d29a5b6a 204 int ret = 0;
c66ac9db 205
6708bb27 206 if (!sess || !tpg)
d29a5b6a 207 goto out;
eacac00c 208 if (target_check_scsi2_reservation_conflict(cmd, &ret))
d29a5b6a 209 goto out;
c66ac9db 210
d29a5b6a 211 ret = 0;
c66ac9db 212 spin_lock(&dev->dev_reservation_lock);
d29a5b6a
CH
213 if (!dev->dev_reserved_node_acl || !sess)
214 goto out_unlock;
215
216 if (dev->dev_reserved_node_acl != sess->se_node_acl)
217 goto out_unlock;
c66ac9db 218
c66ac9db
NB
219 dev->dev_reserved_node_acl = NULL;
220 dev->dev_flags &= ~DF_SPC2_RESERVATIONS;
221 if (dev->dev_flags & DF_SPC2_RESERVATIONS_WITH_ISID) {
222 dev->dev_res_bin_isid = 0;
223 dev->dev_flags &= ~DF_SPC2_RESERVATIONS_WITH_ISID;
224 }
6708bb27 225 pr_debug("SCSI-2 Released reservation for %s LUN: %u ->"
e3d6f909
AG
226 " MAPPED LUN: %u for %s\n", tpg->se_tpg_tfo->get_fabric_name(),
227 cmd->se_lun->unpacked_lun, cmd->se_deve->mapped_lun,
c66ac9db 228 sess->se_node_acl->initiatorname);
c66ac9db 229
d29a5b6a
CH
230out_unlock:
231 spin_unlock(&dev->dev_reservation_lock);
232out:
233 if (!ret) {
234 task->task_scsi_status = GOOD;
235 transport_complete_task(task, 1);
236 }
237 return ret;
c66ac9db
NB
238}
239
e76a35d6 240int target_scsi2_reservation_reserve(struct se_task *task)
c66ac9db 241{
e76a35d6 242 struct se_cmd *cmd = task->task_se_cmd;
c66ac9db
NB
243 struct se_device *dev = cmd->se_dev;
244 struct se_session *sess = cmd->se_sess;
245 struct se_portal_group *tpg = sess->se_tpg;
d29a5b6a 246 int ret = 0;
c66ac9db 247
a1d8b49a
AG
248 if ((cmd->t_task_cdb[1] & 0x01) &&
249 (cmd->t_task_cdb[1] & 0x02)) {
6708bb27 250 pr_err("LongIO and Obselete Bits set, returning"
c66ac9db 251 " ILLEGAL_REQUEST\n");
03e98c9e
NB
252 cmd->scsi_sense_reason = TCM_UNSUPPORTED_SCSI_OPCODE;
253 ret = -EINVAL;
d29a5b6a 254 goto out;
c66ac9db
NB
255 }
256 /*
257 * This is currently the case for target_core_mod passthrough struct se_cmd
258 * ops
259 */
6708bb27 260 if (!sess || !tpg)
d29a5b6a 261 goto out;
eacac00c 262 if (target_check_scsi2_reservation_conflict(cmd, &ret))
d29a5b6a 263 goto out;
c66ac9db 264
d29a5b6a 265 ret = 0;
c66ac9db
NB
266 spin_lock(&dev->dev_reservation_lock);
267 if (dev->dev_reserved_node_acl &&
268 (dev->dev_reserved_node_acl != sess->se_node_acl)) {
6708bb27 269 pr_err("SCSI-2 RESERVATION CONFLIFT for %s fabric\n",
e3d6f909 270 tpg->se_tpg_tfo->get_fabric_name());
6708bb27 271 pr_err("Original reserver LUN: %u %s\n",
e3d6f909 272 cmd->se_lun->unpacked_lun,
c66ac9db 273 dev->dev_reserved_node_acl->initiatorname);
6708bb27 274 pr_err("Current attempt - LUN: %u -> MAPPED LUN: %u"
e3d6f909 275 " from %s \n", cmd->se_lun->unpacked_lun,
c66ac9db
NB
276 cmd->se_deve->mapped_lun,
277 sess->se_node_acl->initiatorname);
03e98c9e
NB
278 cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT;
279 ret = -EINVAL;
d29a5b6a 280 goto out_unlock;
c66ac9db
NB
281 }
282
283 dev->dev_reserved_node_acl = sess->se_node_acl;
284 dev->dev_flags |= DF_SPC2_RESERVATIONS;
285 if (sess->sess_bin_isid != 0) {
286 dev->dev_res_bin_isid = sess->sess_bin_isid;
287 dev->dev_flags |= DF_SPC2_RESERVATIONS_WITH_ISID;
288 }
6708bb27 289 pr_debug("SCSI-2 Reserved %s LUN: %u -> MAPPED LUN: %u"
e3d6f909
AG
290 " for %s\n", tpg->se_tpg_tfo->get_fabric_name(),
291 cmd->se_lun->unpacked_lun, cmd->se_deve->mapped_lun,
c66ac9db 292 sess->se_node_acl->initiatorname);
c66ac9db 293
d29a5b6a
CH
294out_unlock:
295 spin_unlock(&dev->dev_reservation_lock);
296out:
297 if (!ret) {
298 task->task_scsi_status = GOOD;
299 transport_complete_task(task, 1);
300 }
301 return ret;
c66ac9db
NB
302}
303
c66ac9db
NB
304
305/*
306 * Begin SPC-3/SPC-4 Persistent Reservations emulation support
307 *
308 * This function is called by those initiator ports who are *NOT*
309 * the active PR reservation holder when a reservation is present.
310 */
311static int core_scsi3_pr_seq_non_holder(
312 struct se_cmd *cmd,
313 unsigned char *cdb,
314 u32 pr_reg_type)
315{
316 struct se_dev_entry *se_deve;
e3d6f909 317 struct se_session *se_sess = cmd->se_sess;
c66ac9db
NB
318 int other_cdb = 0, ignore_reg;
319 int registered_nexus = 0, ret = 1; /* Conflict by default */
320 int all_reg = 0, reg_only = 0; /* ALL_REG, REG_ONLY */
321 int we = 0; /* Write Exclusive */
322 int legacy = 0; /* Act like a legacy device and return
323 * RESERVATION CONFLICT on some CDBs */
324 /*
325 * A legacy SPC-2 reservation is being held.
326 */
327 if (cmd->se_dev->dev_flags & DF_SPC2_RESERVATIONS)
328 return core_scsi2_reservation_seq_non_holder(cmd,
329 cdb, pr_reg_type);
330
331 se_deve = &se_sess->se_node_acl->device_list[cmd->orig_fe_lun];
332 /*
333 * Determine if the registration should be ignored due to
334 * non-matching ISIDs in core_scsi3_pr_reservation_check().
335 */
336 ignore_reg = (pr_reg_type & 0x80000000);
337 if (ignore_reg)
338 pr_reg_type &= ~0x80000000;
339
340 switch (pr_reg_type) {
341 case PR_TYPE_WRITE_EXCLUSIVE:
342 we = 1;
343 case PR_TYPE_EXCLUSIVE_ACCESS:
344 /*
345 * Some commands are only allowed for the persistent reservation
346 * holder.
347 */
348 if ((se_deve->def_pr_registered) && !(ignore_reg))
349 registered_nexus = 1;
350 break;
351 case PR_TYPE_WRITE_EXCLUSIVE_REGONLY:
352 we = 1;
353 case PR_TYPE_EXCLUSIVE_ACCESS_REGONLY:
354 /*
355 * Some commands are only allowed for registered I_T Nexuses.
356 */
357 reg_only = 1;
358 if ((se_deve->def_pr_registered) && !(ignore_reg))
359 registered_nexus = 1;
360 break;
361 case PR_TYPE_WRITE_EXCLUSIVE_ALLREG:
362 we = 1;
363 case PR_TYPE_EXCLUSIVE_ACCESS_ALLREG:
364 /*
365 * Each registered I_T Nexus is a reservation holder.
366 */
367 all_reg = 1;
368 if ((se_deve->def_pr_registered) && !(ignore_reg))
369 registered_nexus = 1;
370 break;
371 default:
e3d6f909 372 return -EINVAL;
c66ac9db
NB
373 }
374 /*
375 * Referenced from spc4r17 table 45 for *NON* PR holder access
376 */
377 switch (cdb[0]) {
378 case SECURITY_PROTOCOL_IN:
379 if (registered_nexus)
380 return 0;
381 ret = (we) ? 0 : 1;
382 break;
383 case MODE_SENSE:
384 case MODE_SENSE_10:
385 case READ_ATTRIBUTE:
386 case READ_BUFFER:
387 case RECEIVE_DIAGNOSTIC:
388 if (legacy) {
389 ret = 1;
390 break;
391 }
392 if (registered_nexus) {
393 ret = 0;
394 break;
395 }
396 ret = (we) ? 0 : 1; /* Allowed Write Exclusive */
397 break;
398 case PERSISTENT_RESERVE_OUT:
399 /*
400 * This follows PERSISTENT_RESERVE_OUT service actions that
401 * are allowed in the presence of various reservations.
402 * See spc4r17, table 46
403 */
404 switch (cdb[1] & 0x1f) {
405 case PRO_CLEAR:
406 case PRO_PREEMPT:
407 case PRO_PREEMPT_AND_ABORT:
408 ret = (registered_nexus) ? 0 : 1;
409 break;
410 case PRO_REGISTER:
411 case PRO_REGISTER_AND_IGNORE_EXISTING_KEY:
412 ret = 0;
413 break;
414 case PRO_REGISTER_AND_MOVE:
415 case PRO_RESERVE:
416 ret = 1;
417 break;
418 case PRO_RELEASE:
419 ret = (registered_nexus) ? 0 : 1;
420 break;
421 default:
6708bb27 422 pr_err("Unknown PERSISTENT_RESERVE_OUT service"
c66ac9db 423 " action: 0x%02x\n", cdb[1] & 0x1f);
e3d6f909 424 return -EINVAL;
c66ac9db
NB
425 }
426 break;
427 case RELEASE:
428 case RELEASE_10:
eacac00c 429 /* Handled by CRH=1 in target_scsi2_reservation_release() */
c66ac9db
NB
430 ret = 0;
431 break;
432 case RESERVE:
433 case RESERVE_10:
eacac00c 434 /* Handled by CRH=1 in target_scsi2_reservation_reserve() */
c66ac9db
NB
435 ret = 0;
436 break;
437 case TEST_UNIT_READY:
438 ret = (legacy) ? 1 : 0; /* Conflict for legacy */
439 break;
440 case MAINTENANCE_IN:
441 switch (cdb[1] & 0x1f) {
442 case MI_MANAGEMENT_PROTOCOL_IN:
443 if (registered_nexus) {
444 ret = 0;
445 break;
446 }
447 ret = (we) ? 0 : 1; /* Allowed Write Exclusive */
448 break;
449 case MI_REPORT_SUPPORTED_OPERATION_CODES:
450 case MI_REPORT_SUPPORTED_TASK_MANAGEMENT_FUNCTIONS:
451 if (legacy) {
452 ret = 1;
453 break;
454 }
455 if (registered_nexus) {
456 ret = 0;
457 break;
458 }
459 ret = (we) ? 0 : 1; /* Allowed Write Exclusive */
460 break;
461 case MI_REPORT_ALIASES:
462 case MI_REPORT_IDENTIFYING_INFORMATION:
463 case MI_REPORT_PRIORITY:
464 case MI_REPORT_TARGET_PGS:
465 case MI_REPORT_TIMESTAMP:
466 ret = 0; /* Allowed */
467 break;
468 default:
6708bb27 469 pr_err("Unknown MI Service Action: 0x%02x\n",
c66ac9db 470 (cdb[1] & 0x1f));
e3d6f909 471 return -EINVAL;
c66ac9db
NB
472 }
473 break;
474 case ACCESS_CONTROL_IN:
475 case ACCESS_CONTROL_OUT:
476 case INQUIRY:
477 case LOG_SENSE:
478 case READ_MEDIA_SERIAL_NUMBER:
479 case REPORT_LUNS:
480 case REQUEST_SENSE:
6816966a 481 case PERSISTENT_RESERVE_IN:
c66ac9db
NB
482 ret = 0; /*/ Allowed CDBs */
483 break;
484 default:
485 other_cdb = 1;
486 break;
487 }
488 /*
25985edc 489 * Case where the CDB is explicitly allowed in the above switch
c66ac9db
NB
490 * statement.
491 */
6708bb27 492 if (!ret && !other_cdb) {
c66ac9db 493#if 0
6708bb27 494 pr_debug("Allowing explict CDB: 0x%02x for %s"
c66ac9db
NB
495 " reservation holder\n", cdb[0],
496 core_scsi3_pr_dump_type(pr_reg_type));
497#endif
498 return ret;
499 }
500 /*
501 * Check if write exclusive initiator ports *NOT* holding the
502 * WRITE_EXCLUSIVE_* reservation.
503 */
504 if ((we) && !(registered_nexus)) {
505 if (cmd->data_direction == DMA_TO_DEVICE) {
506 /*
507 * Conflict for write exclusive
508 */
6708bb27 509 pr_debug("%s Conflict for unregistered nexus"
c66ac9db
NB
510 " %s CDB: 0x%02x to %s reservation\n",
511 transport_dump_cmd_direction(cmd),
512 se_sess->se_node_acl->initiatorname, cdb[0],
513 core_scsi3_pr_dump_type(pr_reg_type));
514 return 1;
515 } else {
516 /*
517 * Allow non WRITE CDBs for all Write Exclusive
518 * PR TYPEs to pass for registered and
519 * non-registered_nexuxes NOT holding the reservation.
520 *
521 * We only make noise for the unregisterd nexuses,
522 * as we expect registered non-reservation holding
523 * nexuses to issue CDBs.
524 */
525#if 0
6708bb27
AG
526 if (!registered_nexus) {
527 pr_debug("Allowing implict CDB: 0x%02x"
c66ac9db
NB
528 " for %s reservation on unregistered"
529 " nexus\n", cdb[0],
530 core_scsi3_pr_dump_type(pr_reg_type));
531 }
532#endif
533 return 0;
534 }
535 } else if ((reg_only) || (all_reg)) {
536 if (registered_nexus) {
537 /*
538 * For PR_*_REG_ONLY and PR_*_ALL_REG reservations,
539 * allow commands from registered nexuses.
540 */
541#if 0
6708bb27 542 pr_debug("Allowing implict CDB: 0x%02x for %s"
c66ac9db
NB
543 " reservation\n", cdb[0],
544 core_scsi3_pr_dump_type(pr_reg_type));
545#endif
546 return 0;
547 }
548 }
6708bb27 549 pr_debug("%s Conflict for %sregistered nexus %s CDB: 0x%2x"
c66ac9db
NB
550 " for %s reservation\n", transport_dump_cmd_direction(cmd),
551 (registered_nexus) ? "" : "un",
552 se_sess->se_node_acl->initiatorname, cdb[0],
553 core_scsi3_pr_dump_type(pr_reg_type));
554
555 return 1; /* Conflict by default */
556}
557
558static u32 core_scsi3_pr_generation(struct se_device *dev)
559{
e3d6f909 560 struct se_subsystem_dev *su_dev = dev->se_sub_dev;
c66ac9db
NB
561 u32 prg;
562 /*
563 * PRGeneration field shall contain the value of a 32-bit wrapping
564 * counter mainted by the device server.
565 *
566 * Note that this is done regardless of Active Persist across
567 * Target PowerLoss (APTPL)
568 *
569 * See spc4r17 section 6.3.12 READ_KEYS service action
570 */
571 spin_lock(&dev->dev_reservation_lock);
e3d6f909 572 prg = su_dev->t10_pr.pr_generation++;
c66ac9db
NB
573 spin_unlock(&dev->dev_reservation_lock);
574
575 return prg;
576}
577
578static int core_scsi3_pr_reservation_check(
579 struct se_cmd *cmd,
580 u32 *pr_reg_type)
581{
582 struct se_device *dev = cmd->se_dev;
583 struct se_session *sess = cmd->se_sess;
584 int ret;
585
6708bb27 586 if (!sess)
c66ac9db
NB
587 return 0;
588 /*
589 * A legacy SPC-2 reservation is being held.
590 */
591 if (dev->dev_flags & DF_SPC2_RESERVATIONS)
592 return core_scsi2_reservation_check(cmd, pr_reg_type);
593
594 spin_lock(&dev->dev_reservation_lock);
6708bb27 595 if (!dev->dev_pr_res_holder) {
c66ac9db
NB
596 spin_unlock(&dev->dev_reservation_lock);
597 return 0;
598 }
599 *pr_reg_type = dev->dev_pr_res_holder->pr_res_type;
600 cmd->pr_res_key = dev->dev_pr_res_holder->pr_res_key;
601 if (dev->dev_pr_res_holder->pr_reg_nacl != sess->se_node_acl) {
602 spin_unlock(&dev->dev_reservation_lock);
e3d6f909 603 return -EINVAL;
c66ac9db 604 }
6708bb27 605 if (!dev->dev_pr_res_holder->isid_present_at_reg) {
c66ac9db
NB
606 spin_unlock(&dev->dev_reservation_lock);
607 return 0;
608 }
609 ret = (dev->dev_pr_res_holder->pr_reg_bin_isid ==
e3d6f909 610 sess->sess_bin_isid) ? 0 : -EINVAL;
c66ac9db
NB
611 /*
612 * Use bit in *pr_reg_type to notify ISID mismatch in
613 * core_scsi3_pr_seq_non_holder().
614 */
615 if (ret != 0)
616 *pr_reg_type |= 0x80000000;
617 spin_unlock(&dev->dev_reservation_lock);
618
619 return ret;
620}
621
622static struct t10_pr_registration *__core_scsi3_do_alloc_registration(
623 struct se_device *dev,
624 struct se_node_acl *nacl,
625 struct se_dev_entry *deve,
626 unsigned char *isid,
627 u64 sa_res_key,
628 int all_tg_pt,
629 int aptpl)
630{
e3d6f909 631 struct se_subsystem_dev *su_dev = dev->se_sub_dev;
c66ac9db
NB
632 struct t10_pr_registration *pr_reg;
633
634 pr_reg = kmem_cache_zalloc(t10_pr_reg_cache, GFP_ATOMIC);
6708bb27
AG
635 if (!pr_reg) {
636 pr_err("Unable to allocate struct t10_pr_registration\n");
c66ac9db
NB
637 return NULL;
638 }
639
e3d6f909 640 pr_reg->pr_aptpl_buf = kzalloc(su_dev->t10_pr.pr_aptpl_buf_len,
c66ac9db 641 GFP_ATOMIC);
6708bb27
AG
642 if (!pr_reg->pr_aptpl_buf) {
643 pr_err("Unable to allocate pr_reg->pr_aptpl_buf\n");
c66ac9db
NB
644 kmem_cache_free(t10_pr_reg_cache, pr_reg);
645 return NULL;
646 }
647
648 INIT_LIST_HEAD(&pr_reg->pr_reg_list);
649 INIT_LIST_HEAD(&pr_reg->pr_reg_abort_list);
650 INIT_LIST_HEAD(&pr_reg->pr_reg_aptpl_list);
651 INIT_LIST_HEAD(&pr_reg->pr_reg_atp_list);
652 INIT_LIST_HEAD(&pr_reg->pr_reg_atp_mem_list);
653 atomic_set(&pr_reg->pr_res_holders, 0);
654 pr_reg->pr_reg_nacl = nacl;
655 pr_reg->pr_reg_deve = deve;
656 pr_reg->pr_res_mapped_lun = deve->mapped_lun;
657 pr_reg->pr_aptpl_target_lun = deve->se_lun->unpacked_lun;
658 pr_reg->pr_res_key = sa_res_key;
659 pr_reg->pr_reg_all_tg_pt = all_tg_pt;
660 pr_reg->pr_reg_aptpl = aptpl;
661 pr_reg->pr_reg_tg_pt_lun = deve->se_lun;
662 /*
663 * If an ISID value for this SCSI Initiator Port exists,
664 * save it to the registration now.
665 */
666 if (isid != NULL) {
667 pr_reg->pr_reg_bin_isid = get_unaligned_be64(isid);
668 snprintf(pr_reg->pr_reg_isid, PR_REG_ISID_LEN, "%s", isid);
669 pr_reg->isid_present_at_reg = 1;
670 }
671
672 return pr_reg;
673}
674
675static int core_scsi3_lunacl_depend_item(struct se_dev_entry *);
676static void core_scsi3_lunacl_undepend_item(struct se_dev_entry *);
677
678/*
679 * Function used for handling PR registrations for ALL_TG_PT=1 and ALL_TG_PT=0
680 * modes.
681 */
682static struct t10_pr_registration *__core_scsi3_alloc_registration(
683 struct se_device *dev,
684 struct se_node_acl *nacl,
685 struct se_dev_entry *deve,
686 unsigned char *isid,
687 u64 sa_res_key,
688 int all_tg_pt,
689 int aptpl)
690{
691 struct se_dev_entry *deve_tmp;
692 struct se_node_acl *nacl_tmp;
693 struct se_port *port, *port_tmp;
694 struct target_core_fabric_ops *tfo = nacl->se_tpg->se_tpg_tfo;
695 struct t10_pr_registration *pr_reg, *pr_reg_atp, *pr_reg_tmp, *pr_reg_tmp_safe;
696 int ret;
697 /*
698 * Create a registration for the I_T Nexus upon which the
699 * PROUT REGISTER was received.
700 */
701 pr_reg = __core_scsi3_do_alloc_registration(dev, nacl, deve, isid,
702 sa_res_key, all_tg_pt, aptpl);
6708bb27 703 if (!pr_reg)
c66ac9db
NB
704 return NULL;
705 /*
706 * Return pointer to pr_reg for ALL_TG_PT=0
707 */
6708bb27 708 if (!all_tg_pt)
c66ac9db
NB
709 return pr_reg;
710 /*
711 * Create list of matching SCSI Initiator Port registrations
712 * for ALL_TG_PT=1
713 */
714 spin_lock(&dev->se_port_lock);
715 list_for_each_entry_safe(port, port_tmp, &dev->dev_sep_list, sep_list) {
716 atomic_inc(&port->sep_tg_pt_ref_cnt);
717 smp_mb__after_atomic_inc();
718 spin_unlock(&dev->se_port_lock);
719
720 spin_lock_bh(&port->sep_alua_lock);
721 list_for_each_entry(deve_tmp, &port->sep_alua_list,
722 alua_port_list) {
723 /*
724 * This pointer will be NULL for demo mode MappedLUNs
725 * that have not been make explict via a ConfigFS
726 * MappedLUN group for the SCSI Initiator Node ACL.
727 */
6708bb27 728 if (!deve_tmp->se_lun_acl)
c66ac9db
NB
729 continue;
730
731 nacl_tmp = deve_tmp->se_lun_acl->se_lun_nacl;
732 /*
733 * Skip the matching struct se_node_acl that is allocated
734 * above..
735 */
736 if (nacl == nacl_tmp)
737 continue;
738 /*
739 * Only perform PR registrations for target ports on
740 * the same fabric module as the REGISTER w/ ALL_TG_PT=1
741 * arrived.
742 */
743 if (tfo != nacl_tmp->se_tpg->se_tpg_tfo)
744 continue;
745 /*
746 * Look for a matching Initiator Node ACL in ASCII format
747 */
748 if (strcmp(nacl->initiatorname, nacl_tmp->initiatorname))
749 continue;
750
751 atomic_inc(&deve_tmp->pr_ref_count);
752 smp_mb__after_atomic_inc();
753 spin_unlock_bh(&port->sep_alua_lock);
754 /*
755 * Grab a configfs group dependency that is released
756 * for the exception path at label out: below, or upon
757 * completion of adding ALL_TG_PT=1 registrations in
758 * __core_scsi3_add_registration()
759 */
760 ret = core_scsi3_lunacl_depend_item(deve_tmp);
761 if (ret < 0) {
6708bb27 762 pr_err("core_scsi3_lunacl_depend"
c66ac9db
NB
763 "_item() failed\n");
764 atomic_dec(&port->sep_tg_pt_ref_cnt);
765 smp_mb__after_atomic_dec();
766 atomic_dec(&deve_tmp->pr_ref_count);
767 smp_mb__after_atomic_dec();
768 goto out;
769 }
770 /*
771 * Located a matching SCSI Initiator Port on a different
772 * port, allocate the pr_reg_atp and attach it to the
773 * pr_reg->pr_reg_atp_list that will be processed once
774 * the original *pr_reg is processed in
775 * __core_scsi3_add_registration()
776 */
777 pr_reg_atp = __core_scsi3_do_alloc_registration(dev,
778 nacl_tmp, deve_tmp, NULL,
779 sa_res_key, all_tg_pt, aptpl);
6708bb27 780 if (!pr_reg_atp) {
c66ac9db
NB
781 atomic_dec(&port->sep_tg_pt_ref_cnt);
782 smp_mb__after_atomic_dec();
783 atomic_dec(&deve_tmp->pr_ref_count);
784 smp_mb__after_atomic_dec();
785 core_scsi3_lunacl_undepend_item(deve_tmp);
786 goto out;
787 }
788
789 list_add_tail(&pr_reg_atp->pr_reg_atp_mem_list,
790 &pr_reg->pr_reg_atp_list);
791 spin_lock_bh(&port->sep_alua_lock);
792 }
793 spin_unlock_bh(&port->sep_alua_lock);
794
795 spin_lock(&dev->se_port_lock);
796 atomic_dec(&port->sep_tg_pt_ref_cnt);
797 smp_mb__after_atomic_dec();
798 }
799 spin_unlock(&dev->se_port_lock);
800
801 return pr_reg;
802out:
803 list_for_each_entry_safe(pr_reg_tmp, pr_reg_tmp_safe,
804 &pr_reg->pr_reg_atp_list, pr_reg_atp_mem_list) {
805 list_del(&pr_reg_tmp->pr_reg_atp_mem_list);
806 core_scsi3_lunacl_undepend_item(pr_reg_tmp->pr_reg_deve);
807 kmem_cache_free(t10_pr_reg_cache, pr_reg_tmp);
808 }
809 kmem_cache_free(t10_pr_reg_cache, pr_reg);
810 return NULL;
811}
812
813int core_scsi3_alloc_aptpl_registration(
e3d6f909 814 struct t10_reservation *pr_tmpl,
c66ac9db
NB
815 u64 sa_res_key,
816 unsigned char *i_port,
817 unsigned char *isid,
818 u32 mapped_lun,
819 unsigned char *t_port,
820 u16 tpgt,
821 u32 target_lun,
822 int res_holder,
823 int all_tg_pt,
824 u8 type)
825{
826 struct t10_pr_registration *pr_reg;
827
6708bb27
AG
828 if (!i_port || !t_port || !sa_res_key) {
829 pr_err("Illegal parameters for APTPL registration\n");
e3d6f909 830 return -EINVAL;
c66ac9db
NB
831 }
832
833 pr_reg = kmem_cache_zalloc(t10_pr_reg_cache, GFP_KERNEL);
6708bb27
AG
834 if (!pr_reg) {
835 pr_err("Unable to allocate struct t10_pr_registration\n");
e3d6f909 836 return -ENOMEM;
c66ac9db
NB
837 }
838 pr_reg->pr_aptpl_buf = kzalloc(pr_tmpl->pr_aptpl_buf_len, GFP_KERNEL);
839
840 INIT_LIST_HEAD(&pr_reg->pr_reg_list);
841 INIT_LIST_HEAD(&pr_reg->pr_reg_abort_list);
842 INIT_LIST_HEAD(&pr_reg->pr_reg_aptpl_list);
843 INIT_LIST_HEAD(&pr_reg->pr_reg_atp_list);
844 INIT_LIST_HEAD(&pr_reg->pr_reg_atp_mem_list);
845 atomic_set(&pr_reg->pr_res_holders, 0);
846 pr_reg->pr_reg_nacl = NULL;
847 pr_reg->pr_reg_deve = NULL;
848 pr_reg->pr_res_mapped_lun = mapped_lun;
849 pr_reg->pr_aptpl_target_lun = target_lun;
850 pr_reg->pr_res_key = sa_res_key;
851 pr_reg->pr_reg_all_tg_pt = all_tg_pt;
852 pr_reg->pr_reg_aptpl = 1;
853 pr_reg->pr_reg_tg_pt_lun = NULL;
854 pr_reg->pr_res_scope = 0; /* Always LUN_SCOPE */
855 pr_reg->pr_res_type = type;
856 /*
857 * If an ISID value had been saved in APTPL metadata for this
858 * SCSI Initiator Port, restore it now.
859 */
860 if (isid != NULL) {
861 pr_reg->pr_reg_bin_isid = get_unaligned_be64(isid);
862 snprintf(pr_reg->pr_reg_isid, PR_REG_ISID_LEN, "%s", isid);
863 pr_reg->isid_present_at_reg = 1;
864 }
865 /*
866 * Copy the i_port and t_port information from caller.
867 */
868 snprintf(pr_reg->pr_iport, PR_APTPL_MAX_IPORT_LEN, "%s", i_port);
869 snprintf(pr_reg->pr_tport, PR_APTPL_MAX_TPORT_LEN, "%s", t_port);
870 pr_reg->pr_reg_tpgt = tpgt;
871 /*
872 * Set pr_res_holder from caller, the pr_reg who is the reservation
873 * holder will get it's pointer set in core_scsi3_aptpl_reserve() once
874 * the Initiator Node LUN ACL from the fabric module is created for
875 * this registration.
876 */
877 pr_reg->pr_res_holder = res_holder;
878
879 list_add_tail(&pr_reg->pr_reg_aptpl_list, &pr_tmpl->aptpl_reg_list);
6708bb27 880 pr_debug("SPC-3 PR APTPL Successfully added registration%s from"
c66ac9db
NB
881 " metadata\n", (res_holder) ? "+reservation" : "");
882 return 0;
883}
884
885static void core_scsi3_aptpl_reserve(
886 struct se_device *dev,
887 struct se_portal_group *tpg,
888 struct se_node_acl *node_acl,
889 struct t10_pr_registration *pr_reg)
890{
891 char i_buf[PR_REG_ISID_ID_LEN];
892 int prf_isid;
893
894 memset(i_buf, 0, PR_REG_ISID_ID_LEN);
895 prf_isid = core_pr_dump_initiator_port(pr_reg, &i_buf[0],
896 PR_REG_ISID_ID_LEN);
897
898 spin_lock(&dev->dev_reservation_lock);
899 dev->dev_pr_res_holder = pr_reg;
900 spin_unlock(&dev->dev_reservation_lock);
901
6708bb27 902 pr_debug("SPC-3 PR [%s] Service Action: APTPL RESERVE created"
c66ac9db 903 " new reservation holder TYPE: %s ALL_TG_PT: %d\n",
e3d6f909 904 tpg->se_tpg_tfo->get_fabric_name(),
c66ac9db
NB
905 core_scsi3_pr_dump_type(pr_reg->pr_res_type),
906 (pr_reg->pr_reg_all_tg_pt) ? 1 : 0);
6708bb27 907 pr_debug("SPC-3 PR [%s] RESERVE Node: %s%s\n",
e3d6f909 908 tpg->se_tpg_tfo->get_fabric_name(), node_acl->initiatorname,
c66ac9db
NB
909 (prf_isid) ? &i_buf[0] : "");
910}
911
912static void __core_scsi3_add_registration(struct se_device *, struct se_node_acl *,
913 struct t10_pr_registration *, int, int);
914
915static int __core_scsi3_check_aptpl_registration(
916 struct se_device *dev,
917 struct se_portal_group *tpg,
918 struct se_lun *lun,
919 u32 target_lun,
920 struct se_node_acl *nacl,
921 struct se_dev_entry *deve)
922{
923 struct t10_pr_registration *pr_reg, *pr_reg_tmp;
e3d6f909 924 struct t10_reservation *pr_tmpl = &dev->se_sub_dev->t10_pr;
c66ac9db
NB
925 unsigned char i_port[PR_APTPL_MAX_IPORT_LEN];
926 unsigned char t_port[PR_APTPL_MAX_TPORT_LEN];
927 u16 tpgt;
928
929 memset(i_port, 0, PR_APTPL_MAX_IPORT_LEN);
930 memset(t_port, 0, PR_APTPL_MAX_TPORT_LEN);
931 /*
932 * Copy Initiator Port information from struct se_node_acl
933 */
934 snprintf(i_port, PR_APTPL_MAX_IPORT_LEN, "%s", nacl->initiatorname);
935 snprintf(t_port, PR_APTPL_MAX_TPORT_LEN, "%s",
e3d6f909
AG
936 tpg->se_tpg_tfo->tpg_get_wwn(tpg));
937 tpgt = tpg->se_tpg_tfo->tpg_get_tag(tpg);
c66ac9db
NB
938 /*
939 * Look for the matching registrations+reservation from those
940 * created from APTPL metadata. Note that multiple registrations
941 * may exist for fabrics that use ISIDs in their SCSI Initiator Port
942 * TransportIDs.
943 */
944 spin_lock(&pr_tmpl->aptpl_reg_lock);
945 list_for_each_entry_safe(pr_reg, pr_reg_tmp, &pr_tmpl->aptpl_reg_list,
946 pr_reg_aptpl_list) {
6708bb27 947 if (!strcmp(pr_reg->pr_iport, i_port) &&
c66ac9db
NB
948 (pr_reg->pr_res_mapped_lun == deve->mapped_lun) &&
949 !(strcmp(pr_reg->pr_tport, t_port)) &&
950 (pr_reg->pr_reg_tpgt == tpgt) &&
951 (pr_reg->pr_aptpl_target_lun == target_lun)) {
952
953 pr_reg->pr_reg_nacl = nacl;
954 pr_reg->pr_reg_deve = deve;
955 pr_reg->pr_reg_tg_pt_lun = lun;
956
957 list_del(&pr_reg->pr_reg_aptpl_list);
958 spin_unlock(&pr_tmpl->aptpl_reg_lock);
959 /*
960 * At this point all of the pointers in *pr_reg will
961 * be setup, so go ahead and add the registration.
962 */
963
964 __core_scsi3_add_registration(dev, nacl, pr_reg, 0, 0);
965 /*
966 * If this registration is the reservation holder,
967 * make that happen now..
968 */
969 if (pr_reg->pr_res_holder)
970 core_scsi3_aptpl_reserve(dev, tpg,
971 nacl, pr_reg);
972 /*
973 * Reenable pr_aptpl_active to accept new metadata
974 * updates once the SCSI device is active again..
975 */
976 spin_lock(&pr_tmpl->aptpl_reg_lock);
977 pr_tmpl->pr_aptpl_active = 1;
978 }
979 }
980 spin_unlock(&pr_tmpl->aptpl_reg_lock);
981
982 return 0;
983}
984
985int core_scsi3_check_aptpl_registration(
986 struct se_device *dev,
987 struct se_portal_group *tpg,
988 struct se_lun *lun,
989 struct se_lun_acl *lun_acl)
990{
e3d6f909 991 struct se_subsystem_dev *su_dev = dev->se_sub_dev;
c66ac9db
NB
992 struct se_node_acl *nacl = lun_acl->se_lun_nacl;
993 struct se_dev_entry *deve = &nacl->device_list[lun_acl->mapped_lun];
994
e3d6f909 995 if (su_dev->t10_pr.res_type != SPC3_PERSISTENT_RESERVATIONS)
c66ac9db
NB
996 return 0;
997
998 return __core_scsi3_check_aptpl_registration(dev, tpg, lun,
999 lun->unpacked_lun, nacl, deve);
1000}
1001
1002static void __core_scsi3_dump_registration(
1003 struct target_core_fabric_ops *tfo,
1004 struct se_device *dev,
1005 struct se_node_acl *nacl,
1006 struct t10_pr_registration *pr_reg,
1007 int register_type)
1008{
1009 struct se_portal_group *se_tpg = nacl->se_tpg;
1010 char i_buf[PR_REG_ISID_ID_LEN];
1011 int prf_isid;
1012
1013 memset(&i_buf[0], 0, PR_REG_ISID_ID_LEN);
1014 prf_isid = core_pr_dump_initiator_port(pr_reg, &i_buf[0],
1015 PR_REG_ISID_ID_LEN);
1016
6708bb27 1017 pr_debug("SPC-3 PR [%s] Service Action: REGISTER%s Initiator"
c66ac9db
NB
1018 " Node: %s%s\n", tfo->get_fabric_name(), (register_type == 2) ?
1019 "_AND_MOVE" : (register_type == 1) ?
1020 "_AND_IGNORE_EXISTING_KEY" : "", nacl->initiatorname,
1021 (prf_isid) ? i_buf : "");
6708bb27 1022 pr_debug("SPC-3 PR [%s] registration on Target Port: %s,0x%04x\n",
c66ac9db
NB
1023 tfo->get_fabric_name(), tfo->tpg_get_wwn(se_tpg),
1024 tfo->tpg_get_tag(se_tpg));
6708bb27 1025 pr_debug("SPC-3 PR [%s] for %s TCM Subsystem %s Object Target"
c66ac9db
NB
1026 " Port(s)\n", tfo->get_fabric_name(),
1027 (pr_reg->pr_reg_all_tg_pt) ? "ALL" : "SINGLE",
e3d6f909 1028 dev->transport->name);
6708bb27 1029 pr_debug("SPC-3 PR [%s] SA Res Key: 0x%016Lx PRgeneration:"
c66ac9db
NB
1030 " 0x%08x APTPL: %d\n", tfo->get_fabric_name(),
1031 pr_reg->pr_res_key, pr_reg->pr_res_generation,
1032 pr_reg->pr_reg_aptpl);
1033}
1034
1035/*
1036 * this function can be called with struct se_device->dev_reservation_lock
1037 * when register_move = 1
1038 */
1039static void __core_scsi3_add_registration(
1040 struct se_device *dev,
1041 struct se_node_acl *nacl,
1042 struct t10_pr_registration *pr_reg,
1043 int register_type,
1044 int register_move)
1045{
e3d6f909 1046 struct se_subsystem_dev *su_dev = dev->se_sub_dev;
c66ac9db
NB
1047 struct target_core_fabric_ops *tfo = nacl->se_tpg->se_tpg_tfo;
1048 struct t10_pr_registration *pr_reg_tmp, *pr_reg_tmp_safe;
e3d6f909 1049 struct t10_reservation *pr_tmpl = &dev->se_sub_dev->t10_pr;
c66ac9db
NB
1050
1051 /*
1052 * Increment PRgeneration counter for struct se_device upon a successful
1053 * REGISTER, see spc4r17 section 6.3.2 READ_KEYS service action
1054 *
1055 * Also, when register_move = 1 for PROUT REGISTER_AND_MOVE service
1056 * action, the struct se_device->dev_reservation_lock will already be held,
1057 * so we do not call core_scsi3_pr_generation() which grabs the lock
1058 * for the REGISTER.
1059 */
1060 pr_reg->pr_res_generation = (register_move) ?
e3d6f909 1061 su_dev->t10_pr.pr_generation++ :
c66ac9db
NB
1062 core_scsi3_pr_generation(dev);
1063
1064 spin_lock(&pr_tmpl->registration_lock);
1065 list_add_tail(&pr_reg->pr_reg_list, &pr_tmpl->registration_list);
1066 pr_reg->pr_reg_deve->def_pr_registered = 1;
1067
1068 __core_scsi3_dump_registration(tfo, dev, nacl, pr_reg, register_type);
1069 spin_unlock(&pr_tmpl->registration_lock);
1070 /*
1071 * Skip extra processing for ALL_TG_PT=0 or REGISTER_AND_MOVE.
1072 */
6708bb27 1073 if (!pr_reg->pr_reg_all_tg_pt || register_move)
c66ac9db
NB
1074 return;
1075 /*
1076 * Walk pr_reg->pr_reg_atp_list and add registrations for ALL_TG_PT=1
1077 * allocated in __core_scsi3_alloc_registration()
1078 */
1079 list_for_each_entry_safe(pr_reg_tmp, pr_reg_tmp_safe,
1080 &pr_reg->pr_reg_atp_list, pr_reg_atp_mem_list) {
1081 list_del(&pr_reg_tmp->pr_reg_atp_mem_list);
1082
1083 pr_reg_tmp->pr_res_generation = core_scsi3_pr_generation(dev);
1084
1085 spin_lock(&pr_tmpl->registration_lock);
1086 list_add_tail(&pr_reg_tmp->pr_reg_list,
1087 &pr_tmpl->registration_list);
1088 pr_reg_tmp->pr_reg_deve->def_pr_registered = 1;
1089
1090 __core_scsi3_dump_registration(tfo, dev,
1091 pr_reg_tmp->pr_reg_nacl, pr_reg_tmp,
1092 register_type);
1093 spin_unlock(&pr_tmpl->registration_lock);
1094 /*
1095 * Drop configfs group dependency reference from
1096 * __core_scsi3_alloc_registration()
1097 */
1098 core_scsi3_lunacl_undepend_item(pr_reg_tmp->pr_reg_deve);
1099 }
1100}
1101
1102static int core_scsi3_alloc_registration(
1103 struct se_device *dev,
1104 struct se_node_acl *nacl,
1105 struct se_dev_entry *deve,
1106 unsigned char *isid,
1107 u64 sa_res_key,
1108 int all_tg_pt,
1109 int aptpl,
1110 int register_type,
1111 int register_move)
1112{
1113 struct t10_pr_registration *pr_reg;
1114
1115 pr_reg = __core_scsi3_alloc_registration(dev, nacl, deve, isid,
1116 sa_res_key, all_tg_pt, aptpl);
6708bb27 1117 if (!pr_reg)
e3d6f909 1118 return -EPERM;
c66ac9db
NB
1119
1120 __core_scsi3_add_registration(dev, nacl, pr_reg,
1121 register_type, register_move);
1122 return 0;
1123}
1124
1125static struct t10_pr_registration *__core_scsi3_locate_pr_reg(
1126 struct se_device *dev,
1127 struct se_node_acl *nacl,
1128 unsigned char *isid)
1129{
e3d6f909 1130 struct t10_reservation *pr_tmpl = &dev->se_sub_dev->t10_pr;
c66ac9db
NB
1131 struct t10_pr_registration *pr_reg, *pr_reg_tmp;
1132 struct se_portal_group *tpg;
1133
1134 spin_lock(&pr_tmpl->registration_lock);
1135 list_for_each_entry_safe(pr_reg, pr_reg_tmp,
1136 &pr_tmpl->registration_list, pr_reg_list) {
1137 /*
1138 * First look for a matching struct se_node_acl
1139 */
1140 if (pr_reg->pr_reg_nacl != nacl)
1141 continue;
1142
1143 tpg = pr_reg->pr_reg_nacl->se_tpg;
1144 /*
1145 * If this registration does NOT contain a fabric provided
1146 * ISID, then we have found a match.
1147 */
6708bb27 1148 if (!pr_reg->isid_present_at_reg) {
c66ac9db
NB
1149 /*
1150 * Determine if this SCSI device server requires that
1151 * SCSI Intiatior TransportID w/ ISIDs is enforced
1152 * for fabric modules (iSCSI) requiring them.
1153 */
e3d6f909
AG
1154 if (tpg->se_tpg_tfo->sess_get_initiator_sid != NULL) {
1155 if (dev->se_sub_dev->se_dev_attrib.enforce_pr_isids)
c66ac9db
NB
1156 continue;
1157 }
1158 atomic_inc(&pr_reg->pr_res_holders);
1159 smp_mb__after_atomic_inc();
1160 spin_unlock(&pr_tmpl->registration_lock);
1161 return pr_reg;
1162 }
1163 /*
1164 * If the *pr_reg contains a fabric defined ISID for multi-value
1165 * SCSI Initiator Port TransportIDs, then we expect a valid
1166 * matching ISID to be provided by the local SCSI Initiator Port.
1167 */
6708bb27 1168 if (!isid)
c66ac9db
NB
1169 continue;
1170 if (strcmp(isid, pr_reg->pr_reg_isid))
1171 continue;
1172
1173 atomic_inc(&pr_reg->pr_res_holders);
1174 smp_mb__after_atomic_inc();
1175 spin_unlock(&pr_tmpl->registration_lock);
1176 return pr_reg;
1177 }
1178 spin_unlock(&pr_tmpl->registration_lock);
1179
1180 return NULL;
1181}
1182
1183static struct t10_pr_registration *core_scsi3_locate_pr_reg(
1184 struct se_device *dev,
1185 struct se_node_acl *nacl,
1186 struct se_session *sess)
1187{
1188 struct se_portal_group *tpg = nacl->se_tpg;
1189 unsigned char buf[PR_REG_ISID_LEN], *isid_ptr = NULL;
1190
e3d6f909 1191 if (tpg->se_tpg_tfo->sess_get_initiator_sid != NULL) {
c66ac9db 1192 memset(&buf[0], 0, PR_REG_ISID_LEN);
e3d6f909 1193 tpg->se_tpg_tfo->sess_get_initiator_sid(sess, &buf[0],
c66ac9db
NB
1194 PR_REG_ISID_LEN);
1195 isid_ptr = &buf[0];
1196 }
1197
1198 return __core_scsi3_locate_pr_reg(dev, nacl, isid_ptr);
1199}
1200
1201static void core_scsi3_put_pr_reg(struct t10_pr_registration *pr_reg)
1202{
1203 atomic_dec(&pr_reg->pr_res_holders);
1204 smp_mb__after_atomic_dec();
1205}
1206
1207static int core_scsi3_check_implict_release(
1208 struct se_device *dev,
1209 struct t10_pr_registration *pr_reg)
1210{
1211 struct se_node_acl *nacl = pr_reg->pr_reg_nacl;
1212 struct t10_pr_registration *pr_res_holder;
1213 int ret = 0;
1214
1215 spin_lock(&dev->dev_reservation_lock);
1216 pr_res_holder = dev->dev_pr_res_holder;
6708bb27 1217 if (!pr_res_holder) {
c66ac9db
NB
1218 spin_unlock(&dev->dev_reservation_lock);
1219 return ret;
1220 }
1221 if (pr_res_holder == pr_reg) {
1222 /*
1223 * Perform an implict RELEASE if the registration that
1224 * is being released is holding the reservation.
1225 *
1226 * From spc4r17, section 5.7.11.1:
1227 *
1228 * e) If the I_T nexus is the persistent reservation holder
1229 * and the persistent reservation is not an all registrants
1230 * type, then a PERSISTENT RESERVE OUT command with REGISTER
1231 * service action or REGISTER AND IGNORE EXISTING KEY
1232 * service action with the SERVICE ACTION RESERVATION KEY
1233 * field set to zero (see 5.7.11.3).
1234 */
1235 __core_scsi3_complete_pro_release(dev, nacl, pr_reg, 0);
1236 ret = 1;
1237 /*
1238 * For 'All Registrants' reservation types, all existing
1239 * registrations are still processed as reservation holders
1240 * in core_scsi3_pr_seq_non_holder() after the initial
1241 * reservation holder is implictly released here.
1242 */
1243 } else if (pr_reg->pr_reg_all_tg_pt &&
1244 (!strcmp(pr_res_holder->pr_reg_nacl->initiatorname,
1245 pr_reg->pr_reg_nacl->initiatorname)) &&
1246 (pr_res_holder->pr_res_key == pr_reg->pr_res_key)) {
6708bb27 1247 pr_err("SPC-3 PR: Unable to perform ALL_TG_PT=1"
c66ac9db
NB
1248 " UNREGISTER while existing reservation with matching"
1249 " key 0x%016Lx is present from another SCSI Initiator"
1250 " Port\n", pr_reg->pr_res_key);
e3d6f909 1251 ret = -EPERM;
c66ac9db
NB
1252 }
1253 spin_unlock(&dev->dev_reservation_lock);
1254
1255 return ret;
1256}
1257
1258/*
e3d6f909 1259 * Called with struct t10_reservation->registration_lock held.
c66ac9db
NB
1260 */
1261static void __core_scsi3_free_registration(
1262 struct se_device *dev,
1263 struct t10_pr_registration *pr_reg,
1264 struct list_head *preempt_and_abort_list,
1265 int dec_holders)
1266{
1267 struct target_core_fabric_ops *tfo =
1268 pr_reg->pr_reg_nacl->se_tpg->se_tpg_tfo;
e3d6f909 1269 struct t10_reservation *pr_tmpl = &dev->se_sub_dev->t10_pr;
c66ac9db
NB
1270 char i_buf[PR_REG_ISID_ID_LEN];
1271 int prf_isid;
1272
1273 memset(i_buf, 0, PR_REG_ISID_ID_LEN);
1274 prf_isid = core_pr_dump_initiator_port(pr_reg, &i_buf[0],
1275 PR_REG_ISID_ID_LEN);
1276
1277 pr_reg->pr_reg_deve->def_pr_registered = 0;
1278 pr_reg->pr_reg_deve->pr_res_key = 0;
1279 list_del(&pr_reg->pr_reg_list);
1280 /*
1281 * Caller accessing *pr_reg using core_scsi3_locate_pr_reg(),
1282 * so call core_scsi3_put_pr_reg() to decrement our reference.
1283 */
1284 if (dec_holders)
1285 core_scsi3_put_pr_reg(pr_reg);
1286 /*
1287 * Wait until all reference from any other I_T nexuses for this
1288 * *pr_reg have been released. Because list_del() is called above,
1289 * the last core_scsi3_put_pr_reg(pr_reg) will release this reference
1290 * count back to zero, and we release *pr_reg.
1291 */
1292 while (atomic_read(&pr_reg->pr_res_holders) != 0) {
1293 spin_unlock(&pr_tmpl->registration_lock);
6708bb27 1294 pr_debug("SPC-3 PR [%s] waiting for pr_res_holders\n",
c66ac9db
NB
1295 tfo->get_fabric_name());
1296 cpu_relax();
1297 spin_lock(&pr_tmpl->registration_lock);
1298 }
1299
6708bb27 1300 pr_debug("SPC-3 PR [%s] Service Action: UNREGISTER Initiator"
c66ac9db
NB
1301 " Node: %s%s\n", tfo->get_fabric_name(),
1302 pr_reg->pr_reg_nacl->initiatorname,
1303 (prf_isid) ? &i_buf[0] : "");
6708bb27 1304 pr_debug("SPC-3 PR [%s] for %s TCM Subsystem %s Object Target"
c66ac9db
NB
1305 " Port(s)\n", tfo->get_fabric_name(),
1306 (pr_reg->pr_reg_all_tg_pt) ? "ALL" : "SINGLE",
e3d6f909 1307 dev->transport->name);
6708bb27 1308 pr_debug("SPC-3 PR [%s] SA Res Key: 0x%016Lx PRgeneration:"
c66ac9db
NB
1309 " 0x%08x\n", tfo->get_fabric_name(), pr_reg->pr_res_key,
1310 pr_reg->pr_res_generation);
1311
6708bb27 1312 if (!preempt_and_abort_list) {
c66ac9db
NB
1313 pr_reg->pr_reg_deve = NULL;
1314 pr_reg->pr_reg_nacl = NULL;
1315 kfree(pr_reg->pr_aptpl_buf);
1316 kmem_cache_free(t10_pr_reg_cache, pr_reg);
1317 return;
1318 }
1319 /*
1320 * For PREEMPT_AND_ABORT, the list of *pr_reg in preempt_and_abort_list
1321 * are released once the ABORT_TASK_SET has completed..
1322 */
1323 list_add_tail(&pr_reg->pr_reg_abort_list, preempt_and_abort_list);
1324}
1325
1326void core_scsi3_free_pr_reg_from_nacl(
1327 struct se_device *dev,
1328 struct se_node_acl *nacl)
1329{
e3d6f909 1330 struct t10_reservation *pr_tmpl = &dev->se_sub_dev->t10_pr;
c66ac9db
NB
1331 struct t10_pr_registration *pr_reg, *pr_reg_tmp, *pr_res_holder;
1332 /*
1333 * If the passed se_node_acl matches the reservation holder,
1334 * release the reservation.
1335 */
1336 spin_lock(&dev->dev_reservation_lock);
1337 pr_res_holder = dev->dev_pr_res_holder;
1338 if ((pr_res_holder != NULL) &&
1339 (pr_res_holder->pr_reg_nacl == nacl))
1340 __core_scsi3_complete_pro_release(dev, nacl, pr_res_holder, 0);
1341 spin_unlock(&dev->dev_reservation_lock);
1342 /*
1343 * Release any registration associated with the struct se_node_acl.
1344 */
1345 spin_lock(&pr_tmpl->registration_lock);
1346 list_for_each_entry_safe(pr_reg, pr_reg_tmp,
1347 &pr_tmpl->registration_list, pr_reg_list) {
1348
1349 if (pr_reg->pr_reg_nacl != nacl)
1350 continue;
1351
1352 __core_scsi3_free_registration(dev, pr_reg, NULL, 0);
1353 }
1354 spin_unlock(&pr_tmpl->registration_lock);
1355}
1356
1357void core_scsi3_free_all_registrations(
1358 struct se_device *dev)
1359{
e3d6f909 1360 struct t10_reservation *pr_tmpl = &dev->se_sub_dev->t10_pr;
c66ac9db
NB
1361 struct t10_pr_registration *pr_reg, *pr_reg_tmp, *pr_res_holder;
1362
1363 spin_lock(&dev->dev_reservation_lock);
1364 pr_res_holder = dev->dev_pr_res_holder;
1365 if (pr_res_holder != NULL) {
1366 struct se_node_acl *pr_res_nacl = pr_res_holder->pr_reg_nacl;
1367 __core_scsi3_complete_pro_release(dev, pr_res_nacl,
1368 pr_res_holder, 0);
1369 }
1370 spin_unlock(&dev->dev_reservation_lock);
1371
1372 spin_lock(&pr_tmpl->registration_lock);
1373 list_for_each_entry_safe(pr_reg, pr_reg_tmp,
1374 &pr_tmpl->registration_list, pr_reg_list) {
1375
1376 __core_scsi3_free_registration(dev, pr_reg, NULL, 0);
1377 }
1378 spin_unlock(&pr_tmpl->registration_lock);
1379
1380 spin_lock(&pr_tmpl->aptpl_reg_lock);
1381 list_for_each_entry_safe(pr_reg, pr_reg_tmp, &pr_tmpl->aptpl_reg_list,
1382 pr_reg_aptpl_list) {
1383 list_del(&pr_reg->pr_reg_aptpl_list);
1384 kfree(pr_reg->pr_aptpl_buf);
1385 kmem_cache_free(t10_pr_reg_cache, pr_reg);
1386 }
1387 spin_unlock(&pr_tmpl->aptpl_reg_lock);
1388}
1389
1390static int core_scsi3_tpg_depend_item(struct se_portal_group *tpg)
1391{
e3d6f909 1392 return configfs_depend_item(tpg->se_tpg_tfo->tf_subsys,
c66ac9db
NB
1393 &tpg->tpg_group.cg_item);
1394}
1395
1396static void core_scsi3_tpg_undepend_item(struct se_portal_group *tpg)
1397{
e3d6f909 1398 configfs_undepend_item(tpg->se_tpg_tfo->tf_subsys,
c66ac9db
NB
1399 &tpg->tpg_group.cg_item);
1400
1401 atomic_dec(&tpg->tpg_pr_ref_count);
1402 smp_mb__after_atomic_dec();
1403}
1404
1405static int core_scsi3_nodeacl_depend_item(struct se_node_acl *nacl)
1406{
1407 struct se_portal_group *tpg = nacl->se_tpg;
1408
1409 if (nacl->dynamic_node_acl)
1410 return 0;
1411
e3d6f909 1412 return configfs_depend_item(tpg->se_tpg_tfo->tf_subsys,
c66ac9db
NB
1413 &nacl->acl_group.cg_item);
1414}
1415
1416static void core_scsi3_nodeacl_undepend_item(struct se_node_acl *nacl)
1417{
1418 struct se_portal_group *tpg = nacl->se_tpg;
1419
1420 if (nacl->dynamic_node_acl) {
1421 atomic_dec(&nacl->acl_pr_ref_count);
1422 smp_mb__after_atomic_dec();
1423 return;
1424 }
1425
e3d6f909 1426 configfs_undepend_item(tpg->se_tpg_tfo->tf_subsys,
c66ac9db
NB
1427 &nacl->acl_group.cg_item);
1428
1429 atomic_dec(&nacl->acl_pr_ref_count);
1430 smp_mb__after_atomic_dec();
1431}
1432
1433static int core_scsi3_lunacl_depend_item(struct se_dev_entry *se_deve)
1434{
1435 struct se_lun_acl *lun_acl = se_deve->se_lun_acl;
1436 struct se_node_acl *nacl;
1437 struct se_portal_group *tpg;
1438 /*
1439 * For nacl->dynamic_node_acl=1
1440 */
6708bb27 1441 if (!lun_acl)
c66ac9db
NB
1442 return 0;
1443
1444 nacl = lun_acl->se_lun_nacl;
1445 tpg = nacl->se_tpg;
1446
e3d6f909 1447 return configfs_depend_item(tpg->se_tpg_tfo->tf_subsys,
c66ac9db
NB
1448 &lun_acl->se_lun_group.cg_item);
1449}
1450
1451static void core_scsi3_lunacl_undepend_item(struct se_dev_entry *se_deve)
1452{
1453 struct se_lun_acl *lun_acl = se_deve->se_lun_acl;
1454 struct se_node_acl *nacl;
1455 struct se_portal_group *tpg;
1456 /*
1457 * For nacl->dynamic_node_acl=1
1458 */
6708bb27 1459 if (!lun_acl) {
c66ac9db
NB
1460 atomic_dec(&se_deve->pr_ref_count);
1461 smp_mb__after_atomic_dec();
1462 return;
1463 }
1464 nacl = lun_acl->se_lun_nacl;
1465 tpg = nacl->se_tpg;
1466
e3d6f909 1467 configfs_undepend_item(tpg->se_tpg_tfo->tf_subsys,
c66ac9db
NB
1468 &lun_acl->se_lun_group.cg_item);
1469
1470 atomic_dec(&se_deve->pr_ref_count);
1471 smp_mb__after_atomic_dec();
1472}
1473
1474static int core_scsi3_decode_spec_i_port(
1475 struct se_cmd *cmd,
1476 struct se_portal_group *tpg,
1477 unsigned char *l_isid,
1478 u64 sa_res_key,
1479 int all_tg_pt,
1480 int aptpl)
1481{
5951146d 1482 struct se_device *dev = cmd->se_dev;
c66ac9db
NB
1483 struct se_port *tmp_port;
1484 struct se_portal_group *dest_tpg = NULL, *tmp_tpg;
e3d6f909 1485 struct se_session *se_sess = cmd->se_sess;
c66ac9db
NB
1486 struct se_node_acl *dest_node_acl = NULL;
1487 struct se_dev_entry *dest_se_deve = NULL, *local_se_deve;
1488 struct t10_pr_registration *dest_pr_reg, *local_pr_reg, *pr_reg_e;
1489 struct t10_pr_registration *pr_reg_tmp, *pr_reg_tmp_safe;
1490 struct list_head tid_dest_list;
1491 struct pr_transport_id_holder *tidh_new, *tidh, *tidh_tmp;
1492 struct target_core_fabric_ops *tmp_tf_ops;
05d1c7c0 1493 unsigned char *buf;
c66ac9db
NB
1494 unsigned char *ptr, *i_str = NULL, proto_ident, tmp_proto_ident;
1495 char *iport_ptr = NULL, dest_iport[64], i_buf[PR_REG_ISID_ID_LEN];
1496 u32 tpdl, tid_len = 0;
1497 int ret, dest_local_nexus, prf_isid;
1498 u32 dest_rtpi = 0;
1499
1500 memset(dest_iport, 0, 64);
1501 INIT_LIST_HEAD(&tid_dest_list);
1502
1503 local_se_deve = &se_sess->se_node_acl->device_list[cmd->orig_fe_lun];
1504 /*
1505 * Allocate a struct pr_transport_id_holder and setup the
1506 * local_node_acl and local_se_deve pointers and add to
1507 * struct list_head tid_dest_list for add registration
1508 * processing in the loop of tid_dest_list below.
1509 */
1510 tidh_new = kzalloc(sizeof(struct pr_transport_id_holder), GFP_KERNEL);
6708bb27
AG
1511 if (!tidh_new) {
1512 pr_err("Unable to allocate tidh_new\n");
03e98c9e
NB
1513 cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
1514 return -EINVAL;
c66ac9db
NB
1515 }
1516 INIT_LIST_HEAD(&tidh_new->dest_list);
1517 tidh_new->dest_tpg = tpg;
1518 tidh_new->dest_node_acl = se_sess->se_node_acl;
1519 tidh_new->dest_se_deve = local_se_deve;
1520
5951146d 1521 local_pr_reg = __core_scsi3_alloc_registration(cmd->se_dev,
c66ac9db
NB
1522 se_sess->se_node_acl, local_se_deve, l_isid,
1523 sa_res_key, all_tg_pt, aptpl);
6708bb27 1524 if (!local_pr_reg) {
c66ac9db 1525 kfree(tidh_new);
03e98c9e
NB
1526 cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
1527 return -ENOMEM;
c66ac9db
NB
1528 }
1529 tidh_new->dest_pr_reg = local_pr_reg;
1530 /*
1531 * The local I_T nexus does not hold any configfs dependances,
1532 * so we set tid_h->dest_local_nexus=1 to prevent the
1533 * configfs_undepend_item() calls in the tid_dest_list loops below.
1534 */
1535 tidh_new->dest_local_nexus = 1;
1536 list_add_tail(&tidh_new->dest_list, &tid_dest_list);
05d1c7c0 1537
4949314c 1538 buf = transport_kmap_data_sg(cmd);
c66ac9db
NB
1539 /*
1540 * For a PERSISTENT RESERVE OUT specify initiator ports payload,
1541 * first extract TransportID Parameter Data Length, and make sure
1542 * the value matches up to the SCSI expected data transfer length.
1543 */
1544 tpdl = (buf[24] & 0xff) << 24;
1545 tpdl |= (buf[25] & 0xff) << 16;
1546 tpdl |= (buf[26] & 0xff) << 8;
1547 tpdl |= buf[27] & 0xff;
1548
1549 if ((tpdl + 28) != cmd->data_length) {
6708bb27 1550 pr_err("SPC-3 PR: Illegal tpdl: %u + 28 byte header"
c66ac9db
NB
1551 " does not equal CDB data_length: %u\n", tpdl,
1552 cmd->data_length);
03e98c9e
NB
1553 cmd->scsi_sense_reason = TCM_INVALID_PARAMETER_LIST;
1554 ret = -EINVAL;
c66ac9db
NB
1555 goto out;
1556 }
1557 /*
1558 * Start processing the received transport IDs using the
1559 * receiving I_T Nexus portal's fabric dependent methods to
1560 * obtain the SCSI Initiator Port/Device Identifiers.
1561 */
1562 ptr = &buf[28];
1563
1564 while (tpdl > 0) {
1565 proto_ident = (ptr[0] & 0x0f);
1566 dest_tpg = NULL;
1567
1568 spin_lock(&dev->se_port_lock);
1569 list_for_each_entry(tmp_port, &dev->dev_sep_list, sep_list) {
1570 tmp_tpg = tmp_port->sep_tpg;
6708bb27 1571 if (!tmp_tpg)
c66ac9db 1572 continue;
e3d6f909 1573 tmp_tf_ops = tmp_tpg->se_tpg_tfo;
6708bb27 1574 if (!tmp_tf_ops)
c66ac9db 1575 continue;
6708bb27
AG
1576 if (!tmp_tf_ops->get_fabric_proto_ident ||
1577 !tmp_tf_ops->tpg_parse_pr_out_transport_id)
c66ac9db
NB
1578 continue;
1579 /*
1580 * Look for the matching proto_ident provided by
1581 * the received TransportID
1582 */
1583 tmp_proto_ident = tmp_tf_ops->get_fabric_proto_ident(tmp_tpg);
1584 if (tmp_proto_ident != proto_ident)
1585 continue;
1586 dest_rtpi = tmp_port->sep_rtpi;
1587
1588 i_str = tmp_tf_ops->tpg_parse_pr_out_transport_id(
1589 tmp_tpg, (const char *)ptr, &tid_len,
1590 &iport_ptr);
6708bb27 1591 if (!i_str)
c66ac9db
NB
1592 continue;
1593
1594 atomic_inc(&tmp_tpg->tpg_pr_ref_count);
1595 smp_mb__after_atomic_inc();
1596 spin_unlock(&dev->se_port_lock);
1597
1598 ret = core_scsi3_tpg_depend_item(tmp_tpg);
1599 if (ret != 0) {
6708bb27 1600 pr_err(" core_scsi3_tpg_depend_item()"
c66ac9db
NB
1601 " for tmp_tpg\n");
1602 atomic_dec(&tmp_tpg->tpg_pr_ref_count);
1603 smp_mb__after_atomic_dec();
03e98c9e
NB
1604 cmd->scsi_sense_reason =
1605 TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
1606 ret = -EINVAL;
c66ac9db
NB
1607 goto out;
1608 }
1609 /*
1610 * Locate the desination initiator ACL to be registered
1611 * from the decoded fabric module specific TransportID
1612 * at *i_str.
1613 */
28638887 1614 spin_lock_irq(&tmp_tpg->acl_node_lock);
c66ac9db
NB
1615 dest_node_acl = __core_tpg_get_initiator_node_acl(
1616 tmp_tpg, i_str);
1617 if (dest_node_acl) {
1618 atomic_inc(&dest_node_acl->acl_pr_ref_count);
1619 smp_mb__after_atomic_inc();
1620 }
28638887 1621 spin_unlock_irq(&tmp_tpg->acl_node_lock);
c66ac9db 1622
6708bb27 1623 if (!dest_node_acl) {
c66ac9db
NB
1624 core_scsi3_tpg_undepend_item(tmp_tpg);
1625 spin_lock(&dev->se_port_lock);
1626 continue;
1627 }
1628
1629 ret = core_scsi3_nodeacl_depend_item(dest_node_acl);
1630 if (ret != 0) {
6708bb27 1631 pr_err("configfs_depend_item() failed"
c66ac9db
NB
1632 " for dest_node_acl->acl_group\n");
1633 atomic_dec(&dest_node_acl->acl_pr_ref_count);
1634 smp_mb__after_atomic_dec();
1635 core_scsi3_tpg_undepend_item(tmp_tpg);
03e98c9e
NB
1636 cmd->scsi_sense_reason =
1637 TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
1638 ret = -EINVAL;
c66ac9db
NB
1639 goto out;
1640 }
1641
1642 dest_tpg = tmp_tpg;
6708bb27 1643 pr_debug("SPC-3 PR SPEC_I_PT: Located %s Node:"
c66ac9db 1644 " %s Port RTPI: %hu\n",
e3d6f909 1645 dest_tpg->se_tpg_tfo->get_fabric_name(),
c66ac9db
NB
1646 dest_node_acl->initiatorname, dest_rtpi);
1647
1648 spin_lock(&dev->se_port_lock);
1649 break;
1650 }
1651 spin_unlock(&dev->se_port_lock);
1652
6708bb27
AG
1653 if (!dest_tpg) {
1654 pr_err("SPC-3 PR SPEC_I_PT: Unable to locate"
c66ac9db 1655 " dest_tpg\n");
03e98c9e
NB
1656 cmd->scsi_sense_reason = TCM_INVALID_PARAMETER_LIST;
1657 ret = -EINVAL;
c66ac9db
NB
1658 goto out;
1659 }
1660#if 0
6708bb27 1661 pr_debug("SPC-3 PR SPEC_I_PT: Got %s data_length: %u tpdl: %u"
c66ac9db 1662 " tid_len: %d for %s + %s\n",
e3d6f909 1663 dest_tpg->se_tpg_tfo->get_fabric_name(), cmd->data_length,
c66ac9db
NB
1664 tpdl, tid_len, i_str, iport_ptr);
1665#endif
1666 if (tid_len > tpdl) {
6708bb27 1667 pr_err("SPC-3 PR SPEC_I_PT: Illegal tid_len:"
c66ac9db
NB
1668 " %u for Transport ID: %s\n", tid_len, ptr);
1669 core_scsi3_nodeacl_undepend_item(dest_node_acl);
1670 core_scsi3_tpg_undepend_item(dest_tpg);
03e98c9e
NB
1671 cmd->scsi_sense_reason = TCM_INVALID_PARAMETER_LIST;
1672 ret = -EINVAL;
c66ac9db
NB
1673 goto out;
1674 }
1675 /*
1676 * Locate the desintation struct se_dev_entry pointer for matching
1677 * RELATIVE TARGET PORT IDENTIFIER on the receiving I_T Nexus
1678 * Target Port.
1679 */
1680 dest_se_deve = core_get_se_deve_from_rtpi(dest_node_acl,
1681 dest_rtpi);
6708bb27
AG
1682 if (!dest_se_deve) {
1683 pr_err("Unable to locate %s dest_se_deve"
c66ac9db 1684 " from destination RTPI: %hu\n",
e3d6f909 1685 dest_tpg->se_tpg_tfo->get_fabric_name(),
c66ac9db
NB
1686 dest_rtpi);
1687
1688 core_scsi3_nodeacl_undepend_item(dest_node_acl);
1689 core_scsi3_tpg_undepend_item(dest_tpg);
03e98c9e
NB
1690 cmd->scsi_sense_reason = TCM_INVALID_PARAMETER_LIST;
1691 ret = -EINVAL;
c66ac9db
NB
1692 goto out;
1693 }
1694
1695 ret = core_scsi3_lunacl_depend_item(dest_se_deve);
1696 if (ret < 0) {
6708bb27 1697 pr_err("core_scsi3_lunacl_depend_item()"
c66ac9db
NB
1698 " failed\n");
1699 atomic_dec(&dest_se_deve->pr_ref_count);
1700 smp_mb__after_atomic_dec();
1701 core_scsi3_nodeacl_undepend_item(dest_node_acl);
1702 core_scsi3_tpg_undepend_item(dest_tpg);
03e98c9e
NB
1703 cmd->scsi_sense_reason =
1704 TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
1705 ret = -EINVAL;
c66ac9db
NB
1706 goto out;
1707 }
1708#if 0
6708bb27 1709 pr_debug("SPC-3 PR SPEC_I_PT: Located %s Node: %s"
c66ac9db 1710 " dest_se_deve mapped_lun: %u\n",
e3d6f909 1711 dest_tpg->se_tpg_tfo->get_fabric_name(),
c66ac9db
NB
1712 dest_node_acl->initiatorname, dest_se_deve->mapped_lun);
1713#endif
1714 /*
1715 * Skip any TransportIDs that already have a registration for
1716 * this target port.
1717 */
1718 pr_reg_e = __core_scsi3_locate_pr_reg(dev, dest_node_acl,
1719 iport_ptr);
1720 if (pr_reg_e) {
1721 core_scsi3_put_pr_reg(pr_reg_e);
1722 core_scsi3_lunacl_undepend_item(dest_se_deve);
1723 core_scsi3_nodeacl_undepend_item(dest_node_acl);
1724 core_scsi3_tpg_undepend_item(dest_tpg);
1725 ptr += tid_len;
1726 tpdl -= tid_len;
1727 tid_len = 0;
1728 continue;
1729 }
1730 /*
1731 * Allocate a struct pr_transport_id_holder and setup
1732 * the dest_node_acl and dest_se_deve pointers for the
1733 * loop below.
1734 */
1735 tidh_new = kzalloc(sizeof(struct pr_transport_id_holder),
1736 GFP_KERNEL);
6708bb27
AG
1737 if (!tidh_new) {
1738 pr_err("Unable to allocate tidh_new\n");
c66ac9db
NB
1739 core_scsi3_lunacl_undepend_item(dest_se_deve);
1740 core_scsi3_nodeacl_undepend_item(dest_node_acl);
1741 core_scsi3_tpg_undepend_item(dest_tpg);
03e98c9e
NB
1742 cmd->scsi_sense_reason =
1743 TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
1744 ret = -ENOMEM;
c66ac9db
NB
1745 goto out;
1746 }
1747 INIT_LIST_HEAD(&tidh_new->dest_list);
1748 tidh_new->dest_tpg = dest_tpg;
1749 tidh_new->dest_node_acl = dest_node_acl;
1750 tidh_new->dest_se_deve = dest_se_deve;
1751
1752 /*
1753 * Allocate, but do NOT add the registration for the
1754 * TransportID referenced SCSI Initiator port. This
1755 * done because of the following from spc4r17 in section
1756 * 6.14.3 wrt SPEC_I_PT:
1757 *
1758 * "If a registration fails for any initiator port (e.g., if th
1759 * logical unit does not have enough resources available to
1760 * hold the registration information), no registrations shall be
1761 * made, and the command shall be terminated with
1762 * CHECK CONDITION status."
1763 *
1764 * That means we call __core_scsi3_alloc_registration() here,
1765 * and then call __core_scsi3_add_registration() in the
1766 * 2nd loop which will never fail.
1767 */
5951146d 1768 dest_pr_reg = __core_scsi3_alloc_registration(cmd->se_dev,
c66ac9db
NB
1769 dest_node_acl, dest_se_deve, iport_ptr,
1770 sa_res_key, all_tg_pt, aptpl);
6708bb27 1771 if (!dest_pr_reg) {
c66ac9db
NB
1772 core_scsi3_lunacl_undepend_item(dest_se_deve);
1773 core_scsi3_nodeacl_undepend_item(dest_node_acl);
1774 core_scsi3_tpg_undepend_item(dest_tpg);
1775 kfree(tidh_new);
03e98c9e
NB
1776 cmd->scsi_sense_reason = TCM_INVALID_PARAMETER_LIST;
1777 ret = -EINVAL;
c66ac9db
NB
1778 goto out;
1779 }
1780 tidh_new->dest_pr_reg = dest_pr_reg;
1781 list_add_tail(&tidh_new->dest_list, &tid_dest_list);
1782
1783 ptr += tid_len;
1784 tpdl -= tid_len;
1785 tid_len = 0;
1786
1787 }
05d1c7c0 1788
4949314c 1789 transport_kunmap_data_sg(cmd);
05d1c7c0 1790
c66ac9db
NB
1791 /*
1792 * Go ahead and create a registrations from tid_dest_list for the
1793 * SPEC_I_PT provided TransportID for the *tidh referenced dest_node_acl
1794 * and dest_se_deve.
1795 *
1796 * The SA Reservation Key from the PROUT is set for the
1797 * registration, and ALL_TG_PT is also passed. ALL_TG_PT=1
1798 * means that the TransportID Initiator port will be
1799 * registered on all of the target ports in the SCSI target device
1800 * ALL_TG_PT=0 means the registration will only be for the
1801 * SCSI target port the PROUT REGISTER with SPEC_I_PT=1
1802 * was received.
1803 */
1804 list_for_each_entry_safe(tidh, tidh_tmp, &tid_dest_list, dest_list) {
1805 dest_tpg = tidh->dest_tpg;
1806 dest_node_acl = tidh->dest_node_acl;
1807 dest_se_deve = tidh->dest_se_deve;
1808 dest_pr_reg = tidh->dest_pr_reg;
1809 dest_local_nexus = tidh->dest_local_nexus;
1810
1811 list_del(&tidh->dest_list);
1812 kfree(tidh);
1813
1814 memset(i_buf, 0, PR_REG_ISID_ID_LEN);
1815 prf_isid = core_pr_dump_initiator_port(dest_pr_reg, &i_buf[0],
1816 PR_REG_ISID_ID_LEN);
1817
5951146d 1818 __core_scsi3_add_registration(cmd->se_dev, dest_node_acl,
c66ac9db
NB
1819 dest_pr_reg, 0, 0);
1820
6708bb27 1821 pr_debug("SPC-3 PR [%s] SPEC_I_PT: Successfully"
c66ac9db 1822 " registered Transport ID for Node: %s%s Mapped LUN:"
e3d6f909 1823 " %u\n", dest_tpg->se_tpg_tfo->get_fabric_name(),
c66ac9db
NB
1824 dest_node_acl->initiatorname, (prf_isid) ?
1825 &i_buf[0] : "", dest_se_deve->mapped_lun);
1826
1827 if (dest_local_nexus)
1828 continue;
1829
1830 core_scsi3_lunacl_undepend_item(dest_se_deve);
1831 core_scsi3_nodeacl_undepend_item(dest_node_acl);
1832 core_scsi3_tpg_undepend_item(dest_tpg);
1833 }
1834
1835 return 0;
1836out:
4949314c 1837 transport_kunmap_data_sg(cmd);
c66ac9db
NB
1838 /*
1839 * For the failure case, release everything from tid_dest_list
1840 * including *dest_pr_reg and the configfs dependances..
1841 */
1842 list_for_each_entry_safe(tidh, tidh_tmp, &tid_dest_list, dest_list) {
1843 dest_tpg = tidh->dest_tpg;
1844 dest_node_acl = tidh->dest_node_acl;
1845 dest_se_deve = tidh->dest_se_deve;
1846 dest_pr_reg = tidh->dest_pr_reg;
1847 dest_local_nexus = tidh->dest_local_nexus;
1848
1849 list_del(&tidh->dest_list);
1850 kfree(tidh);
1851 /*
1852 * Release any extra ALL_TG_PT=1 registrations for
1853 * the SPEC_I_PT=1 case.
1854 */
1855 list_for_each_entry_safe(pr_reg_tmp, pr_reg_tmp_safe,
1856 &dest_pr_reg->pr_reg_atp_list,
1857 pr_reg_atp_mem_list) {
1858 list_del(&pr_reg_tmp->pr_reg_atp_mem_list);
1859 core_scsi3_lunacl_undepend_item(pr_reg_tmp->pr_reg_deve);
1860 kmem_cache_free(t10_pr_reg_cache, pr_reg_tmp);
1861 }
1862
1863 kfree(dest_pr_reg->pr_aptpl_buf);
1864 kmem_cache_free(t10_pr_reg_cache, dest_pr_reg);
1865
1866 if (dest_local_nexus)
1867 continue;
1868
1869 core_scsi3_lunacl_undepend_item(dest_se_deve);
1870 core_scsi3_nodeacl_undepend_item(dest_node_acl);
1871 core_scsi3_tpg_undepend_item(dest_tpg);
1872 }
1873 return ret;
1874}
1875
1876/*
1877 * Called with struct se_device->dev_reservation_lock held
1878 */
1879static int __core_scsi3_update_aptpl_buf(
1880 struct se_device *dev,
1881 unsigned char *buf,
1882 u32 pr_aptpl_buf_len,
1883 int clear_aptpl_metadata)
1884{
1885 struct se_lun *lun;
1886 struct se_portal_group *tpg;
e3d6f909 1887 struct se_subsystem_dev *su_dev = dev->se_sub_dev;
c66ac9db
NB
1888 struct t10_pr_registration *pr_reg;
1889 unsigned char tmp[512], isid_buf[32];
1890 ssize_t len = 0;
1891 int reg_count = 0;
1892
1893 memset(buf, 0, pr_aptpl_buf_len);
1894 /*
1895 * Called to clear metadata once APTPL has been deactivated.
1896 */
1897 if (clear_aptpl_metadata) {
1898 snprintf(buf, pr_aptpl_buf_len,
1899 "No Registrations or Reservations\n");
1900 return 0;
1901 }
1902 /*
1903 * Walk the registration list..
1904 */
e3d6f909
AG
1905 spin_lock(&su_dev->t10_pr.registration_lock);
1906 list_for_each_entry(pr_reg, &su_dev->t10_pr.registration_list,
c66ac9db
NB
1907 pr_reg_list) {
1908
1909 tmp[0] = '\0';
1910 isid_buf[0] = '\0';
1911 tpg = pr_reg->pr_reg_nacl->se_tpg;
1912 lun = pr_reg->pr_reg_tg_pt_lun;
1913 /*
1914 * Write out any ISID value to APTPL metadata that was included
1915 * in the original registration.
1916 */
1917 if (pr_reg->isid_present_at_reg)
1918 snprintf(isid_buf, 32, "initiator_sid=%s\n",
1919 pr_reg->pr_reg_isid);
1920 /*
1921 * Include special metadata if the pr_reg matches the
1922 * reservation holder.
1923 */
1924 if (dev->dev_pr_res_holder == pr_reg) {
1925 snprintf(tmp, 512, "PR_REG_START: %d"
1926 "\ninitiator_fabric=%s\n"
1927 "initiator_node=%s\n%s"
1928 "sa_res_key=%llu\n"
1929 "res_holder=1\nres_type=%02x\n"
1930 "res_scope=%02x\nres_all_tg_pt=%d\n"
1931 "mapped_lun=%u\n", reg_count,
e3d6f909 1932 tpg->se_tpg_tfo->get_fabric_name(),
c66ac9db
NB
1933 pr_reg->pr_reg_nacl->initiatorname, isid_buf,
1934 pr_reg->pr_res_key, pr_reg->pr_res_type,
1935 pr_reg->pr_res_scope, pr_reg->pr_reg_all_tg_pt,
1936 pr_reg->pr_res_mapped_lun);
1937 } else {
1938 snprintf(tmp, 512, "PR_REG_START: %d\n"
1939 "initiator_fabric=%s\ninitiator_node=%s\n%s"
1940 "sa_res_key=%llu\nres_holder=0\n"
1941 "res_all_tg_pt=%d\nmapped_lun=%u\n",
e3d6f909 1942 reg_count, tpg->se_tpg_tfo->get_fabric_name(),
c66ac9db
NB
1943 pr_reg->pr_reg_nacl->initiatorname, isid_buf,
1944 pr_reg->pr_res_key, pr_reg->pr_reg_all_tg_pt,
1945 pr_reg->pr_res_mapped_lun);
1946 }
1947
60d645a4 1948 if ((len + strlen(tmp) >= pr_aptpl_buf_len)) {
6708bb27 1949 pr_err("Unable to update renaming"
c66ac9db 1950 " APTPL metadata\n");
e3d6f909
AG
1951 spin_unlock(&su_dev->t10_pr.registration_lock);
1952 return -EMSGSIZE;
c66ac9db
NB
1953 }
1954 len += sprintf(buf+len, "%s", tmp);
1955
1956 /*
1957 * Include information about the associated SCSI target port.
1958 */
1959 snprintf(tmp, 512, "target_fabric=%s\ntarget_node=%s\n"
1960 "tpgt=%hu\nport_rtpi=%hu\ntarget_lun=%u\nPR_REG_END:"
e3d6f909
AG
1961 " %d\n", tpg->se_tpg_tfo->get_fabric_name(),
1962 tpg->se_tpg_tfo->tpg_get_wwn(tpg),
1963 tpg->se_tpg_tfo->tpg_get_tag(tpg),
c66ac9db
NB
1964 lun->lun_sep->sep_rtpi, lun->unpacked_lun, reg_count);
1965
60d645a4 1966 if ((len + strlen(tmp) >= pr_aptpl_buf_len)) {
6708bb27 1967 pr_err("Unable to update renaming"
c66ac9db 1968 " APTPL metadata\n");
e3d6f909
AG
1969 spin_unlock(&su_dev->t10_pr.registration_lock);
1970 return -EMSGSIZE;
c66ac9db
NB
1971 }
1972 len += sprintf(buf+len, "%s", tmp);
1973 reg_count++;
1974 }
e3d6f909 1975 spin_unlock(&su_dev->t10_pr.registration_lock);
c66ac9db 1976
6708bb27 1977 if (!reg_count)
c66ac9db
NB
1978 len += sprintf(buf+len, "No Registrations or Reservations");
1979
1980 return 0;
1981}
1982
1983static int core_scsi3_update_aptpl_buf(
1984 struct se_device *dev,
1985 unsigned char *buf,
1986 u32 pr_aptpl_buf_len,
1987 int clear_aptpl_metadata)
1988{
1989 int ret;
1990
1991 spin_lock(&dev->dev_reservation_lock);
1992 ret = __core_scsi3_update_aptpl_buf(dev, buf, pr_aptpl_buf_len,
1993 clear_aptpl_metadata);
1994 spin_unlock(&dev->dev_reservation_lock);
1995
1996 return ret;
1997}
1998
1999/*
2000 * Called with struct se_device->aptpl_file_mutex held
2001 */
2002static int __core_scsi3_write_aptpl_to_file(
2003 struct se_device *dev,
2004 unsigned char *buf,
2005 u32 pr_aptpl_buf_len)
2006{
e3d6f909 2007 struct t10_wwn *wwn = &dev->se_sub_dev->t10_wwn;
c66ac9db
NB
2008 struct file *file;
2009 struct iovec iov[1];
2010 mm_segment_t old_fs;
2011 int flags = O_RDWR | O_CREAT | O_TRUNC;
2012 char path[512];
2013 int ret;
2014
2015 memset(iov, 0, sizeof(struct iovec));
2016 memset(path, 0, 512);
2017
60d645a4 2018 if (strlen(&wwn->unit_serial[0]) >= 512) {
6708bb27 2019 pr_err("WWN value for struct se_device does not fit"
c66ac9db 2020 " into path buffer\n");
e3d6f909 2021 return -EMSGSIZE;
c66ac9db
NB
2022 }
2023
2024 snprintf(path, 512, "/var/target/pr/aptpl_%s", &wwn->unit_serial[0]);
2025 file = filp_open(path, flags, 0600);
2026 if (IS_ERR(file) || !file || !file->f_dentry) {
6708bb27 2027 pr_err("filp_open(%s) for APTPL metadata"
c66ac9db 2028 " failed\n", path);
e3d6f909 2029 return (PTR_ERR(file) < 0 ? PTR_ERR(file) : -ENOENT);
c66ac9db
NB
2030 }
2031
2032 iov[0].iov_base = &buf[0];
6708bb27 2033 if (!pr_aptpl_buf_len)
c66ac9db
NB
2034 iov[0].iov_len = (strlen(&buf[0]) + 1); /* Add extra for NULL */
2035 else
2036 iov[0].iov_len = pr_aptpl_buf_len;
2037
2038 old_fs = get_fs();
2039 set_fs(get_ds());
2040 ret = vfs_writev(file, &iov[0], 1, &file->f_pos);
2041 set_fs(old_fs);
2042
2043 if (ret < 0) {
6708bb27 2044 pr_debug("Error writing APTPL metadata file: %s\n", path);
c66ac9db 2045 filp_close(file, NULL);
e3d6f909 2046 return -EIO;
c66ac9db
NB
2047 }
2048 filp_close(file, NULL);
2049
2050 return 0;
2051}
2052
2053static int core_scsi3_update_and_write_aptpl(
2054 struct se_device *dev,
2055 unsigned char *in_buf,
2056 u32 in_pr_aptpl_buf_len)
2057{
2058 unsigned char null_buf[64], *buf;
2059 u32 pr_aptpl_buf_len;
2060 int ret, clear_aptpl_metadata = 0;
2061 /*
2062 * Can be called with a NULL pointer from PROUT service action CLEAR
2063 */
6708bb27 2064 if (!in_buf) {
c66ac9db
NB
2065 memset(null_buf, 0, 64);
2066 buf = &null_buf[0];
2067 /*
2068 * This will clear the APTPL metadata to:
2069 * "No Registrations or Reservations" status
2070 */
2071 pr_aptpl_buf_len = 64;
2072 clear_aptpl_metadata = 1;
2073 } else {
2074 buf = in_buf;
2075 pr_aptpl_buf_len = in_pr_aptpl_buf_len;
2076 }
2077
2078 ret = core_scsi3_update_aptpl_buf(dev, buf, pr_aptpl_buf_len,
2079 clear_aptpl_metadata);
2080 if (ret != 0)
e3d6f909 2081 return ret;
c66ac9db
NB
2082 /*
2083 * __core_scsi3_write_aptpl_to_file() will call strlen()
2084 * on the passed buf to determine pr_aptpl_buf_len.
2085 */
2086 ret = __core_scsi3_write_aptpl_to_file(dev, buf, 0);
2087 if (ret != 0)
e3d6f909 2088 return ret;
c66ac9db
NB
2089
2090 return ret;
2091}
2092
2093static int core_scsi3_emulate_pro_register(
2094 struct se_cmd *cmd,
2095 u64 res_key,
2096 u64 sa_res_key,
2097 int aptpl,
2098 int all_tg_pt,
2099 int spec_i_pt,
2100 int ignore_key)
2101{
e3d6f909 2102 struct se_session *se_sess = cmd->se_sess;
5951146d 2103 struct se_device *dev = cmd->se_dev;
c66ac9db 2104 struct se_dev_entry *se_deve;
e3d6f909 2105 struct se_lun *se_lun = cmd->se_lun;
c66ac9db
NB
2106 struct se_portal_group *se_tpg;
2107 struct t10_pr_registration *pr_reg, *pr_reg_p, *pr_reg_tmp, *pr_reg_e;
e3d6f909 2108 struct t10_reservation *pr_tmpl = &dev->se_sub_dev->t10_pr;
c66ac9db
NB
2109 /* Used for APTPL metadata w/ UNREGISTER */
2110 unsigned char *pr_aptpl_buf = NULL;
2111 unsigned char isid_buf[PR_REG_ISID_LEN], *isid_ptr = NULL;
2112 int pr_holder = 0, ret = 0, type;
2113
6708bb27
AG
2114 if (!se_sess || !se_lun) {
2115 pr_err("SPC-3 PR: se_sess || struct se_lun is NULL!\n");
03e98c9e
NB
2116 cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
2117 return -EINVAL;
c66ac9db
NB
2118 }
2119 se_tpg = se_sess->se_tpg;
2120 se_deve = &se_sess->se_node_acl->device_list[cmd->orig_fe_lun];
2121
e3d6f909 2122 if (se_tpg->se_tpg_tfo->sess_get_initiator_sid) {
c66ac9db 2123 memset(&isid_buf[0], 0, PR_REG_ISID_LEN);
e3d6f909 2124 se_tpg->se_tpg_tfo->sess_get_initiator_sid(se_sess, &isid_buf[0],
c66ac9db
NB
2125 PR_REG_ISID_LEN);
2126 isid_ptr = &isid_buf[0];
2127 }
2128 /*
2129 * Follow logic from spc4r17 Section 5.7.7, Register Behaviors Table 47
2130 */
2131 pr_reg_e = core_scsi3_locate_pr_reg(dev, se_sess->se_node_acl, se_sess);
6708bb27 2132 if (!pr_reg_e) {
c66ac9db 2133 if (res_key) {
6708bb27 2134 pr_warn("SPC-3 PR: Reservation Key non-zero"
c66ac9db 2135 " for SA REGISTER, returning CONFLICT\n");
03e98c9e
NB
2136 cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT;
2137 return -EINVAL;
c66ac9db
NB
2138 }
2139 /*
2140 * Do nothing but return GOOD status.
2141 */
6708bb27 2142 if (!sa_res_key)
03e98c9e 2143 return 0;
c66ac9db 2144
6708bb27 2145 if (!spec_i_pt) {
c66ac9db
NB
2146 /*
2147 * Perform the Service Action REGISTER on the Initiator
2148 * Port Endpoint that the PRO was received from on the
2149 * Logical Unit of the SCSI device server.
2150 */
5951146d 2151 ret = core_scsi3_alloc_registration(cmd->se_dev,
c66ac9db
NB
2152 se_sess->se_node_acl, se_deve, isid_ptr,
2153 sa_res_key, all_tg_pt, aptpl,
2154 ignore_key, 0);
2155 if (ret != 0) {
6708bb27 2156 pr_err("Unable to allocate"
c66ac9db 2157 " struct t10_pr_registration\n");
03e98c9e
NB
2158 cmd->scsi_sense_reason = TCM_INVALID_PARAMETER_LIST;
2159 return -EINVAL;
c66ac9db
NB
2160 }
2161 } else {
2162 /*
2163 * Register both the Initiator port that received
2164 * PROUT SA REGISTER + SPEC_I_PT=1 and extract SCSI
2165 * TransportID from Parameter list and loop through
2166 * fabric dependent parameter list while calling
2167 * logic from of core_scsi3_alloc_registration() for
2168 * each TransportID provided SCSI Initiator Port/Device
2169 */
2170 ret = core_scsi3_decode_spec_i_port(cmd, se_tpg,
2171 isid_ptr, sa_res_key, all_tg_pt, aptpl);
2172 if (ret != 0)
2173 return ret;
2174 }
2175 /*
2176 * Nothing left to do for the APTPL=0 case.
2177 */
6708bb27 2178 if (!aptpl) {
c66ac9db 2179 pr_tmpl->pr_aptpl_active = 0;
5951146d 2180 core_scsi3_update_and_write_aptpl(cmd->se_dev, NULL, 0);
6708bb27 2181 pr_debug("SPC-3 PR: Set APTPL Bit Deactivated for"
c66ac9db
NB
2182 " REGISTER\n");
2183 return 0;
2184 }
2185 /*
2186 * Locate the newly allocated local I_T Nexus *pr_reg, and
2187 * update the APTPL metadata information using its
2188 * preallocated *pr_reg->pr_aptpl_buf.
2189 */
5951146d 2190 pr_reg = core_scsi3_locate_pr_reg(cmd->se_dev,
c66ac9db
NB
2191 se_sess->se_node_acl, se_sess);
2192
5951146d 2193 ret = core_scsi3_update_and_write_aptpl(cmd->se_dev,
c66ac9db
NB
2194 &pr_reg->pr_aptpl_buf[0],
2195 pr_tmpl->pr_aptpl_buf_len);
6708bb27 2196 if (!ret) {
c66ac9db 2197 pr_tmpl->pr_aptpl_active = 1;
6708bb27 2198 pr_debug("SPC-3 PR: Set APTPL Bit Activated for REGISTER\n");
c66ac9db
NB
2199 }
2200
2201 core_scsi3_put_pr_reg(pr_reg);
2202 return ret;
2203 } else {
2204 /*
2205 * Locate the existing *pr_reg via struct se_node_acl pointers
2206 */
2207 pr_reg = pr_reg_e;
2208 type = pr_reg->pr_res_type;
2209
6708bb27 2210 if (!ignore_key) {
c66ac9db 2211 if (res_key != pr_reg->pr_res_key) {
6708bb27 2212 pr_err("SPC-3 PR REGISTER: Received"
c66ac9db
NB
2213 " res_key: 0x%016Lx does not match"
2214 " existing SA REGISTER res_key:"
2215 " 0x%016Lx\n", res_key,
2216 pr_reg->pr_res_key);
2217 core_scsi3_put_pr_reg(pr_reg);
03e98c9e
NB
2218 cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT;
2219 return -EINVAL;
c66ac9db
NB
2220 }
2221 }
2222 if (spec_i_pt) {
6708bb27 2223 pr_err("SPC-3 PR UNREGISTER: SPEC_I_PT"
c66ac9db
NB
2224 " set while sa_res_key=0\n");
2225 core_scsi3_put_pr_reg(pr_reg);
03e98c9e
NB
2226 cmd->scsi_sense_reason = TCM_INVALID_PARAMETER_LIST;
2227 return -EINVAL;
c66ac9db
NB
2228 }
2229 /*
2230 * An existing ALL_TG_PT=1 registration being released
2231 * must also set ALL_TG_PT=1 in the incoming PROUT.
2232 */
2233 if (pr_reg->pr_reg_all_tg_pt && !(all_tg_pt)) {
6708bb27 2234 pr_err("SPC-3 PR UNREGISTER: ALL_TG_PT=1"
c66ac9db
NB
2235 " registration exists, but ALL_TG_PT=1 bit not"
2236 " present in received PROUT\n");
2237 core_scsi3_put_pr_reg(pr_reg);
03e98c9e
NB
2238 cmd->scsi_sense_reason = TCM_INVALID_CDB_FIELD;
2239 return -EINVAL;
c66ac9db
NB
2240 }
2241 /*
2242 * Allocate APTPL metadata buffer used for UNREGISTER ops
2243 */
2244 if (aptpl) {
2245 pr_aptpl_buf = kzalloc(pr_tmpl->pr_aptpl_buf_len,
2246 GFP_KERNEL);
6708bb27
AG
2247 if (!pr_aptpl_buf) {
2248 pr_err("Unable to allocate"
c66ac9db
NB
2249 " pr_aptpl_buf\n");
2250 core_scsi3_put_pr_reg(pr_reg);
03e98c9e
NB
2251 cmd->scsi_sense_reason =
2252 TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
2253 return -EINVAL;
c66ac9db
NB
2254 }
2255 }
2256 /*
2257 * sa_res_key=0 Unregister Reservation Key for registered I_T
2258 * Nexus sa_res_key=1 Change Reservation Key for registered I_T
2259 * Nexus.
2260 */
6708bb27 2261 if (!sa_res_key) {
c66ac9db 2262 pr_holder = core_scsi3_check_implict_release(
5951146d 2263 cmd->se_dev, pr_reg);
c66ac9db
NB
2264 if (pr_holder < 0) {
2265 kfree(pr_aptpl_buf);
2266 core_scsi3_put_pr_reg(pr_reg);
03e98c9e
NB
2267 cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT;
2268 return -EINVAL;
c66ac9db
NB
2269 }
2270
2271 spin_lock(&pr_tmpl->registration_lock);
2272 /*
2273 * Release all ALL_TG_PT=1 for the matching SCSI Initiator Port
2274 * and matching pr_res_key.
2275 */
2276 if (pr_reg->pr_reg_all_tg_pt) {
2277 list_for_each_entry_safe(pr_reg_p, pr_reg_tmp,
2278 &pr_tmpl->registration_list,
2279 pr_reg_list) {
2280
6708bb27 2281 if (!pr_reg_p->pr_reg_all_tg_pt)
c66ac9db
NB
2282 continue;
2283
2284 if (pr_reg_p->pr_res_key != res_key)
2285 continue;
2286
2287 if (pr_reg == pr_reg_p)
2288 continue;
2289
2290 if (strcmp(pr_reg->pr_reg_nacl->initiatorname,
2291 pr_reg_p->pr_reg_nacl->initiatorname))
2292 continue;
2293
2294 __core_scsi3_free_registration(dev,
2295 pr_reg_p, NULL, 0);
2296 }
2297 }
2298 /*
2299 * Release the calling I_T Nexus registration now..
2300 */
5951146d 2301 __core_scsi3_free_registration(cmd->se_dev, pr_reg,
c66ac9db
NB
2302 NULL, 1);
2303 /*
2304 * From spc4r17, section 5.7.11.3 Unregistering
2305 *
2306 * If the persistent reservation is a registrants only
2307 * type, the device server shall establish a unit
2308 * attention condition for the initiator port associated
2309 * with every registered I_T nexus except for the I_T
2310 * nexus on which the PERSISTENT RESERVE OUT command was
2311 * received, with the additional sense code set to
2312 * RESERVATIONS RELEASED.
2313 */
2314 if (pr_holder &&
2315 ((type == PR_TYPE_WRITE_EXCLUSIVE_REGONLY) ||
2316 (type == PR_TYPE_EXCLUSIVE_ACCESS_REGONLY))) {
2317 list_for_each_entry(pr_reg_p,
2318 &pr_tmpl->registration_list,
2319 pr_reg_list) {
2320
2321 core_scsi3_ua_allocate(
2322 pr_reg_p->pr_reg_nacl,
2323 pr_reg_p->pr_res_mapped_lun,
2324 0x2A,
2325 ASCQ_2AH_RESERVATIONS_RELEASED);
2326 }
2327 }
2328 spin_unlock(&pr_tmpl->registration_lock);
2329
6708bb27 2330 if (!aptpl) {
c66ac9db
NB
2331 pr_tmpl->pr_aptpl_active = 0;
2332 core_scsi3_update_and_write_aptpl(dev, NULL, 0);
6708bb27 2333 pr_debug("SPC-3 PR: Set APTPL Bit Deactivated"
c66ac9db
NB
2334 " for UNREGISTER\n");
2335 return 0;
2336 }
2337
2338 ret = core_scsi3_update_and_write_aptpl(dev,
2339 &pr_aptpl_buf[0],
2340 pr_tmpl->pr_aptpl_buf_len);
6708bb27 2341 if (!ret) {
c66ac9db 2342 pr_tmpl->pr_aptpl_active = 1;
6708bb27 2343 pr_debug("SPC-3 PR: Set APTPL Bit Activated"
c66ac9db
NB
2344 " for UNREGISTER\n");
2345 }
2346
2347 kfree(pr_aptpl_buf);
2348 return ret;
2349 } else {
2350 /*
2351 * Increment PRgeneration counter for struct se_device"
2352 * upon a successful REGISTER, see spc4r17 section 6.3.2
2353 * READ_KEYS service action.
2354 */
2355 pr_reg->pr_res_generation = core_scsi3_pr_generation(
5951146d 2356 cmd->se_dev);
c66ac9db 2357 pr_reg->pr_res_key = sa_res_key;
6708bb27 2358 pr_debug("SPC-3 PR [%s] REGISTER%s: Changed Reservation"
c66ac9db 2359 " Key for %s to: 0x%016Lx PRgeneration:"
e3d6f909 2360 " 0x%08x\n", cmd->se_tfo->get_fabric_name(),
c66ac9db
NB
2361 (ignore_key) ? "_AND_IGNORE_EXISTING_KEY" : "",
2362 pr_reg->pr_reg_nacl->initiatorname,
2363 pr_reg->pr_res_key, pr_reg->pr_res_generation);
2364
6708bb27 2365 if (!aptpl) {
c66ac9db
NB
2366 pr_tmpl->pr_aptpl_active = 0;
2367 core_scsi3_update_and_write_aptpl(dev, NULL, 0);
2368 core_scsi3_put_pr_reg(pr_reg);
6708bb27 2369 pr_debug("SPC-3 PR: Set APTPL Bit Deactivated"
c66ac9db
NB
2370 " for REGISTER\n");
2371 return 0;
2372 }
2373
2374 ret = core_scsi3_update_and_write_aptpl(dev,
2375 &pr_aptpl_buf[0],
2376 pr_tmpl->pr_aptpl_buf_len);
6708bb27 2377 if (!ret) {
c66ac9db 2378 pr_tmpl->pr_aptpl_active = 1;
6708bb27 2379 pr_debug("SPC-3 PR: Set APTPL Bit Activated"
c66ac9db
NB
2380 " for REGISTER\n");
2381 }
2382
2383 kfree(pr_aptpl_buf);
2384 core_scsi3_put_pr_reg(pr_reg);
2385 }
2386 }
2387 return 0;
2388}
2389
2390unsigned char *core_scsi3_pr_dump_type(int type)
2391{
2392 switch (type) {
2393 case PR_TYPE_WRITE_EXCLUSIVE:
2394 return "Write Exclusive Access";
2395 case PR_TYPE_EXCLUSIVE_ACCESS:
2396 return "Exclusive Access";
2397 case PR_TYPE_WRITE_EXCLUSIVE_REGONLY:
2398 return "Write Exclusive Access, Registrants Only";
2399 case PR_TYPE_EXCLUSIVE_ACCESS_REGONLY:
2400 return "Exclusive Access, Registrants Only";
2401 case PR_TYPE_WRITE_EXCLUSIVE_ALLREG:
2402 return "Write Exclusive Access, All Registrants";
2403 case PR_TYPE_EXCLUSIVE_ACCESS_ALLREG:
2404 return "Exclusive Access, All Registrants";
2405 default:
2406 break;
2407 }
2408
2409 return "Unknown SPC-3 PR Type";
2410}
2411
2412static int core_scsi3_pro_reserve(
2413 struct se_cmd *cmd,
2414 struct se_device *dev,
2415 int type,
2416 int scope,
2417 u64 res_key)
2418{
e3d6f909 2419 struct se_session *se_sess = cmd->se_sess;
c66ac9db 2420 struct se_dev_entry *se_deve;
e3d6f909 2421 struct se_lun *se_lun = cmd->se_lun;
c66ac9db
NB
2422 struct se_portal_group *se_tpg;
2423 struct t10_pr_registration *pr_reg, *pr_res_holder;
e3d6f909 2424 struct t10_reservation *pr_tmpl = &dev->se_sub_dev->t10_pr;
c66ac9db
NB
2425 char i_buf[PR_REG_ISID_ID_LEN];
2426 int ret, prf_isid;
2427
2428 memset(i_buf, 0, PR_REG_ISID_ID_LEN);
2429
6708bb27
AG
2430 if (!se_sess || !se_lun) {
2431 pr_err("SPC-3 PR: se_sess || struct se_lun is NULL!\n");
03e98c9e
NB
2432 cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
2433 return -EINVAL;
c66ac9db
NB
2434 }
2435 se_tpg = se_sess->se_tpg;
2436 se_deve = &se_sess->se_node_acl->device_list[cmd->orig_fe_lun];
2437 /*
2438 * Locate the existing *pr_reg via struct se_node_acl pointers
2439 */
5951146d 2440 pr_reg = core_scsi3_locate_pr_reg(cmd->se_dev, se_sess->se_node_acl,
c66ac9db 2441 se_sess);
6708bb27
AG
2442 if (!pr_reg) {
2443 pr_err("SPC-3 PR: Unable to locate"
c66ac9db 2444 " PR_REGISTERED *pr_reg for RESERVE\n");
03e98c9e
NB
2445 cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
2446 return -EINVAL;
c66ac9db
NB
2447 }
2448 /*
2449 * From spc4r17 Section 5.7.9: Reserving:
2450 *
2451 * An application client creates a persistent reservation by issuing
2452 * a PERSISTENT RESERVE OUT command with RESERVE service action through
2453 * a registered I_T nexus with the following parameters:
2454 * a) RESERVATION KEY set to the value of the reservation key that is
2455 * registered with the logical unit for the I_T nexus; and
2456 */
2457 if (res_key != pr_reg->pr_res_key) {
6708bb27 2458 pr_err("SPC-3 PR RESERVE: Received res_key: 0x%016Lx"
c66ac9db
NB
2459 " does not match existing SA REGISTER res_key:"
2460 " 0x%016Lx\n", res_key, pr_reg->pr_res_key);
2461 core_scsi3_put_pr_reg(pr_reg);
03e98c9e
NB
2462 cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT;
2463 return -EINVAL;
c66ac9db
NB
2464 }
2465 /*
2466 * From spc4r17 Section 5.7.9: Reserving:
2467 *
2468 * From above:
2469 * b) TYPE field and SCOPE field set to the persistent reservation
2470 * being created.
2471 *
2472 * Only one persistent reservation is allowed at a time per logical unit
2473 * and that persistent reservation has a scope of LU_SCOPE.
2474 */
2475 if (scope != PR_SCOPE_LU_SCOPE) {
6708bb27 2476 pr_err("SPC-3 PR: Illegal SCOPE: 0x%02x\n", scope);
c66ac9db 2477 core_scsi3_put_pr_reg(pr_reg);
03e98c9e
NB
2478 cmd->scsi_sense_reason = TCM_INVALID_PARAMETER_LIST;
2479 return -EINVAL;
c66ac9db
NB
2480 }
2481 /*
2482 * See if we have an existing PR reservation holder pointer at
2483 * struct se_device->dev_pr_res_holder in the form struct t10_pr_registration
2484 * *pr_res_holder.
2485 */
2486 spin_lock(&dev->dev_reservation_lock);
2487 pr_res_holder = dev->dev_pr_res_holder;
2488 if ((pr_res_holder)) {
2489 /*
2490 * From spc4r17 Section 5.7.9: Reserving:
2491 *
2492 * If the device server receives a PERSISTENT RESERVE OUT
2493 * command from an I_T nexus other than a persistent reservation
2494 * holder (see 5.7.10) that attempts to create a persistent
2495 * reservation when a persistent reservation already exists for
2496 * the logical unit, then the command shall be completed with
2497 * RESERVATION CONFLICT status.
2498 */
2499 if (pr_res_holder != pr_reg) {
2500 struct se_node_acl *pr_res_nacl = pr_res_holder->pr_reg_nacl;
6708bb27 2501 pr_err("SPC-3 PR: Attempted RESERVE from"
c66ac9db
NB
2502 " [%s]: %s while reservation already held by"
2503 " [%s]: %s, returning RESERVATION_CONFLICT\n",
e3d6f909 2504 cmd->se_tfo->get_fabric_name(),
c66ac9db 2505 se_sess->se_node_acl->initiatorname,
e3d6f909 2506 pr_res_nacl->se_tpg->se_tpg_tfo->get_fabric_name(),
c66ac9db
NB
2507 pr_res_holder->pr_reg_nacl->initiatorname);
2508
2509 spin_unlock(&dev->dev_reservation_lock);
2510 core_scsi3_put_pr_reg(pr_reg);
03e98c9e
NB
2511 cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT;
2512 return -EINVAL;
c66ac9db
NB
2513 }
2514 /*
2515 * From spc4r17 Section 5.7.9: Reserving:
2516 *
2517 * If a persistent reservation holder attempts to modify the
2518 * type or scope of an existing persistent reservation, the
2519 * command shall be completed with RESERVATION CONFLICT status.
2520 */
2521 if ((pr_res_holder->pr_res_type != type) ||
2522 (pr_res_holder->pr_res_scope != scope)) {
2523 struct se_node_acl *pr_res_nacl = pr_res_holder->pr_reg_nacl;
6708bb27 2524 pr_err("SPC-3 PR: Attempted RESERVE from"
c66ac9db
NB
2525 " [%s]: %s trying to change TYPE and/or SCOPE,"
2526 " while reservation already held by [%s]: %s,"
2527 " returning RESERVATION_CONFLICT\n",
e3d6f909 2528 cmd->se_tfo->get_fabric_name(),
c66ac9db 2529 se_sess->se_node_acl->initiatorname,
e3d6f909 2530 pr_res_nacl->se_tpg->se_tpg_tfo->get_fabric_name(),
c66ac9db
NB
2531 pr_res_holder->pr_reg_nacl->initiatorname);
2532
2533 spin_unlock(&dev->dev_reservation_lock);
2534 core_scsi3_put_pr_reg(pr_reg);
03e98c9e
NB
2535 cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT;
2536 return -EINVAL;
c66ac9db
NB
2537 }
2538 /*
2539 * From spc4r17 Section 5.7.9: Reserving:
2540 *
2541 * If the device server receives a PERSISTENT RESERVE OUT
2542 * command with RESERVE service action where the TYPE field and
2543 * the SCOPE field contain the same values as the existing type
2544 * and scope from a persistent reservation holder, it shall not
2545 * make any change to the existing persistent reservation and
2546 * shall completethe command with GOOD status.
2547 */
2548 spin_unlock(&dev->dev_reservation_lock);
2549 core_scsi3_put_pr_reg(pr_reg);
03e98c9e 2550 return 0;
c66ac9db
NB
2551 }
2552 /*
2553 * Otherwise, our *pr_reg becomes the PR reservation holder for said
2554 * TYPE/SCOPE. Also set the received scope and type in *pr_reg.
2555 */
2556 pr_reg->pr_res_scope = scope;
2557 pr_reg->pr_res_type = type;
2558 pr_reg->pr_res_holder = 1;
2559 dev->dev_pr_res_holder = pr_reg;
2560 prf_isid = core_pr_dump_initiator_port(pr_reg, &i_buf[0],
2561 PR_REG_ISID_ID_LEN);
2562
6708bb27 2563 pr_debug("SPC-3 PR [%s] Service Action: RESERVE created new"
c66ac9db 2564 " reservation holder TYPE: %s ALL_TG_PT: %d\n",
e3d6f909 2565 cmd->se_tfo->get_fabric_name(), core_scsi3_pr_dump_type(type),
c66ac9db 2566 (pr_reg->pr_reg_all_tg_pt) ? 1 : 0);
6708bb27 2567 pr_debug("SPC-3 PR [%s] RESERVE Node: %s%s\n",
e3d6f909 2568 cmd->se_tfo->get_fabric_name(),
c66ac9db
NB
2569 se_sess->se_node_acl->initiatorname,
2570 (prf_isid) ? &i_buf[0] : "");
2571 spin_unlock(&dev->dev_reservation_lock);
2572
2573 if (pr_tmpl->pr_aptpl_active) {
5951146d 2574 ret = core_scsi3_update_and_write_aptpl(cmd->se_dev,
c66ac9db
NB
2575 &pr_reg->pr_aptpl_buf[0],
2576 pr_tmpl->pr_aptpl_buf_len);
6708bb27
AG
2577 if (!ret)
2578 pr_debug("SPC-3 PR: Updated APTPL metadata"
c66ac9db
NB
2579 " for RESERVE\n");
2580 }
2581
2582 core_scsi3_put_pr_reg(pr_reg);
2583 return 0;
2584}
2585
2586static int core_scsi3_emulate_pro_reserve(
2587 struct se_cmd *cmd,
2588 int type,
2589 int scope,
2590 u64 res_key)
2591{
2592 struct se_device *dev = cmd->se_dev;
2593 int ret = 0;
2594
2595 switch (type) {
2596 case PR_TYPE_WRITE_EXCLUSIVE:
2597 case PR_TYPE_EXCLUSIVE_ACCESS:
2598 case PR_TYPE_WRITE_EXCLUSIVE_REGONLY:
2599 case PR_TYPE_EXCLUSIVE_ACCESS_REGONLY:
2600 case PR_TYPE_WRITE_EXCLUSIVE_ALLREG:
2601 case PR_TYPE_EXCLUSIVE_ACCESS_ALLREG:
2602 ret = core_scsi3_pro_reserve(cmd, dev, type, scope, res_key);
2603 break;
2604 default:
6708bb27 2605 pr_err("SPC-3 PR: Unknown Service Action RESERVE Type:"
c66ac9db 2606 " 0x%02x\n", type);
03e98c9e
NB
2607 cmd->scsi_sense_reason = TCM_INVALID_CDB_FIELD;
2608 return -EINVAL;
c66ac9db
NB
2609 }
2610
2611 return ret;
2612}
2613
2614/*
2615 * Called with struct se_device->dev_reservation_lock held.
2616 */
2617static void __core_scsi3_complete_pro_release(
2618 struct se_device *dev,
2619 struct se_node_acl *se_nacl,
2620 struct t10_pr_registration *pr_reg,
2621 int explict)
2622{
2623 struct target_core_fabric_ops *tfo = se_nacl->se_tpg->se_tpg_tfo;
2624 char i_buf[PR_REG_ISID_ID_LEN];
2625 int prf_isid;
2626
2627 memset(i_buf, 0, PR_REG_ISID_ID_LEN);
2628 prf_isid = core_pr_dump_initiator_port(pr_reg, &i_buf[0],
2629 PR_REG_ISID_ID_LEN);
2630 /*
2631 * Go ahead and release the current PR reservation holder.
2632 */
2633 dev->dev_pr_res_holder = NULL;
2634
6708bb27 2635 pr_debug("SPC-3 PR [%s] Service Action: %s RELEASE cleared"
c66ac9db
NB
2636 " reservation holder TYPE: %s ALL_TG_PT: %d\n",
2637 tfo->get_fabric_name(), (explict) ? "explict" : "implict",
2638 core_scsi3_pr_dump_type(pr_reg->pr_res_type),
2639 (pr_reg->pr_reg_all_tg_pt) ? 1 : 0);
6708bb27 2640 pr_debug("SPC-3 PR [%s] RELEASE Node: %s%s\n",
c66ac9db
NB
2641 tfo->get_fabric_name(), se_nacl->initiatorname,
2642 (prf_isid) ? &i_buf[0] : "");
2643 /*
2644 * Clear TYPE and SCOPE for the next PROUT Service Action: RESERVE
2645 */
2646 pr_reg->pr_res_holder = pr_reg->pr_res_type = pr_reg->pr_res_scope = 0;
2647}
2648
2649static int core_scsi3_emulate_pro_release(
2650 struct se_cmd *cmd,
2651 int type,
2652 int scope,
2653 u64 res_key)
2654{
2655 struct se_device *dev = cmd->se_dev;
e3d6f909
AG
2656 struct se_session *se_sess = cmd->se_sess;
2657 struct se_lun *se_lun = cmd->se_lun;
c66ac9db 2658 struct t10_pr_registration *pr_reg, *pr_reg_p, *pr_res_holder;
e3d6f909 2659 struct t10_reservation *pr_tmpl = &dev->se_sub_dev->t10_pr;
c66ac9db
NB
2660 int ret, all_reg = 0;
2661
6708bb27
AG
2662 if (!se_sess || !se_lun) {
2663 pr_err("SPC-3 PR: se_sess || struct se_lun is NULL!\n");
03e98c9e
NB
2664 cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
2665 return -EINVAL;
c66ac9db
NB
2666 }
2667 /*
2668 * Locate the existing *pr_reg via struct se_node_acl pointers
2669 */
2670 pr_reg = core_scsi3_locate_pr_reg(dev, se_sess->se_node_acl, se_sess);
6708bb27
AG
2671 if (!pr_reg) {
2672 pr_err("SPC-3 PR: Unable to locate"
c66ac9db 2673 " PR_REGISTERED *pr_reg for RELEASE\n");
03e98c9e
NB
2674 cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
2675 return -EINVAL;
c66ac9db
NB
2676 }
2677 /*
2678 * From spc4r17 Section 5.7.11.2 Releasing:
2679 *
2680 * If there is no persistent reservation or in response to a persistent
2681 * reservation release request from a registered I_T nexus that is not a
2682 * persistent reservation holder (see 5.7.10), the device server shall
2683 * do the following:
2684 *
2685 * a) Not release the persistent reservation, if any;
2686 * b) Not remove any registrations; and
2687 * c) Complete the command with GOOD status.
2688 */
2689 spin_lock(&dev->dev_reservation_lock);
2690 pr_res_holder = dev->dev_pr_res_holder;
6708bb27 2691 if (!pr_res_holder) {
c66ac9db
NB
2692 /*
2693 * No persistent reservation, return GOOD status.
2694 */
2695 spin_unlock(&dev->dev_reservation_lock);
2696 core_scsi3_put_pr_reg(pr_reg);
03e98c9e 2697 return 0;
c66ac9db
NB
2698 }
2699 if ((pr_res_holder->pr_res_type == PR_TYPE_WRITE_EXCLUSIVE_ALLREG) ||
2700 (pr_res_holder->pr_res_type == PR_TYPE_EXCLUSIVE_ACCESS_ALLREG))
2701 all_reg = 1;
2702
2703 if ((all_reg == 0) && (pr_res_holder != pr_reg)) {
2704 /*
2705 * Non 'All Registrants' PR Type cases..
2706 * Release request from a registered I_T nexus that is not a
2707 * persistent reservation holder. return GOOD status.
2708 */
2709 spin_unlock(&dev->dev_reservation_lock);
2710 core_scsi3_put_pr_reg(pr_reg);
03e98c9e 2711 return 0;
c66ac9db
NB
2712 }
2713 /*
2714 * From spc4r17 Section 5.7.11.2 Releasing:
2715 *
2716 * Only the persistent reservation holder (see 5.7.10) is allowed to
2717 * release a persistent reservation.
2718 *
2719 * An application client releases the persistent reservation by issuing
2720 * a PERSISTENT RESERVE OUT command with RELEASE service action through
2721 * an I_T nexus that is a persistent reservation holder with the
2722 * following parameters:
2723 *
2724 * a) RESERVATION KEY field set to the value of the reservation key
2725 * that is registered with the logical unit for the I_T nexus;
2726 */
2727 if (res_key != pr_reg->pr_res_key) {
6708bb27 2728 pr_err("SPC-3 PR RELEASE: Received res_key: 0x%016Lx"
c66ac9db
NB
2729 " does not match existing SA REGISTER res_key:"
2730 " 0x%016Lx\n", res_key, pr_reg->pr_res_key);
2731 spin_unlock(&dev->dev_reservation_lock);
2732 core_scsi3_put_pr_reg(pr_reg);
03e98c9e
NB
2733 cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT;
2734 return -EINVAL;
c66ac9db
NB
2735 }
2736 /*
2737 * From spc4r17 Section 5.7.11.2 Releasing and above:
2738 *
2739 * b) TYPE field and SCOPE field set to match the persistent
2740 * reservation being released.
2741 */
2742 if ((pr_res_holder->pr_res_type != type) ||
2743 (pr_res_holder->pr_res_scope != scope)) {
2744 struct se_node_acl *pr_res_nacl = pr_res_holder->pr_reg_nacl;
6708bb27 2745 pr_err("SPC-3 PR RELEASE: Attempted to release"
c66ac9db
NB
2746 " reservation from [%s]: %s with different TYPE "
2747 "and/or SCOPE while reservation already held by"
2748 " [%s]: %s, returning RESERVATION_CONFLICT\n",
e3d6f909 2749 cmd->se_tfo->get_fabric_name(),
c66ac9db 2750 se_sess->se_node_acl->initiatorname,
e3d6f909 2751 pr_res_nacl->se_tpg->se_tpg_tfo->get_fabric_name(),
c66ac9db
NB
2752 pr_res_holder->pr_reg_nacl->initiatorname);
2753
2754 spin_unlock(&dev->dev_reservation_lock);
2755 core_scsi3_put_pr_reg(pr_reg);
03e98c9e
NB
2756 cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT;
2757 return -EINVAL;
c66ac9db
NB
2758 }
2759 /*
2760 * In response to a persistent reservation release request from the
2761 * persistent reservation holder the device server shall perform a
2762 * release by doing the following as an uninterrupted series of actions:
2763 * a) Release the persistent reservation;
2764 * b) Not remove any registration(s);
2765 * c) If the released persistent reservation is a registrants only type
2766 * or all registrants type persistent reservation,
2767 * the device server shall establish a unit attention condition for
2768 * the initiator port associated with every regis-
2769 * tered I_T nexus other than I_T nexus on which the PERSISTENT
2770 * RESERVE OUT command with RELEASE service action was received,
2771 * with the additional sense code set to RESERVATIONS RELEASED; and
2772 * d) If the persistent reservation is of any other type, the device
2773 * server shall not establish a unit attention condition.
2774 */
2775 __core_scsi3_complete_pro_release(dev, se_sess->se_node_acl,
2776 pr_reg, 1);
2777
2778 spin_unlock(&dev->dev_reservation_lock);
2779
2780 if ((type != PR_TYPE_WRITE_EXCLUSIVE_REGONLY) &&
2781 (type != PR_TYPE_EXCLUSIVE_ACCESS_REGONLY) &&
2782 (type != PR_TYPE_WRITE_EXCLUSIVE_ALLREG) &&
2783 (type != PR_TYPE_EXCLUSIVE_ACCESS_ALLREG)) {
2784 /*
2785 * If no UNIT ATTENTION conditions will be established for
2786 * PR_TYPE_WRITE_EXCLUSIVE or PR_TYPE_EXCLUSIVE_ACCESS
2787 * go ahead and check for APTPL=1 update+write below
2788 */
2789 goto write_aptpl;
2790 }
2791
2792 spin_lock(&pr_tmpl->registration_lock);
2793 list_for_each_entry(pr_reg_p, &pr_tmpl->registration_list,
2794 pr_reg_list) {
2795 /*
2796 * Do not establish a UNIT ATTENTION condition
2797 * for the calling I_T Nexus
2798 */
2799 if (pr_reg_p == pr_reg)
2800 continue;
2801
2802 core_scsi3_ua_allocate(pr_reg_p->pr_reg_nacl,
2803 pr_reg_p->pr_res_mapped_lun,
2804 0x2A, ASCQ_2AH_RESERVATIONS_RELEASED);
2805 }
2806 spin_unlock(&pr_tmpl->registration_lock);
2807
2808write_aptpl:
2809 if (pr_tmpl->pr_aptpl_active) {
5951146d 2810 ret = core_scsi3_update_and_write_aptpl(cmd->se_dev,
c66ac9db
NB
2811 &pr_reg->pr_aptpl_buf[0],
2812 pr_tmpl->pr_aptpl_buf_len);
6708bb27
AG
2813 if (!ret)
2814 pr_debug("SPC-3 PR: Updated APTPL metadata for RELEASE\n");
c66ac9db
NB
2815 }
2816
2817 core_scsi3_put_pr_reg(pr_reg);
2818 return 0;
2819}
2820
2821static int core_scsi3_emulate_pro_clear(
2822 struct se_cmd *cmd,
2823 u64 res_key)
2824{
2825 struct se_device *dev = cmd->se_dev;
2826 struct se_node_acl *pr_reg_nacl;
e3d6f909
AG
2827 struct se_session *se_sess = cmd->se_sess;
2828 struct t10_reservation *pr_tmpl = &dev->se_sub_dev->t10_pr;
c66ac9db
NB
2829 struct t10_pr_registration *pr_reg, *pr_reg_tmp, *pr_reg_n, *pr_res_holder;
2830 u32 pr_res_mapped_lun = 0;
2831 int calling_it_nexus = 0;
2832 /*
2833 * Locate the existing *pr_reg via struct se_node_acl pointers
2834 */
5951146d 2835 pr_reg_n = core_scsi3_locate_pr_reg(cmd->se_dev,
c66ac9db 2836 se_sess->se_node_acl, se_sess);
6708bb27
AG
2837 if (!pr_reg_n) {
2838 pr_err("SPC-3 PR: Unable to locate"
c66ac9db 2839 " PR_REGISTERED *pr_reg for CLEAR\n");
03e98c9e
NB
2840 cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
2841 return -EINVAL;
c66ac9db
NB
2842 }
2843 /*
2844 * From spc4r17 section 5.7.11.6, Clearing:
2845 *
2846 * Any application client may release the persistent reservation and
2847 * remove all registrations from a device server by issuing a
2848 * PERSISTENT RESERVE OUT command with CLEAR service action through a
2849 * registered I_T nexus with the following parameter:
2850 *
2851 * a) RESERVATION KEY field set to the value of the reservation key
2852 * that is registered with the logical unit for the I_T nexus.
2853 */
2854 if (res_key != pr_reg_n->pr_res_key) {
6708bb27 2855 pr_err("SPC-3 PR REGISTER: Received"
c66ac9db
NB
2856 " res_key: 0x%016Lx does not match"
2857 " existing SA REGISTER res_key:"
2858 " 0x%016Lx\n", res_key, pr_reg_n->pr_res_key);
2859 core_scsi3_put_pr_reg(pr_reg_n);
03e98c9e
NB
2860 cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT;
2861 return -EINVAL;
c66ac9db
NB
2862 }
2863 /*
2864 * a) Release the persistent reservation, if any;
2865 */
2866 spin_lock(&dev->dev_reservation_lock);
2867 pr_res_holder = dev->dev_pr_res_holder;
2868 if (pr_res_holder) {
2869 struct se_node_acl *pr_res_nacl = pr_res_holder->pr_reg_nacl;
2870 __core_scsi3_complete_pro_release(dev, pr_res_nacl,
2871 pr_res_holder, 0);
2872 }
2873 spin_unlock(&dev->dev_reservation_lock);
2874 /*
2875 * b) Remove all registration(s) (see spc4r17 5.7.7);
2876 */
2877 spin_lock(&pr_tmpl->registration_lock);
2878 list_for_each_entry_safe(pr_reg, pr_reg_tmp,
2879 &pr_tmpl->registration_list, pr_reg_list) {
2880
2881 calling_it_nexus = (pr_reg_n == pr_reg) ? 1 : 0;
2882 pr_reg_nacl = pr_reg->pr_reg_nacl;
2883 pr_res_mapped_lun = pr_reg->pr_res_mapped_lun;
2884 __core_scsi3_free_registration(dev, pr_reg, NULL,
2885 calling_it_nexus);
2886 /*
2887 * e) Establish a unit attention condition for the initiator
2888 * port associated with every registered I_T nexus other
2889 * than the I_T nexus on which the PERSISTENT RESERVE OUT
2890 * command with CLEAR service action was received, with the
2891 * additional sense code set to RESERVATIONS PREEMPTED.
2892 */
6708bb27 2893 if (!calling_it_nexus)
c66ac9db
NB
2894 core_scsi3_ua_allocate(pr_reg_nacl, pr_res_mapped_lun,
2895 0x2A, ASCQ_2AH_RESERVATIONS_PREEMPTED);
2896 }
2897 spin_unlock(&pr_tmpl->registration_lock);
2898
6708bb27 2899 pr_debug("SPC-3 PR [%s] Service Action: CLEAR complete\n",
e3d6f909 2900 cmd->se_tfo->get_fabric_name());
c66ac9db
NB
2901
2902 if (pr_tmpl->pr_aptpl_active) {
5951146d 2903 core_scsi3_update_and_write_aptpl(cmd->se_dev, NULL, 0);
6708bb27 2904 pr_debug("SPC-3 PR: Updated APTPL metadata"
c66ac9db
NB
2905 " for CLEAR\n");
2906 }
2907
2908 core_scsi3_pr_generation(dev);
2909 return 0;
2910}
2911
2912/*
2913 * Called with struct se_device->dev_reservation_lock held.
2914 */
2915static void __core_scsi3_complete_pro_preempt(
2916 struct se_device *dev,
2917 struct t10_pr_registration *pr_reg,
2918 struct list_head *preempt_and_abort_list,
2919 int type,
2920 int scope,
2921 int abort)
2922{
2923 struct se_node_acl *nacl = pr_reg->pr_reg_nacl;
2924 struct target_core_fabric_ops *tfo = nacl->se_tpg->se_tpg_tfo;
2925 char i_buf[PR_REG_ISID_ID_LEN];
2926 int prf_isid;
2927
2928 memset(i_buf, 0, PR_REG_ISID_ID_LEN);
2929 prf_isid = core_pr_dump_initiator_port(pr_reg, &i_buf[0],
2930 PR_REG_ISID_ID_LEN);
2931 /*
2932 * Do an implict RELEASE of the existing reservation.
2933 */
2934 if (dev->dev_pr_res_holder)
2935 __core_scsi3_complete_pro_release(dev, nacl,
2936 dev->dev_pr_res_holder, 0);
2937
2938 dev->dev_pr_res_holder = pr_reg;
2939 pr_reg->pr_res_holder = 1;
2940 pr_reg->pr_res_type = type;
2941 pr_reg->pr_res_scope = scope;
2942
6708bb27 2943 pr_debug("SPC-3 PR [%s] Service Action: PREEMPT%s created new"
c66ac9db
NB
2944 " reservation holder TYPE: %s ALL_TG_PT: %d\n",
2945 tfo->get_fabric_name(), (abort) ? "_AND_ABORT" : "",
2946 core_scsi3_pr_dump_type(type),
2947 (pr_reg->pr_reg_all_tg_pt) ? 1 : 0);
6708bb27 2948 pr_debug("SPC-3 PR [%s] PREEMPT%s from Node: %s%s\n",
c66ac9db
NB
2949 tfo->get_fabric_name(), (abort) ? "_AND_ABORT" : "",
2950 nacl->initiatorname, (prf_isid) ? &i_buf[0] : "");
2951 /*
2952 * For PREEMPT_AND_ABORT, add the preempting reservation's
2953 * struct t10_pr_registration to the list that will be compared
2954 * against received CDBs..
2955 */
2956 if (preempt_and_abort_list)
2957 list_add_tail(&pr_reg->pr_reg_abort_list,
2958 preempt_and_abort_list);
2959}
2960
2961static void core_scsi3_release_preempt_and_abort(
2962 struct list_head *preempt_and_abort_list,
2963 struct t10_pr_registration *pr_reg_holder)
2964{
2965 struct t10_pr_registration *pr_reg, *pr_reg_tmp;
2966
2967 list_for_each_entry_safe(pr_reg, pr_reg_tmp, preempt_and_abort_list,
2968 pr_reg_abort_list) {
2969
2970 list_del(&pr_reg->pr_reg_abort_list);
2971 if (pr_reg_holder == pr_reg)
2972 continue;
2973 if (pr_reg->pr_res_holder) {
6708bb27 2974 pr_warn("pr_reg->pr_res_holder still set\n");
c66ac9db
NB
2975 continue;
2976 }
2977
2978 pr_reg->pr_reg_deve = NULL;
2979 pr_reg->pr_reg_nacl = NULL;
2980 kfree(pr_reg->pr_aptpl_buf);
2981 kmem_cache_free(t10_pr_reg_cache, pr_reg);
2982 }
2983}
2984
c66ac9db
NB
2985static int core_scsi3_pro_preempt(
2986 struct se_cmd *cmd,
2987 int type,
2988 int scope,
2989 u64 res_key,
2990 u64 sa_res_key,
2991 int abort)
2992{
5951146d 2993 struct se_device *dev = cmd->se_dev;
c66ac9db
NB
2994 struct se_dev_entry *se_deve;
2995 struct se_node_acl *pr_reg_nacl;
e3d6f909 2996 struct se_session *se_sess = cmd->se_sess;
c66ac9db
NB
2997 struct list_head preempt_and_abort_list;
2998 struct t10_pr_registration *pr_reg, *pr_reg_tmp, *pr_reg_n, *pr_res_holder;
e3d6f909 2999 struct t10_reservation *pr_tmpl = &dev->se_sub_dev->t10_pr;
c66ac9db
NB
3000 u32 pr_res_mapped_lun = 0;
3001 int all_reg = 0, calling_it_nexus = 0, released_regs = 0;
3002 int prh_type = 0, prh_scope = 0, ret;
3003
03e98c9e
NB
3004 if (!se_sess) {
3005 cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
3006 return -EINVAL;
3007 }
c66ac9db
NB
3008
3009 se_deve = &se_sess->se_node_acl->device_list[cmd->orig_fe_lun];
5951146d 3010 pr_reg_n = core_scsi3_locate_pr_reg(cmd->se_dev, se_sess->se_node_acl,
c66ac9db 3011 se_sess);
6708bb27
AG
3012 if (!pr_reg_n) {
3013 pr_err("SPC-3 PR: Unable to locate"
c66ac9db
NB
3014 " PR_REGISTERED *pr_reg for PREEMPT%s\n",
3015 (abort) ? "_AND_ABORT" : "");
03e98c9e
NB
3016 cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT;
3017 return -EINVAL;
c66ac9db
NB
3018 }
3019 if (pr_reg_n->pr_res_key != res_key) {
3020 core_scsi3_put_pr_reg(pr_reg_n);
03e98c9e
NB
3021 cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT;
3022 return -EINVAL;
c66ac9db
NB
3023 }
3024 if (scope != PR_SCOPE_LU_SCOPE) {
6708bb27 3025 pr_err("SPC-3 PR: Illegal SCOPE: 0x%02x\n", scope);
c66ac9db 3026 core_scsi3_put_pr_reg(pr_reg_n);
03e98c9e
NB
3027 cmd->scsi_sense_reason = TCM_INVALID_PARAMETER_LIST;
3028 return -EINVAL;
c66ac9db
NB
3029 }
3030 INIT_LIST_HEAD(&preempt_and_abort_list);
3031
3032 spin_lock(&dev->dev_reservation_lock);
3033 pr_res_holder = dev->dev_pr_res_holder;
3034 if (pr_res_holder &&
3035 ((pr_res_holder->pr_res_type == PR_TYPE_WRITE_EXCLUSIVE_ALLREG) ||
3036 (pr_res_holder->pr_res_type == PR_TYPE_EXCLUSIVE_ACCESS_ALLREG)))
3037 all_reg = 1;
3038
6708bb27 3039 if (!all_reg && !sa_res_key) {
c66ac9db
NB
3040 spin_unlock(&dev->dev_reservation_lock);
3041 core_scsi3_put_pr_reg(pr_reg_n);
03e98c9e
NB
3042 cmd->scsi_sense_reason = TCM_INVALID_PARAMETER_LIST;
3043 return -EINVAL;
c66ac9db
NB
3044 }
3045 /*
3046 * From spc4r17, section 5.7.11.4.4 Removing Registrations:
3047 *
3048 * If the SERVICE ACTION RESERVATION KEY field does not identify a
3049 * persistent reservation holder or there is no persistent reservation
3050 * holder (i.e., there is no persistent reservation), then the device
3051 * server shall perform a preempt by doing the following in an
3052 * uninterrupted series of actions. (See below..)
3053 */
6708bb27 3054 if (!pr_res_holder || (pr_res_holder->pr_res_key != sa_res_key)) {
c66ac9db
NB
3055 /*
3056 * No existing or SA Reservation Key matching reservations..
3057 *
3058 * PROUT SA PREEMPT with All Registrant type reservations are
3059 * allowed to be processed without a matching SA Reservation Key
3060 */
3061 spin_lock(&pr_tmpl->registration_lock);
3062 list_for_each_entry_safe(pr_reg, pr_reg_tmp,
3063 &pr_tmpl->registration_list, pr_reg_list) {
3064 /*
3065 * Removing of registrations in non all registrants
3066 * type reservations without a matching SA reservation
3067 * key.
3068 *
3069 * a) Remove the registrations for all I_T nexuses
3070 * specified by the SERVICE ACTION RESERVATION KEY
3071 * field;
3072 * b) Ignore the contents of the SCOPE and TYPE fields;
3073 * c) Process tasks as defined in 5.7.1; and
3074 * d) Establish a unit attention condition for the
3075 * initiator port associated with every I_T nexus
3076 * that lost its registration other than the I_T
3077 * nexus on which the PERSISTENT RESERVE OUT command
3078 * was received, with the additional sense code set
3079 * to REGISTRATIONS PREEMPTED.
3080 */
6708bb27 3081 if (!all_reg) {
c66ac9db
NB
3082 if (pr_reg->pr_res_key != sa_res_key)
3083 continue;
3084
3085 calling_it_nexus = (pr_reg_n == pr_reg) ? 1 : 0;
3086 pr_reg_nacl = pr_reg->pr_reg_nacl;
3087 pr_res_mapped_lun = pr_reg->pr_res_mapped_lun;
3088 __core_scsi3_free_registration(dev, pr_reg,
3089 (abort) ? &preempt_and_abort_list :
3090 NULL, calling_it_nexus);
3091 released_regs++;
3092 } else {
3093 /*
3094 * Case for any existing all registrants type
3095 * reservation, follow logic in spc4r17 section
3096 * 5.7.11.4 Preempting, Table 52 and Figure 7.
3097 *
3098 * For a ZERO SA Reservation key, release
3099 * all other registrations and do an implict
3100 * release of active persistent reservation.
3101 *
3102 * For a non-ZERO SA Reservation key, only
3103 * release the matching reservation key from
3104 * registrations.
3105 */
3106 if ((sa_res_key) &&
3107 (pr_reg->pr_res_key != sa_res_key))
3108 continue;
3109
3110 calling_it_nexus = (pr_reg_n == pr_reg) ? 1 : 0;
3111 if (calling_it_nexus)
3112 continue;
3113
3114 pr_reg_nacl = pr_reg->pr_reg_nacl;
3115 pr_res_mapped_lun = pr_reg->pr_res_mapped_lun;
3116 __core_scsi3_free_registration(dev, pr_reg,
3117 (abort) ? &preempt_and_abort_list :
3118 NULL, 0);
3119 released_regs++;
3120 }
6708bb27 3121 if (!calling_it_nexus)
c66ac9db
NB
3122 core_scsi3_ua_allocate(pr_reg_nacl,
3123 pr_res_mapped_lun, 0x2A,
9e08e34e 3124 ASCQ_2AH_REGISTRATIONS_PREEMPTED);
c66ac9db
NB
3125 }
3126 spin_unlock(&pr_tmpl->registration_lock);
3127 /*
3128 * If a PERSISTENT RESERVE OUT with a PREEMPT service action or
3129 * a PREEMPT AND ABORT service action sets the SERVICE ACTION
3130 * RESERVATION KEY field to a value that does not match any
3131 * registered reservation key, then the device server shall
3132 * complete the command with RESERVATION CONFLICT status.
3133 */
6708bb27 3134 if (!released_regs) {
c66ac9db
NB
3135 spin_unlock(&dev->dev_reservation_lock);
3136 core_scsi3_put_pr_reg(pr_reg_n);
03e98c9e
NB
3137 cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT;
3138 return -EINVAL;
c66ac9db
NB
3139 }
3140 /*
3141 * For an existing all registrants type reservation
3142 * with a zero SA rservation key, preempt the existing
3143 * reservation with the new PR type and scope.
3144 */
3145 if (pr_res_holder && all_reg && !(sa_res_key)) {
3146 __core_scsi3_complete_pro_preempt(dev, pr_reg_n,
3147 (abort) ? &preempt_and_abort_list : NULL,
3148 type, scope, abort);
3149
3150 if (abort)
3151 core_scsi3_release_preempt_and_abort(
3152 &preempt_and_abort_list, pr_reg_n);
3153 }
3154 spin_unlock(&dev->dev_reservation_lock);
3155
3156 if (pr_tmpl->pr_aptpl_active) {
5951146d 3157 ret = core_scsi3_update_and_write_aptpl(cmd->se_dev,
c66ac9db
NB
3158 &pr_reg_n->pr_aptpl_buf[0],
3159 pr_tmpl->pr_aptpl_buf_len);
6708bb27
AG
3160 if (!ret)
3161 pr_debug("SPC-3 PR: Updated APTPL"
c66ac9db
NB
3162 " metadata for PREEMPT%s\n", (abort) ?
3163 "_AND_ABORT" : "");
3164 }
3165
3166 core_scsi3_put_pr_reg(pr_reg_n);
5951146d 3167 core_scsi3_pr_generation(cmd->se_dev);
c66ac9db
NB
3168 return 0;
3169 }
3170 /*
3171 * The PREEMPTing SA reservation key matches that of the
3172 * existing persistent reservation, first, we check if
3173 * we are preempting our own reservation.
3174 * From spc4r17, section 5.7.11.4.3 Preempting
3175 * persistent reservations and registration handling
3176 *
3177 * If an all registrants persistent reservation is not
3178 * present, it is not an error for the persistent
3179 * reservation holder to preempt itself (i.e., a
3180 * PERSISTENT RESERVE OUT with a PREEMPT service action
3181 * or a PREEMPT AND ABORT service action with the
3182 * SERVICE ACTION RESERVATION KEY value equal to the
3183 * persistent reservation holder's reservation key that
3184 * is received from the persistent reservation holder).
3185 * In that case, the device server shall establish the
3186 * new persistent reservation and maintain the
3187 * registration.
3188 */
3189 prh_type = pr_res_holder->pr_res_type;
3190 prh_scope = pr_res_holder->pr_res_scope;
3191 /*
3192 * If the SERVICE ACTION RESERVATION KEY field identifies a
3193 * persistent reservation holder (see 5.7.10), the device
3194 * server shall perform a preempt by doing the following as
3195 * an uninterrupted series of actions:
3196 *
3197 * a) Release the persistent reservation for the holder
3198 * identified by the SERVICE ACTION RESERVATION KEY field;
3199 */
3200 if (pr_reg_n != pr_res_holder)
3201 __core_scsi3_complete_pro_release(dev,
3202 pr_res_holder->pr_reg_nacl,
3203 dev->dev_pr_res_holder, 0);
3204 /*
3205 * b) Remove the registrations for all I_T nexuses identified
3206 * by the SERVICE ACTION RESERVATION KEY field, except the
3207 * I_T nexus that is being used for the PERSISTENT RESERVE
3208 * OUT command. If an all registrants persistent reservation
3209 * is present and the SERVICE ACTION RESERVATION KEY field
3210 * is set to zero, then all registrations shall be removed
3211 * except for that of the I_T nexus that is being used for
3212 * the PERSISTENT RESERVE OUT command;
3213 */
3214 spin_lock(&pr_tmpl->registration_lock);
3215 list_for_each_entry_safe(pr_reg, pr_reg_tmp,
3216 &pr_tmpl->registration_list, pr_reg_list) {
3217
3218 calling_it_nexus = (pr_reg_n == pr_reg) ? 1 : 0;
3219 if (calling_it_nexus)
3220 continue;
3221
3222 if (pr_reg->pr_res_key != sa_res_key)
3223 continue;
3224
3225 pr_reg_nacl = pr_reg->pr_reg_nacl;
3226 pr_res_mapped_lun = pr_reg->pr_res_mapped_lun;
3227 __core_scsi3_free_registration(dev, pr_reg,
3228 (abort) ? &preempt_and_abort_list : NULL,
3229 calling_it_nexus);
3230 /*
3231 * e) Establish a unit attention condition for the initiator
3232 * port associated with every I_T nexus that lost its
3233 * persistent reservation and/or registration, with the
3234 * additional sense code set to REGISTRATIONS PREEMPTED;
3235 */
3236 core_scsi3_ua_allocate(pr_reg_nacl, pr_res_mapped_lun, 0x2A,
9e08e34e 3237 ASCQ_2AH_REGISTRATIONS_PREEMPTED);
c66ac9db
NB
3238 }
3239 spin_unlock(&pr_tmpl->registration_lock);
3240 /*
3241 * c) Establish a persistent reservation for the preempting
3242 * I_T nexus using the contents of the SCOPE and TYPE fields;
3243 */
3244 __core_scsi3_complete_pro_preempt(dev, pr_reg_n,
3245 (abort) ? &preempt_and_abort_list : NULL,
3246 type, scope, abort);
3247 /*
3248 * d) Process tasks as defined in 5.7.1;
3249 * e) See above..
3250 * f) If the type or scope has changed, then for every I_T nexus
3251 * whose reservation key was not removed, except for the I_T
3252 * nexus on which the PERSISTENT RESERVE OUT command was
3253 * received, the device server shall establish a unit
3254 * attention condition for the initiator port associated with
3255 * that I_T nexus, with the additional sense code set to
3256 * RESERVATIONS RELEASED. If the type or scope have not
3257 * changed, then no unit attention condition(s) shall be
3258 * established for this reason.
3259 */
3260 if ((prh_type != type) || (prh_scope != scope)) {
3261 spin_lock(&pr_tmpl->registration_lock);
3262 list_for_each_entry_safe(pr_reg, pr_reg_tmp,
3263 &pr_tmpl->registration_list, pr_reg_list) {
3264
3265 calling_it_nexus = (pr_reg_n == pr_reg) ? 1 : 0;
3266 if (calling_it_nexus)
3267 continue;
3268
3269 core_scsi3_ua_allocate(pr_reg->pr_reg_nacl,
3270 pr_reg->pr_res_mapped_lun, 0x2A,
3271 ASCQ_2AH_RESERVATIONS_RELEASED);
3272 }
3273 spin_unlock(&pr_tmpl->registration_lock);
3274 }
3275 spin_unlock(&dev->dev_reservation_lock);
3276 /*
3277 * Call LUN_RESET logic upon list of struct t10_pr_registration,
3278 * All received CDBs for the matching existing reservation and
3279 * registrations undergo ABORT_TASK logic.
3280 *
3281 * From there, core_scsi3_release_preempt_and_abort() will
3282 * release every registration in the list (which have already
3283 * been removed from the primary pr_reg list), except the
3284 * new persistent reservation holder, the calling Initiator Port.
3285 */
3286 if (abort) {
3287 core_tmr_lun_reset(dev, NULL, &preempt_and_abort_list, cmd);
3288 core_scsi3_release_preempt_and_abort(&preempt_and_abort_list,
3289 pr_reg_n);
3290 }
3291
3292 if (pr_tmpl->pr_aptpl_active) {
5951146d 3293 ret = core_scsi3_update_and_write_aptpl(cmd->se_dev,
c66ac9db
NB
3294 &pr_reg_n->pr_aptpl_buf[0],
3295 pr_tmpl->pr_aptpl_buf_len);
6708bb27
AG
3296 if (!ret)
3297 pr_debug("SPC-3 PR: Updated APTPL metadata for PREEMPT"
c66ac9db
NB
3298 "%s\n", (abort) ? "_AND_ABORT" : "");
3299 }
3300
3301 core_scsi3_put_pr_reg(pr_reg_n);
5951146d 3302 core_scsi3_pr_generation(cmd->se_dev);
c66ac9db
NB
3303 return 0;
3304}
3305
3306static int core_scsi3_emulate_pro_preempt(
3307 struct se_cmd *cmd,
3308 int type,
3309 int scope,
3310 u64 res_key,
3311 u64 sa_res_key,
3312 int abort)
3313{
3314 int ret = 0;
3315
3316 switch (type) {
3317 case PR_TYPE_WRITE_EXCLUSIVE:
3318 case PR_TYPE_EXCLUSIVE_ACCESS:
3319 case PR_TYPE_WRITE_EXCLUSIVE_REGONLY:
3320 case PR_TYPE_EXCLUSIVE_ACCESS_REGONLY:
3321 case PR_TYPE_WRITE_EXCLUSIVE_ALLREG:
3322 case PR_TYPE_EXCLUSIVE_ACCESS_ALLREG:
3323 ret = core_scsi3_pro_preempt(cmd, type, scope,
3324 res_key, sa_res_key, abort);
3325 break;
3326 default:
6708bb27 3327 pr_err("SPC-3 PR: Unknown Service Action PREEMPT%s"
c66ac9db 3328 " Type: 0x%02x\n", (abort) ? "_AND_ABORT" : "", type);
03e98c9e
NB
3329 cmd->scsi_sense_reason = TCM_INVALID_CDB_FIELD;
3330 return -EINVAL;
c66ac9db
NB
3331 }
3332
3333 return ret;
3334}
3335
3336
3337static int core_scsi3_emulate_pro_register_and_move(
3338 struct se_cmd *cmd,
3339 u64 res_key,
3340 u64 sa_res_key,
3341 int aptpl,
3342 int unreg)
3343{
e3d6f909 3344 struct se_session *se_sess = cmd->se_sess;
5951146d 3345 struct se_device *dev = cmd->se_dev;
c66ac9db 3346 struct se_dev_entry *se_deve, *dest_se_deve = NULL;
e3d6f909 3347 struct se_lun *se_lun = cmd->se_lun;
c66ac9db
NB
3348 struct se_node_acl *pr_res_nacl, *pr_reg_nacl, *dest_node_acl = NULL;
3349 struct se_port *se_port;
3350 struct se_portal_group *se_tpg, *dest_se_tpg = NULL;
3351 struct target_core_fabric_ops *dest_tf_ops = NULL, *tf_ops;
3352 struct t10_pr_registration *pr_reg, *pr_res_holder, *dest_pr_reg;
e3d6f909 3353 struct t10_reservation *pr_tmpl = &dev->se_sub_dev->t10_pr;
05d1c7c0 3354 unsigned char *buf;
c66ac9db
NB
3355 unsigned char *initiator_str;
3356 char *iport_ptr = NULL, dest_iport[64], i_buf[PR_REG_ISID_ID_LEN];
3357 u32 tid_len, tmp_tid_len;
3358 int new_reg = 0, type, scope, ret, matching_iname, prf_isid;
3359 unsigned short rtpi;
3360 unsigned char proto_ident;
3361
6708bb27
AG
3362 if (!se_sess || !se_lun) {
3363 pr_err("SPC-3 PR: se_sess || struct se_lun is NULL!\n");
03e98c9e
NB
3364 cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
3365 return -EINVAL;
c66ac9db
NB
3366 }
3367 memset(dest_iport, 0, 64);
3368 memset(i_buf, 0, PR_REG_ISID_ID_LEN);
3369 se_tpg = se_sess->se_tpg;
e3d6f909 3370 tf_ops = se_tpg->se_tpg_tfo;
c66ac9db
NB
3371 se_deve = &se_sess->se_node_acl->device_list[cmd->orig_fe_lun];
3372 /*
3373 * Follow logic from spc4r17 Section 5.7.8, Table 50 --
3374 * Register behaviors for a REGISTER AND MOVE service action
3375 *
3376 * Locate the existing *pr_reg via struct se_node_acl pointers
3377 */
5951146d 3378 pr_reg = core_scsi3_locate_pr_reg(cmd->se_dev, se_sess->se_node_acl,
c66ac9db 3379 se_sess);
6708bb27
AG
3380 if (!pr_reg) {
3381 pr_err("SPC-3 PR: Unable to locate PR_REGISTERED"
c66ac9db 3382 " *pr_reg for REGISTER_AND_MOVE\n");
03e98c9e
NB
3383 cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
3384 return -EINVAL;
c66ac9db
NB
3385 }
3386 /*
3387 * The provided reservation key much match the existing reservation key
3388 * provided during this initiator's I_T nexus registration.
3389 */
3390 if (res_key != pr_reg->pr_res_key) {
6708bb27 3391 pr_warn("SPC-3 PR REGISTER_AND_MOVE: Received"
c66ac9db
NB
3392 " res_key: 0x%016Lx does not match existing SA REGISTER"
3393 " res_key: 0x%016Lx\n", res_key, pr_reg->pr_res_key);
3394 core_scsi3_put_pr_reg(pr_reg);
03e98c9e
NB
3395 cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT;
3396 return -EINVAL;
c66ac9db
NB
3397 }
3398 /*
3399 * The service active reservation key needs to be non zero
3400 */
6708bb27
AG
3401 if (!sa_res_key) {
3402 pr_warn("SPC-3 PR REGISTER_AND_MOVE: Received zero"
c66ac9db
NB
3403 " sa_res_key\n");
3404 core_scsi3_put_pr_reg(pr_reg);
03e98c9e
NB
3405 cmd->scsi_sense_reason = TCM_INVALID_PARAMETER_LIST;
3406 return -EINVAL;
c66ac9db 3407 }
05d1c7c0 3408
c66ac9db
NB
3409 /*
3410 * Determine the Relative Target Port Identifier where the reservation
3411 * will be moved to for the TransportID containing SCSI initiator WWN
3412 * information.
3413 */
4949314c 3414 buf = transport_kmap_data_sg(cmd);
c66ac9db
NB
3415 rtpi = (buf[18] & 0xff) << 8;
3416 rtpi |= buf[19] & 0xff;
3417 tid_len = (buf[20] & 0xff) << 24;
3418 tid_len |= (buf[21] & 0xff) << 16;
3419 tid_len |= (buf[22] & 0xff) << 8;
3420 tid_len |= buf[23] & 0xff;
4949314c 3421 transport_kunmap_data_sg(cmd);
05d1c7c0 3422 buf = NULL;
c66ac9db
NB
3423
3424 if ((tid_len + 24) != cmd->data_length) {
6708bb27 3425 pr_err("SPC-3 PR: Illegal tid_len: %u + 24 byte header"
c66ac9db
NB
3426 " does not equal CDB data_length: %u\n", tid_len,
3427 cmd->data_length);
3428 core_scsi3_put_pr_reg(pr_reg);
03e98c9e
NB
3429 cmd->scsi_sense_reason = TCM_INVALID_PARAMETER_LIST;
3430 return -EINVAL;
c66ac9db
NB
3431 }
3432
3433 spin_lock(&dev->se_port_lock);
3434 list_for_each_entry(se_port, &dev->dev_sep_list, sep_list) {
3435 if (se_port->sep_rtpi != rtpi)
3436 continue;
3437 dest_se_tpg = se_port->sep_tpg;
6708bb27 3438 if (!dest_se_tpg)
c66ac9db 3439 continue;
e3d6f909 3440 dest_tf_ops = dest_se_tpg->se_tpg_tfo;
6708bb27 3441 if (!dest_tf_ops)
c66ac9db
NB
3442 continue;
3443
3444 atomic_inc(&dest_se_tpg->tpg_pr_ref_count);
3445 smp_mb__after_atomic_inc();
3446 spin_unlock(&dev->se_port_lock);
3447
3448 ret = core_scsi3_tpg_depend_item(dest_se_tpg);
3449 if (ret != 0) {
6708bb27 3450 pr_err("core_scsi3_tpg_depend_item() failed"
c66ac9db
NB
3451 " for dest_se_tpg\n");
3452 atomic_dec(&dest_se_tpg->tpg_pr_ref_count);
3453 smp_mb__after_atomic_dec();
3454 core_scsi3_put_pr_reg(pr_reg);
03e98c9e
NB
3455 cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
3456 return -EINVAL;
c66ac9db
NB
3457 }
3458
3459 spin_lock(&dev->se_port_lock);
3460 break;
3461 }
3462 spin_unlock(&dev->se_port_lock);
3463
6708bb27
AG
3464 if (!dest_se_tpg || !dest_tf_ops) {
3465 pr_err("SPC-3 PR REGISTER_AND_MOVE: Unable to locate"
c66ac9db
NB
3466 " fabric ops from Relative Target Port Identifier:"
3467 " %hu\n", rtpi);
3468 core_scsi3_put_pr_reg(pr_reg);
03e98c9e
NB
3469 cmd->scsi_sense_reason = TCM_INVALID_PARAMETER_LIST;
3470 return -EINVAL;
c66ac9db 3471 }
05d1c7c0 3472
4949314c 3473 buf = transport_kmap_data_sg(cmd);
c66ac9db
NB
3474 proto_ident = (buf[24] & 0x0f);
3475#if 0
6708bb27 3476 pr_debug("SPC-3 PR REGISTER_AND_MOVE: Extracted Protocol Identifier:"
c66ac9db
NB
3477 " 0x%02x\n", proto_ident);
3478#endif
3479 if (proto_ident != dest_tf_ops->get_fabric_proto_ident(dest_se_tpg)) {
6708bb27 3480 pr_err("SPC-3 PR REGISTER_AND_MOVE: Received"
c66ac9db
NB
3481 " proto_ident: 0x%02x does not match ident: 0x%02x"
3482 " from fabric: %s\n", proto_ident,
3483 dest_tf_ops->get_fabric_proto_ident(dest_se_tpg),
3484 dest_tf_ops->get_fabric_name());
03e98c9e
NB
3485 cmd->scsi_sense_reason = TCM_INVALID_PARAMETER_LIST;
3486 ret = -EINVAL;
c66ac9db
NB
3487 goto out;
3488 }
3489 if (dest_tf_ops->tpg_parse_pr_out_transport_id == NULL) {
6708bb27 3490 pr_err("SPC-3 PR REGISTER_AND_MOVE: Fabric does not"
c66ac9db
NB
3491 " containg a valid tpg_parse_pr_out_transport_id"
3492 " function pointer\n");
03e98c9e
NB
3493 cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
3494 ret = -EINVAL;
c66ac9db
NB
3495 goto out;
3496 }
3497 initiator_str = dest_tf_ops->tpg_parse_pr_out_transport_id(dest_se_tpg,
3498 (const char *)&buf[24], &tmp_tid_len, &iport_ptr);
6708bb27
AG
3499 if (!initiator_str) {
3500 pr_err("SPC-3 PR REGISTER_AND_MOVE: Unable to locate"
c66ac9db 3501 " initiator_str from Transport ID\n");
03e98c9e
NB
3502 cmd->scsi_sense_reason = TCM_INVALID_PARAMETER_LIST;
3503 ret = -EINVAL;
c66ac9db
NB
3504 goto out;
3505 }
3506
4949314c 3507 transport_kunmap_data_sg(cmd);
05d1c7c0
AG
3508 buf = NULL;
3509
6708bb27 3510 pr_debug("SPC-3 PR [%s] Extracted initiator %s identifier: %s"
c66ac9db
NB
3511 " %s\n", dest_tf_ops->get_fabric_name(), (iport_ptr != NULL) ?
3512 "port" : "device", initiator_str, (iport_ptr != NULL) ?
3513 iport_ptr : "");
3514 /*
3515 * If a PERSISTENT RESERVE OUT command with a REGISTER AND MOVE service
3516 * action specifies a TransportID that is the same as the initiator port
3517 * of the I_T nexus for the command received, then the command shall
3518 * be terminated with CHECK CONDITION status, with the sense key set to
3519 * ILLEGAL REQUEST, and the additional sense code set to INVALID FIELD
3520 * IN PARAMETER LIST.
3521 */
3522 pr_reg_nacl = pr_reg->pr_reg_nacl;
3523 matching_iname = (!strcmp(initiator_str,
3524 pr_reg_nacl->initiatorname)) ? 1 : 0;
6708bb27 3525 if (!matching_iname)
c66ac9db
NB
3526 goto after_iport_check;
3527
6708bb27
AG
3528 if (!iport_ptr || !pr_reg->isid_present_at_reg) {
3529 pr_err("SPC-3 PR REGISTER_AND_MOVE: TransportID: %s"
c66ac9db
NB
3530 " matches: %s on received I_T Nexus\n", initiator_str,
3531 pr_reg_nacl->initiatorname);
03e98c9e
NB
3532 cmd->scsi_sense_reason = TCM_INVALID_PARAMETER_LIST;
3533 ret = -EINVAL;
c66ac9db
NB
3534 goto out;
3535 }
6708bb27
AG
3536 if (!strcmp(iport_ptr, pr_reg->pr_reg_isid)) {
3537 pr_err("SPC-3 PR REGISTER_AND_MOVE: TransportID: %s %s"
c66ac9db
NB
3538 " matches: %s %s on received I_T Nexus\n",
3539 initiator_str, iport_ptr, pr_reg_nacl->initiatorname,
3540 pr_reg->pr_reg_isid);
03e98c9e
NB
3541 cmd->scsi_sense_reason = TCM_INVALID_PARAMETER_LIST;
3542 ret = -EINVAL;
c66ac9db
NB
3543 goto out;
3544 }
3545after_iport_check:
3546 /*
3547 * Locate the destination struct se_node_acl from the received Transport ID
3548 */
28638887 3549 spin_lock_irq(&dest_se_tpg->acl_node_lock);
c66ac9db
NB
3550 dest_node_acl = __core_tpg_get_initiator_node_acl(dest_se_tpg,
3551 initiator_str);
3552 if (dest_node_acl) {
3553 atomic_inc(&dest_node_acl->acl_pr_ref_count);
3554 smp_mb__after_atomic_inc();
3555 }
28638887 3556 spin_unlock_irq(&dest_se_tpg->acl_node_lock);
c66ac9db 3557
6708bb27
AG
3558 if (!dest_node_acl) {
3559 pr_err("Unable to locate %s dest_node_acl for"
c66ac9db
NB
3560 " TransportID%s\n", dest_tf_ops->get_fabric_name(),
3561 initiator_str);
03e98c9e
NB
3562 cmd->scsi_sense_reason = TCM_INVALID_PARAMETER_LIST;
3563 ret = -EINVAL;
c66ac9db
NB
3564 goto out;
3565 }
3566 ret = core_scsi3_nodeacl_depend_item(dest_node_acl);
3567 if (ret != 0) {
6708bb27 3568 pr_err("core_scsi3_nodeacl_depend_item() for"
c66ac9db
NB
3569 " dest_node_acl\n");
3570 atomic_dec(&dest_node_acl->acl_pr_ref_count);
3571 smp_mb__after_atomic_dec();
3572 dest_node_acl = NULL;
03e98c9e
NB
3573 cmd->scsi_sense_reason = TCM_INVALID_PARAMETER_LIST;
3574 ret = -EINVAL;
c66ac9db
NB
3575 goto out;
3576 }
3577#if 0
6708bb27 3578 pr_debug("SPC-3 PR REGISTER_AND_MOVE: Found %s dest_node_acl:"
c66ac9db
NB
3579 " %s from TransportID\n", dest_tf_ops->get_fabric_name(),
3580 dest_node_acl->initiatorname);
3581#endif
3582 /*
3583 * Locate the struct se_dev_entry pointer for the matching RELATIVE TARGET
3584 * PORT IDENTIFIER.
3585 */
3586 dest_se_deve = core_get_se_deve_from_rtpi(dest_node_acl, rtpi);
6708bb27
AG
3587 if (!dest_se_deve) {
3588 pr_err("Unable to locate %s dest_se_deve from RTPI:"
c66ac9db 3589 " %hu\n", dest_tf_ops->get_fabric_name(), rtpi);
03e98c9e
NB
3590 cmd->scsi_sense_reason = TCM_INVALID_PARAMETER_LIST;
3591 ret = -EINVAL;
c66ac9db
NB
3592 goto out;
3593 }
3594
3595 ret = core_scsi3_lunacl_depend_item(dest_se_deve);
3596 if (ret < 0) {
6708bb27 3597 pr_err("core_scsi3_lunacl_depend_item() failed\n");
c66ac9db
NB
3598 atomic_dec(&dest_se_deve->pr_ref_count);
3599 smp_mb__after_atomic_dec();
3600 dest_se_deve = NULL;
03e98c9e
NB
3601 cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
3602 ret = -EINVAL;
c66ac9db
NB
3603 goto out;
3604 }
3605#if 0
6708bb27 3606 pr_debug("SPC-3 PR REGISTER_AND_MOVE: Located %s node %s LUN"
c66ac9db
NB
3607 " ACL for dest_se_deve->mapped_lun: %u\n",
3608 dest_tf_ops->get_fabric_name(), dest_node_acl->initiatorname,
3609 dest_se_deve->mapped_lun);
3610#endif
3611 /*
3612 * A persistent reservation needs to already existing in order to
3613 * successfully complete the REGISTER_AND_MOVE service action..
3614 */
3615 spin_lock(&dev->dev_reservation_lock);
3616 pr_res_holder = dev->dev_pr_res_holder;
6708bb27
AG
3617 if (!pr_res_holder) {
3618 pr_warn("SPC-3 PR REGISTER_AND_MOVE: No reservation"
c66ac9db
NB
3619 " currently held\n");
3620 spin_unlock(&dev->dev_reservation_lock);
03e98c9e
NB
3621 cmd->scsi_sense_reason = TCM_INVALID_CDB_FIELD;
3622 ret = -EINVAL;
c66ac9db
NB
3623 goto out;
3624 }
3625 /*
3626 * The received on I_T Nexus must be the reservation holder.
3627 *
3628 * From spc4r17 section 5.7.8 Table 50 --
3629 * Register behaviors for a REGISTER AND MOVE service action
3630 */
3631 if (pr_res_holder != pr_reg) {
6708bb27 3632 pr_warn("SPC-3 PR REGISTER_AND_MOVE: Calling I_T"
c66ac9db
NB
3633 " Nexus is not reservation holder\n");
3634 spin_unlock(&dev->dev_reservation_lock);
03e98c9e
NB
3635 cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT;
3636 ret = -EINVAL;
c66ac9db
NB
3637 goto out;
3638 }
3639 /*
3640 * From spc4r17 section 5.7.8: registering and moving reservation
3641 *
3642 * If a PERSISTENT RESERVE OUT command with a REGISTER AND MOVE service
3643 * action is received and the established persistent reservation is a
3644 * Write Exclusive - All Registrants type or Exclusive Access -
3645 * All Registrants type reservation, then the command shall be completed
3646 * with RESERVATION CONFLICT status.
3647 */
3648 if ((pr_res_holder->pr_res_type == PR_TYPE_WRITE_EXCLUSIVE_ALLREG) ||
3649 (pr_res_holder->pr_res_type == PR_TYPE_EXCLUSIVE_ACCESS_ALLREG)) {
6708bb27 3650 pr_warn("SPC-3 PR REGISTER_AND_MOVE: Unable to move"
c66ac9db
NB
3651 " reservation for type: %s\n",
3652 core_scsi3_pr_dump_type(pr_res_holder->pr_res_type));
3653 spin_unlock(&dev->dev_reservation_lock);
03e98c9e
NB
3654 cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT;
3655 ret = -EINVAL;
c66ac9db
NB
3656 goto out;
3657 }
3658 pr_res_nacl = pr_res_holder->pr_reg_nacl;
3659 /*
3660 * b) Ignore the contents of the (received) SCOPE and TYPE fields;
3661 */
3662 type = pr_res_holder->pr_res_type;
3663 scope = pr_res_holder->pr_res_type;
3664 /*
3665 * c) Associate the reservation key specified in the SERVICE ACTION
3666 * RESERVATION KEY field with the I_T nexus specified as the
3667 * destination of the register and move, where:
3668 * A) The I_T nexus is specified by the TransportID and the
3669 * RELATIVE TARGET PORT IDENTIFIER field (see 6.14.4); and
3670 * B) Regardless of the TransportID format used, the association for
3671 * the initiator port is based on either the initiator port name
3672 * (see 3.1.71) on SCSI transport protocols where port names are
3673 * required or the initiator port identifier (see 3.1.70) on SCSI
3674 * transport protocols where port names are not required;
3675 * d) Register the reservation key specified in the SERVICE ACTION
3676 * RESERVATION KEY field;
3677 * e) Retain the reservation key specified in the SERVICE ACTION
3678 * RESERVATION KEY field and associated information;
3679 *
3680 * Also, It is not an error for a REGISTER AND MOVE service action to
3681 * register an I_T nexus that is already registered with the same
3682 * reservation key or a different reservation key.
3683 */
3684 dest_pr_reg = __core_scsi3_locate_pr_reg(dev, dest_node_acl,
3685 iport_ptr);
6708bb27 3686 if (!dest_pr_reg) {
5951146d 3687 ret = core_scsi3_alloc_registration(cmd->se_dev,
c66ac9db
NB
3688 dest_node_acl, dest_se_deve, iport_ptr,
3689 sa_res_key, 0, aptpl, 2, 1);
3690 if (ret != 0) {
3691 spin_unlock(&dev->dev_reservation_lock);
03e98c9e
NB
3692 cmd->scsi_sense_reason = TCM_INVALID_PARAMETER_LIST;
3693 ret = -EINVAL;
c66ac9db
NB
3694 goto out;
3695 }
3696 dest_pr_reg = __core_scsi3_locate_pr_reg(dev, dest_node_acl,
3697 iport_ptr);
3698 new_reg = 1;
3699 }
3700 /*
3701 * f) Release the persistent reservation for the persistent reservation
3702 * holder (i.e., the I_T nexus on which the
3703 */
3704 __core_scsi3_complete_pro_release(dev, pr_res_nacl,
3705 dev->dev_pr_res_holder, 0);
3706 /*
3707 * g) Move the persistent reservation to the specified I_T nexus using
3708 * the same scope and type as the persistent reservation released in
3709 * item f); and
3710 */
3711 dev->dev_pr_res_holder = dest_pr_reg;
3712 dest_pr_reg->pr_res_holder = 1;
3713 dest_pr_reg->pr_res_type = type;
3714 pr_reg->pr_res_scope = scope;
3715 prf_isid = core_pr_dump_initiator_port(pr_reg, &i_buf[0],
3716 PR_REG_ISID_ID_LEN);
3717 /*
3718 * Increment PRGeneration for existing registrations..
3719 */
6708bb27 3720 if (!new_reg)
c66ac9db
NB
3721 dest_pr_reg->pr_res_generation = pr_tmpl->pr_generation++;
3722 spin_unlock(&dev->dev_reservation_lock);
3723
6708bb27 3724 pr_debug("SPC-3 PR [%s] Service Action: REGISTER_AND_MOVE"
c66ac9db
NB
3725 " created new reservation holder TYPE: %s on object RTPI:"
3726 " %hu PRGeneration: 0x%08x\n", dest_tf_ops->get_fabric_name(),
3727 core_scsi3_pr_dump_type(type), rtpi,
3728 dest_pr_reg->pr_res_generation);
6708bb27 3729 pr_debug("SPC-3 PR Successfully moved reservation from"
c66ac9db
NB
3730 " %s Fabric Node: %s%s -> %s Fabric Node: %s %s\n",
3731 tf_ops->get_fabric_name(), pr_reg_nacl->initiatorname,
3732 (prf_isid) ? &i_buf[0] : "", dest_tf_ops->get_fabric_name(),
3733 dest_node_acl->initiatorname, (iport_ptr != NULL) ?
3734 iport_ptr : "");
3735 /*
3736 * It is now safe to release configfs group dependencies for destination
3737 * of Transport ID Initiator Device/Port Identifier
3738 */
3739 core_scsi3_lunacl_undepend_item(dest_se_deve);
3740 core_scsi3_nodeacl_undepend_item(dest_node_acl);
3741 core_scsi3_tpg_undepend_item(dest_se_tpg);
3742 /*
3743 * h) If the UNREG bit is set to one, unregister (see 5.7.11.3) the I_T
3744 * nexus on which PERSISTENT RESERVE OUT command was received.
3745 */
3746 if (unreg) {
3747 spin_lock(&pr_tmpl->registration_lock);
3748 __core_scsi3_free_registration(dev, pr_reg, NULL, 1);
3749 spin_unlock(&pr_tmpl->registration_lock);
3750 } else
3751 core_scsi3_put_pr_reg(pr_reg);
3752
3753 /*
3754 * Clear the APTPL metadata if APTPL has been disabled, otherwise
3755 * write out the updated metadata to struct file for this SCSI device.
3756 */
6708bb27 3757 if (!aptpl) {
c66ac9db 3758 pr_tmpl->pr_aptpl_active = 0;
5951146d 3759 core_scsi3_update_and_write_aptpl(cmd->se_dev, NULL, 0);
6708bb27 3760 pr_debug("SPC-3 PR: Set APTPL Bit Deactivated for"
c66ac9db
NB
3761 " REGISTER_AND_MOVE\n");
3762 } else {
3763 pr_tmpl->pr_aptpl_active = 1;
5951146d 3764 ret = core_scsi3_update_and_write_aptpl(cmd->se_dev,
c66ac9db
NB
3765 &dest_pr_reg->pr_aptpl_buf[0],
3766 pr_tmpl->pr_aptpl_buf_len);
6708bb27
AG
3767 if (!ret)
3768 pr_debug("SPC-3 PR: Set APTPL Bit Activated for"
c66ac9db
NB
3769 " REGISTER_AND_MOVE\n");
3770 }
3771
4949314c 3772 transport_kunmap_data_sg(cmd);
05d1c7c0 3773
c66ac9db
NB
3774 core_scsi3_put_pr_reg(dest_pr_reg);
3775 return 0;
3776out:
05d1c7c0 3777 if (buf)
4949314c 3778 transport_kunmap_data_sg(cmd);
c66ac9db
NB
3779 if (dest_se_deve)
3780 core_scsi3_lunacl_undepend_item(dest_se_deve);
3781 if (dest_node_acl)
3782 core_scsi3_nodeacl_undepend_item(dest_node_acl);
3783 core_scsi3_tpg_undepend_item(dest_se_tpg);
3784 core_scsi3_put_pr_reg(pr_reg);
3785 return ret;
3786}
3787
3788static unsigned long long core_scsi3_extract_reservation_key(unsigned char *cdb)
3789{
3790 unsigned int __v1, __v2;
3791
3792 __v1 = (cdb[0] << 24) | (cdb[1] << 16) | (cdb[2] << 8) | cdb[3];
3793 __v2 = (cdb[4] << 24) | (cdb[5] << 16) | (cdb[6] << 8) | cdb[7];
3794
3795 return ((unsigned long long)__v2) | (unsigned long long)__v1 << 32;
3796}
3797
3798/*
3799 * See spc4r17 section 6.14 Table 170
3800 */
e76a35d6 3801int target_scsi3_emulate_pr_out(struct se_task *task)
c66ac9db 3802{
e76a35d6 3803 struct se_cmd *cmd = task->task_se_cmd;
617c0e06 3804 unsigned char *cdb = &cmd->t_task_cdb[0];
05d1c7c0 3805 unsigned char *buf;
c66ac9db
NB
3806 u64 res_key, sa_res_key;
3807 int sa, scope, type, aptpl;
3808 int spec_i_pt = 0, all_tg_pt = 0, unreg = 0;
d29a5b6a 3809 int ret;
617c0e06
CH
3810
3811 /*
3812 * Following spc2r20 5.5.1 Reservations overview:
3813 *
3814 * If a logical unit has been reserved by any RESERVE command and is
3815 * still reserved by any initiator, all PERSISTENT RESERVE IN and all
3816 * PERSISTENT RESERVE OUT commands shall conflict regardless of
3817 * initiator or service action and shall terminate with a RESERVATION
3818 * CONFLICT status.
3819 */
3820 if (cmd->se_dev->dev_flags & DF_SPC2_RESERVATIONS) {
3821 pr_err("Received PERSISTENT_RESERVE CDB while legacy"
3822 " SPC-2 reservation is held, returning"
3823 " RESERVATION_CONFLICT\n");
03e98c9e
NB
3824 cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT;
3825 ret = EINVAL;
d29a5b6a 3826 goto out;
617c0e06
CH
3827 }
3828
c66ac9db
NB
3829 /*
3830 * FIXME: A NULL struct se_session pointer means an this is not coming from
3831 * a $FABRIC_MOD's nexus, but from internal passthrough ops.
3832 */
03e98c9e
NB
3833 if (!cmd->se_sess) {
3834 cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
3835 return -EINVAL;
3836 }
c66ac9db
NB
3837
3838 if (cmd->data_length < 24) {
6708bb27 3839 pr_warn("SPC-PR: Received PR OUT parameter list"
c66ac9db 3840 " length too small: %u\n", cmd->data_length);
03e98c9e
NB
3841 cmd->scsi_sense_reason = TCM_INVALID_PARAMETER_LIST;
3842 ret = -EINVAL;
d29a5b6a 3843 goto out;
c66ac9db
NB
3844 }
3845 /*
3846 * From the PERSISTENT_RESERVE_OUT command descriptor block (CDB)
3847 */
3848 sa = (cdb[1] & 0x1f);
3849 scope = (cdb[2] & 0xf0);
3850 type = (cdb[2] & 0x0f);
05d1c7c0 3851
4949314c 3852 buf = transport_kmap_data_sg(cmd);
c66ac9db
NB
3853 /*
3854 * From PERSISTENT_RESERVE_OUT parameter list (payload)
3855 */
3856 res_key = core_scsi3_extract_reservation_key(&buf[0]);
3857 sa_res_key = core_scsi3_extract_reservation_key(&buf[8]);
3858 /*
3859 * REGISTER_AND_MOVE uses a different SA parameter list containing
3860 * SCSI TransportIDs.
3861 */
3862 if (sa != PRO_REGISTER_AND_MOVE) {
3863 spec_i_pt = (buf[20] & 0x08);
3864 all_tg_pt = (buf[20] & 0x04);
3865 aptpl = (buf[20] & 0x01);
3866 } else {
3867 aptpl = (buf[17] & 0x01);
3868 unreg = (buf[17] & 0x02);
3869 }
4949314c 3870 transport_kunmap_data_sg(cmd);
05d1c7c0
AG
3871 buf = NULL;
3872
c66ac9db
NB
3873 /*
3874 * SPEC_I_PT=1 is only valid for Service action: REGISTER
3875 */
d29a5b6a 3876 if (spec_i_pt && ((cdb[1] & 0x1f) != PRO_REGISTER)) {
03e98c9e
NB
3877 cmd->scsi_sense_reason = TCM_INVALID_PARAMETER_LIST;
3878 ret = -EINVAL;
d29a5b6a
CH
3879 goto out;
3880 }
3881
c66ac9db
NB
3882 /*
3883 * From spc4r17 section 6.14:
3884 *
3885 * If the SPEC_I_PT bit is set to zero, the service action is not
3886 * REGISTER AND MOVE, and the parameter list length is not 24, then
3887 * the command shall be terminated with CHECK CONDITION status, with
3888 * the sense key set to ILLEGAL REQUEST, and the additional sense
3889 * code set to PARAMETER LIST LENGTH ERROR.
3890 */
6708bb27 3891 if (!spec_i_pt && ((cdb[1] & 0x1f) != PRO_REGISTER_AND_MOVE) &&
c66ac9db 3892 (cmd->data_length != 24)) {
6708bb27 3893 pr_warn("SPC-PR: Received PR OUT illegal parameter"
c66ac9db 3894 " list length: %u\n", cmd->data_length);
03e98c9e
NB
3895 cmd->scsi_sense_reason = TCM_INVALID_PARAMETER_LIST;
3896 ret = -EINVAL;
d29a5b6a 3897 goto out;
c66ac9db
NB
3898 }
3899 /*
3900 * (core_scsi3_emulate_pro_* function parameters
3901 * are defined by spc4r17 Table 174:
3902 * PERSISTENT_RESERVE_OUT service actions and valid parameters.
3903 */
3904 switch (sa) {
3905 case PRO_REGISTER:
d29a5b6a 3906 ret = core_scsi3_emulate_pro_register(cmd,
c66ac9db 3907 res_key, sa_res_key, aptpl, all_tg_pt, spec_i_pt, 0);
d29a5b6a 3908 break;
c66ac9db 3909 case PRO_RESERVE:
d29a5b6a
CH
3910 ret = core_scsi3_emulate_pro_reserve(cmd, type, scope, res_key);
3911 break;
c66ac9db 3912 case PRO_RELEASE:
d29a5b6a
CH
3913 ret = core_scsi3_emulate_pro_release(cmd, type, scope, res_key);
3914 break;
c66ac9db 3915 case PRO_CLEAR:
d29a5b6a
CH
3916 ret = core_scsi3_emulate_pro_clear(cmd, res_key);
3917 break;
c66ac9db 3918 case PRO_PREEMPT:
d29a5b6a 3919 ret = core_scsi3_emulate_pro_preempt(cmd, type, scope,
c66ac9db 3920 res_key, sa_res_key, 0);
d29a5b6a 3921 break;
c66ac9db 3922 case PRO_PREEMPT_AND_ABORT:
d29a5b6a 3923 ret = core_scsi3_emulate_pro_preempt(cmd, type, scope,
c66ac9db 3924 res_key, sa_res_key, 1);
d29a5b6a 3925 break;
c66ac9db 3926 case PRO_REGISTER_AND_IGNORE_EXISTING_KEY:
d29a5b6a 3927 ret = core_scsi3_emulate_pro_register(cmd,
c66ac9db 3928 0, sa_res_key, aptpl, all_tg_pt, spec_i_pt, 1);
d29a5b6a 3929 break;
c66ac9db 3930 case PRO_REGISTER_AND_MOVE:
d29a5b6a 3931 ret = core_scsi3_emulate_pro_register_and_move(cmd, res_key,
c66ac9db 3932 sa_res_key, aptpl, unreg);
d29a5b6a 3933 break;
c66ac9db 3934 default:
6708bb27 3935 pr_err("Unknown PERSISTENT_RESERVE_OUT service"
c66ac9db 3936 " action: 0x%02x\n", cdb[1] & 0x1f);
03e98c9e
NB
3937 cmd->scsi_sense_reason = TCM_INVALID_CDB_FIELD;
3938 ret = -EINVAL;
d29a5b6a 3939 break;
c66ac9db
NB
3940 }
3941
d29a5b6a
CH
3942out:
3943 if (!ret) {
3944 task->task_scsi_status = GOOD;
3945 transport_complete_task(task, 1);
3946 }
3947 return ret;
c66ac9db
NB
3948}
3949
3950/*
3951 * PERSISTENT_RESERVE_IN Service Action READ_KEYS
3952 *
3953 * See spc4r17 section 5.7.6.2 and section 6.13.2, Table 160
3954 */
3955static int core_scsi3_pri_read_keys(struct se_cmd *cmd)
3956{
5951146d 3957 struct se_device *se_dev = cmd->se_dev;
e3d6f909 3958 struct se_subsystem_dev *su_dev = se_dev->se_sub_dev;
c66ac9db 3959 struct t10_pr_registration *pr_reg;
05d1c7c0 3960 unsigned char *buf;
c66ac9db
NB
3961 u32 add_len = 0, off = 8;
3962
3963 if (cmd->data_length < 8) {
6708bb27 3964 pr_err("PRIN SA READ_KEYS SCSI Data Length: %u"
c66ac9db 3965 " too small\n", cmd->data_length);
03e98c9e
NB
3966 cmd->scsi_sense_reason = TCM_INVALID_CDB_FIELD;
3967 return -EINVAL;
c66ac9db
NB
3968 }
3969
4949314c 3970 buf = transport_kmap_data_sg(cmd);
e3d6f909
AG
3971 buf[0] = ((su_dev->t10_pr.pr_generation >> 24) & 0xff);
3972 buf[1] = ((su_dev->t10_pr.pr_generation >> 16) & 0xff);
3973 buf[2] = ((su_dev->t10_pr.pr_generation >> 8) & 0xff);
3974 buf[3] = (su_dev->t10_pr.pr_generation & 0xff);
c66ac9db 3975
e3d6f909
AG
3976 spin_lock(&su_dev->t10_pr.registration_lock);
3977 list_for_each_entry(pr_reg, &su_dev->t10_pr.registration_list,
c66ac9db
NB
3978 pr_reg_list) {
3979 /*
3980 * Check for overflow of 8byte PRI READ_KEYS payload and
3981 * next reservation key list descriptor.
3982 */
3983 if ((add_len + 8) > (cmd->data_length - 8))
3984 break;
3985
3986 buf[off++] = ((pr_reg->pr_res_key >> 56) & 0xff);
3987 buf[off++] = ((pr_reg->pr_res_key >> 48) & 0xff);
3988 buf[off++] = ((pr_reg->pr_res_key >> 40) & 0xff);
3989 buf[off++] = ((pr_reg->pr_res_key >> 32) & 0xff);
3990 buf[off++] = ((pr_reg->pr_res_key >> 24) & 0xff);
3991 buf[off++] = ((pr_reg->pr_res_key >> 16) & 0xff);
3992 buf[off++] = ((pr_reg->pr_res_key >> 8) & 0xff);
3993 buf[off++] = (pr_reg->pr_res_key & 0xff);
3994
3995 add_len += 8;
3996 }
e3d6f909 3997 spin_unlock(&su_dev->t10_pr.registration_lock);
c66ac9db
NB
3998
3999 buf[4] = ((add_len >> 24) & 0xff);
4000 buf[5] = ((add_len >> 16) & 0xff);
4001 buf[6] = ((add_len >> 8) & 0xff);
4002 buf[7] = (add_len & 0xff);
4003
4949314c 4004 transport_kunmap_data_sg(cmd);
05d1c7c0 4005
c66ac9db
NB
4006 return 0;
4007}
4008
4009/*
4010 * PERSISTENT_RESERVE_IN Service Action READ_RESERVATION
4011 *
4012 * See spc4r17 section 5.7.6.3 and section 6.13.3.2 Table 161 and 162
4013 */
4014static int core_scsi3_pri_read_reservation(struct se_cmd *cmd)
4015{
5951146d 4016 struct se_device *se_dev = cmd->se_dev;
e3d6f909 4017 struct se_subsystem_dev *su_dev = se_dev->se_sub_dev;
c66ac9db 4018 struct t10_pr_registration *pr_reg;
05d1c7c0 4019 unsigned char *buf;
c66ac9db
NB
4020 u64 pr_res_key;
4021 u32 add_len = 16; /* Hardcoded to 16 when a reservation is held. */
4022
4023 if (cmd->data_length < 8) {
6708bb27 4024 pr_err("PRIN SA READ_RESERVATIONS SCSI Data Length: %u"
c66ac9db 4025 " too small\n", cmd->data_length);
03e98c9e
NB
4026 cmd->scsi_sense_reason = TCM_INVALID_CDB_FIELD;
4027 return -EINVAL;
c66ac9db
NB
4028 }
4029
4949314c 4030 buf = transport_kmap_data_sg(cmd);
e3d6f909
AG
4031 buf[0] = ((su_dev->t10_pr.pr_generation >> 24) & 0xff);
4032 buf[1] = ((su_dev->t10_pr.pr_generation >> 16) & 0xff);
4033 buf[2] = ((su_dev->t10_pr.pr_generation >> 8) & 0xff);
4034 buf[3] = (su_dev->t10_pr.pr_generation & 0xff);
c66ac9db
NB
4035
4036 spin_lock(&se_dev->dev_reservation_lock);
4037 pr_reg = se_dev->dev_pr_res_holder;
4038 if ((pr_reg)) {
4039 /*
4040 * Set the hardcoded Additional Length
4041 */
4042 buf[4] = ((add_len >> 24) & 0xff);
4043 buf[5] = ((add_len >> 16) & 0xff);
4044 buf[6] = ((add_len >> 8) & 0xff);
4045 buf[7] = (add_len & 0xff);
4046
05d1c7c0
AG
4047 if (cmd->data_length < 22)
4048 goto err;
4049
c66ac9db
NB
4050 /*
4051 * Set the Reservation key.
4052 *
4053 * From spc4r17, section 5.7.10:
4054 * A persistent reservation holder has its reservation key
4055 * returned in the parameter data from a PERSISTENT
4056 * RESERVE IN command with READ RESERVATION service action as
4057 * follows:
4058 * a) For a persistent reservation of the type Write Exclusive
4059 * - All Registrants or Exclusive Access ­ All Regitrants,
4060 * the reservation key shall be set to zero; or
4061 * b) For all other persistent reservation types, the
4062 * reservation key shall be set to the registered
4063 * reservation key for the I_T nexus that holds the
4064 * persistent reservation.
4065 */
4066 if ((pr_reg->pr_res_type == PR_TYPE_WRITE_EXCLUSIVE_ALLREG) ||
4067 (pr_reg->pr_res_type == PR_TYPE_EXCLUSIVE_ACCESS_ALLREG))
4068 pr_res_key = 0;
4069 else
4070 pr_res_key = pr_reg->pr_res_key;
4071
4072 buf[8] = ((pr_res_key >> 56) & 0xff);
4073 buf[9] = ((pr_res_key >> 48) & 0xff);
4074 buf[10] = ((pr_res_key >> 40) & 0xff);
4075 buf[11] = ((pr_res_key >> 32) & 0xff);
4076 buf[12] = ((pr_res_key >> 24) & 0xff);
4077 buf[13] = ((pr_res_key >> 16) & 0xff);
4078 buf[14] = ((pr_res_key >> 8) & 0xff);
4079 buf[15] = (pr_res_key & 0xff);
4080 /*
4081 * Set the SCOPE and TYPE
4082 */
4083 buf[21] = (pr_reg->pr_res_scope & 0xf0) |
4084 (pr_reg->pr_res_type & 0x0f);
4085 }
05d1c7c0
AG
4086
4087err:
c66ac9db 4088 spin_unlock(&se_dev->dev_reservation_lock);
4949314c 4089 transport_kunmap_data_sg(cmd);
c66ac9db
NB
4090
4091 return 0;
4092}
4093
4094/*
4095 * PERSISTENT_RESERVE_IN Service Action REPORT_CAPABILITIES
4096 *
4097 * See spc4r17 section 6.13.4 Table 165
4098 */
4099static int core_scsi3_pri_report_capabilities(struct se_cmd *cmd)
4100{
5951146d 4101 struct se_device *dev = cmd->se_dev;
e3d6f909 4102 struct t10_reservation *pr_tmpl = &dev->se_sub_dev->t10_pr;
05d1c7c0 4103 unsigned char *buf;
c66ac9db
NB
4104 u16 add_len = 8; /* Hardcoded to 8. */
4105
4106 if (cmd->data_length < 6) {
6708bb27 4107 pr_err("PRIN SA REPORT_CAPABILITIES SCSI Data Length:"
c66ac9db 4108 " %u too small\n", cmd->data_length);
03e98c9e
NB
4109 cmd->scsi_sense_reason = TCM_INVALID_CDB_FIELD;
4110 return -EINVAL;
c66ac9db
NB
4111 }
4112
4949314c 4113 buf = transport_kmap_data_sg(cmd);
05d1c7c0 4114
c66ac9db
NB
4115 buf[0] = ((add_len << 8) & 0xff);
4116 buf[1] = (add_len & 0xff);
4117 buf[2] |= 0x10; /* CRH: Compatible Reservation Hanlding bit. */
4118 buf[2] |= 0x08; /* SIP_C: Specify Initiator Ports Capable bit */
4119 buf[2] |= 0x04; /* ATP_C: All Target Ports Capable bit */
4120 buf[2] |= 0x01; /* PTPL_C: Persistence across Target Power Loss bit */
4121 /*
4122 * We are filling in the PERSISTENT RESERVATION TYPE MASK below, so
4123 * set the TMV: Task Mask Valid bit.
4124 */
4125 buf[3] |= 0x80;
4126 /*
4127 * Change ALLOW COMMANDs to 0x20 or 0x40 later from Table 166
4128 */
4129 buf[3] |= 0x10; /* ALLOW COMMANDs field 001b */
4130 /*
4131 * PTPL_A: Persistence across Target Power Loss Active bit
4132 */
4133 if (pr_tmpl->pr_aptpl_active)
4134 buf[3] |= 0x01;
4135 /*
4136 * Setup the PERSISTENT RESERVATION TYPE MASK from Table 167
4137 */
4138 buf[4] |= 0x80; /* PR_TYPE_EXCLUSIVE_ACCESS_ALLREG */
4139 buf[4] |= 0x40; /* PR_TYPE_EXCLUSIVE_ACCESS_REGONLY */
4140 buf[4] |= 0x20; /* PR_TYPE_WRITE_EXCLUSIVE_REGONLY */
4141 buf[4] |= 0x08; /* PR_TYPE_EXCLUSIVE_ACCESS */
4142 buf[4] |= 0x02; /* PR_TYPE_WRITE_EXCLUSIVE */
4143 buf[5] |= 0x01; /* PR_TYPE_EXCLUSIVE_ACCESS_ALLREG */
4144
4949314c 4145 transport_kunmap_data_sg(cmd);
05d1c7c0 4146
c66ac9db
NB
4147 return 0;
4148}
4149
4150/*
4151 * PERSISTENT_RESERVE_IN Service Action READ_FULL_STATUS
4152 *
4153 * See spc4r17 section 6.13.5 Table 168 and 169
4154 */
4155static int core_scsi3_pri_read_full_status(struct se_cmd *cmd)
4156{
5951146d 4157 struct se_device *se_dev = cmd->se_dev;
c66ac9db 4158 struct se_node_acl *se_nacl;
e3d6f909 4159 struct se_subsystem_dev *su_dev = se_dev->se_sub_dev;
c66ac9db
NB
4160 struct se_portal_group *se_tpg;
4161 struct t10_pr_registration *pr_reg, *pr_reg_tmp;
e3d6f909 4162 struct t10_reservation *pr_tmpl = &se_dev->se_sub_dev->t10_pr;
05d1c7c0 4163 unsigned char *buf;
c66ac9db
NB
4164 u32 add_desc_len = 0, add_len = 0, desc_len, exp_desc_len;
4165 u32 off = 8; /* off into first Full Status descriptor */
4166 int format_code = 0;
4167
4168 if (cmd->data_length < 8) {
6708bb27 4169 pr_err("PRIN SA READ_FULL_STATUS SCSI Data Length: %u"
c66ac9db 4170 " too small\n", cmd->data_length);
03e98c9e
NB
4171 cmd->scsi_sense_reason = TCM_INVALID_CDB_FIELD;
4172 return -EINVAL;
c66ac9db
NB
4173 }
4174
4949314c 4175 buf = transport_kmap_data_sg(cmd);
05d1c7c0 4176
e3d6f909
AG
4177 buf[0] = ((su_dev->t10_pr.pr_generation >> 24) & 0xff);
4178 buf[1] = ((su_dev->t10_pr.pr_generation >> 16) & 0xff);
4179 buf[2] = ((su_dev->t10_pr.pr_generation >> 8) & 0xff);
4180 buf[3] = (su_dev->t10_pr.pr_generation & 0xff);
c66ac9db
NB
4181
4182 spin_lock(&pr_tmpl->registration_lock);
4183 list_for_each_entry_safe(pr_reg, pr_reg_tmp,
4184 &pr_tmpl->registration_list, pr_reg_list) {
4185
4186 se_nacl = pr_reg->pr_reg_nacl;
4187 se_tpg = pr_reg->pr_reg_nacl->se_tpg;
4188 add_desc_len = 0;
4189
4190 atomic_inc(&pr_reg->pr_res_holders);
4191 smp_mb__after_atomic_inc();
4192 spin_unlock(&pr_tmpl->registration_lock);
4193 /*
4194 * Determine expected length of $FABRIC_MOD specific
4195 * TransportID full status descriptor..
4196 */
e3d6f909 4197 exp_desc_len = se_tpg->se_tpg_tfo->tpg_get_pr_transport_id_len(
c66ac9db
NB
4198 se_tpg, se_nacl, pr_reg, &format_code);
4199
4200 if ((exp_desc_len + add_len) > cmd->data_length) {
6708bb27 4201 pr_warn("SPC-3 PRIN READ_FULL_STATUS ran"
c66ac9db
NB
4202 " out of buffer: %d\n", cmd->data_length);
4203 spin_lock(&pr_tmpl->registration_lock);
4204 atomic_dec(&pr_reg->pr_res_holders);
4205 smp_mb__after_atomic_dec();
4206 break;
4207 }
4208 /*
4209 * Set RESERVATION KEY
4210 */
4211 buf[off++] = ((pr_reg->pr_res_key >> 56) & 0xff);
4212 buf[off++] = ((pr_reg->pr_res_key >> 48) & 0xff);
4213 buf[off++] = ((pr_reg->pr_res_key >> 40) & 0xff);
4214 buf[off++] = ((pr_reg->pr_res_key >> 32) & 0xff);
4215 buf[off++] = ((pr_reg->pr_res_key >> 24) & 0xff);
4216 buf[off++] = ((pr_reg->pr_res_key >> 16) & 0xff);
4217 buf[off++] = ((pr_reg->pr_res_key >> 8) & 0xff);
4218 buf[off++] = (pr_reg->pr_res_key & 0xff);
4219 off += 4; /* Skip Over Reserved area */
4220
4221 /*
4222 * Set ALL_TG_PT bit if PROUT SA REGISTER had this set.
4223 */
4224 if (pr_reg->pr_reg_all_tg_pt)
4225 buf[off] = 0x02;
4226 /*
4227 * The struct se_lun pointer will be present for the
4228 * reservation holder for PR_HOLDER bit.
4229 *
4230 * Also, if this registration is the reservation
4231 * holder, fill in SCOPE and TYPE in the next byte.
4232 */
4233 if (pr_reg->pr_res_holder) {
4234 buf[off++] |= 0x01;
4235 buf[off++] = (pr_reg->pr_res_scope & 0xf0) |
4236 (pr_reg->pr_res_type & 0x0f);
4237 } else
4238 off += 2;
4239
4240 off += 4; /* Skip over reserved area */
4241 /*
4242 * From spc4r17 6.3.15:
4243 *
4244 * If the ALL_TG_PT bit set to zero, the RELATIVE TARGET PORT
4245 * IDENTIFIER field contains the relative port identifier (see
4246 * 3.1.120) of the target port that is part of the I_T nexus
4247 * described by this full status descriptor. If the ALL_TG_PT
4248 * bit is set to one, the contents of the RELATIVE TARGET PORT
4249 * IDENTIFIER field are not defined by this standard.
4250 */
6708bb27 4251 if (!pr_reg->pr_reg_all_tg_pt) {
c66ac9db
NB
4252 struct se_port *port = pr_reg->pr_reg_tg_pt_lun->lun_sep;
4253
4254 buf[off++] = ((port->sep_rtpi >> 8) & 0xff);
4255 buf[off++] = (port->sep_rtpi & 0xff);
4256 } else
4257 off += 2; /* Skip over RELATIVE TARGET PORT IDENTIFER */
4258
4259 /*
4260 * Now, have the $FABRIC_MOD fill in the protocol identifier
4261 */
e3d6f909 4262 desc_len = se_tpg->se_tpg_tfo->tpg_get_pr_transport_id(se_tpg,
c66ac9db
NB
4263 se_nacl, pr_reg, &format_code, &buf[off+4]);
4264
4265 spin_lock(&pr_tmpl->registration_lock);
4266 atomic_dec(&pr_reg->pr_res_holders);
4267 smp_mb__after_atomic_dec();
4268 /*
4269 * Set the ADDITIONAL DESCRIPTOR LENGTH
4270 */
4271 buf[off++] = ((desc_len >> 24) & 0xff);
4272 buf[off++] = ((desc_len >> 16) & 0xff);
4273 buf[off++] = ((desc_len >> 8) & 0xff);
4274 buf[off++] = (desc_len & 0xff);
4275 /*
4276 * Size of full desctipor header minus TransportID
4277 * containing $FABRIC_MOD specific) initiator device/port
4278 * WWN information.
4279 *
4280 * See spc4r17 Section 6.13.5 Table 169
4281 */
4282 add_desc_len = (24 + desc_len);
4283
4284 off += desc_len;
4285 add_len += add_desc_len;
4286 }
4287 spin_unlock(&pr_tmpl->registration_lock);
4288 /*
4289 * Set ADDITIONAL_LENGTH
4290 */
4291 buf[4] = ((add_len >> 24) & 0xff);
4292 buf[5] = ((add_len >> 16) & 0xff);
4293 buf[6] = ((add_len >> 8) & 0xff);
4294 buf[7] = (add_len & 0xff);
4295
4949314c 4296 transport_kunmap_data_sg(cmd);
05d1c7c0 4297
c66ac9db
NB
4298 return 0;
4299}
4300
e76a35d6 4301int target_scsi3_emulate_pr_in(struct se_task *task)
c66ac9db 4302{
e76a35d6 4303 struct se_cmd *cmd = task->task_se_cmd;
d29a5b6a 4304 int ret;
e76a35d6 4305
c66ac9db
NB
4306 /*
4307 * Following spc2r20 5.5.1 Reservations overview:
4308 *
4309 * If a logical unit has been reserved by any RESERVE command and is
4310 * still reserved by any initiator, all PERSISTENT RESERVE IN and all
4311 * PERSISTENT RESERVE OUT commands shall conflict regardless of
4312 * initiator or service action and shall terminate with a RESERVATION
4313 * CONFLICT status.
4314 */
617c0e06 4315 if (cmd->se_dev->dev_flags & DF_SPC2_RESERVATIONS) {
6708bb27 4316 pr_err("Received PERSISTENT_RESERVE CDB while legacy"
c66ac9db
NB
4317 " SPC-2 reservation is held, returning"
4318 " RESERVATION_CONFLICT\n");
03e98c9e
NB
4319 cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT;
4320 return -EINVAL;
c66ac9db
NB
4321 }
4322
617c0e06
CH
4323 switch (cmd->t_task_cdb[1] & 0x1f) {
4324 case PRI_READ_KEYS:
d29a5b6a
CH
4325 ret = core_scsi3_pri_read_keys(cmd);
4326 break;
617c0e06 4327 case PRI_READ_RESERVATION:
d29a5b6a
CH
4328 ret = core_scsi3_pri_read_reservation(cmd);
4329 break;
617c0e06 4330 case PRI_REPORT_CAPABILITIES:
d29a5b6a
CH
4331 ret = core_scsi3_pri_report_capabilities(cmd);
4332 break;
617c0e06 4333 case PRI_READ_FULL_STATUS:
d29a5b6a
CH
4334 ret = core_scsi3_pri_read_full_status(cmd);
4335 break;
617c0e06
CH
4336 default:
4337 pr_err("Unknown PERSISTENT_RESERVE_IN service"
4338 " action: 0x%02x\n", cmd->t_task_cdb[1] & 0x1f);
03e98c9e
NB
4339 cmd->scsi_sense_reason = TCM_INVALID_CDB_FIELD;
4340 ret = -EINVAL;
d29a5b6a
CH
4341 break;
4342 }
4343
4344 if (!ret) {
4345 task->task_scsi_status = GOOD;
4346 transport_complete_task(task, 1);
617c0e06 4347 }
d29a5b6a 4348 return ret;
c66ac9db
NB
4349}
4350
4351static int core_pt_reservation_check(struct se_cmd *cmd, u32 *pr_res_type)
4352{
4353 return 0;
4354}
4355
4356static int core_pt_seq_non_holder(
4357 struct se_cmd *cmd,
4358 unsigned char *cdb,
4359 u32 pr_reg_type)
4360{
4361 return 0;
4362}
4363
4364int core_setup_reservations(struct se_device *dev, int force_pt)
4365{
4366 struct se_subsystem_dev *su_dev = dev->se_sub_dev;
e3d6f909 4367 struct t10_reservation *rest = &su_dev->t10_pr;
c66ac9db
NB
4368 /*
4369 * If this device is from Target_Core_Mod/pSCSI, use the reservations
4370 * of the Underlying SCSI hardware. In Linux/SCSI terms, this can
4371 * cause a problem because libata and some SATA RAID HBAs appear
4372 * under Linux/SCSI, but to emulate reservations themselves.
4373 */
e3d6f909
AG
4374 if (((dev->transport->transport_type == TRANSPORT_PLUGIN_PHBA_PDEV) &&
4375 !(dev->se_sub_dev->se_dev_attrib.emulate_reservations)) || force_pt) {
c66ac9db
NB
4376 rest->res_type = SPC_PASSTHROUGH;
4377 rest->pr_ops.t10_reservation_check = &core_pt_reservation_check;
4378 rest->pr_ops.t10_seq_non_holder = &core_pt_seq_non_holder;
6708bb27 4379 pr_debug("%s: Using SPC_PASSTHROUGH, no reservation"
e3d6f909 4380 " emulation\n", dev->transport->name);
c66ac9db
NB
4381 return 0;
4382 }
4383 /*
4384 * If SPC-3 or above is reported by real or emulated struct se_device,
4385 * use emulated Persistent Reservations.
4386 */
e3d6f909 4387 if (dev->transport->get_device_rev(dev) >= SCSI_3) {
c66ac9db
NB
4388 rest->res_type = SPC3_PERSISTENT_RESERVATIONS;
4389 rest->pr_ops.t10_reservation_check = &core_scsi3_pr_reservation_check;
4390 rest->pr_ops.t10_seq_non_holder = &core_scsi3_pr_seq_non_holder;
6708bb27 4391 pr_debug("%s: Using SPC3_PERSISTENT_RESERVATIONS"
e3d6f909 4392 " emulation\n", dev->transport->name);
c66ac9db
NB
4393 } else {
4394 rest->res_type = SPC2_RESERVATIONS;
4395 rest->pr_ops.t10_reservation_check = &core_scsi2_reservation_check;
4396 rest->pr_ops.t10_seq_non_holder =
4397 &core_scsi2_reservation_seq_non_holder;
6708bb27 4398 pr_debug("%s: Using SPC2_RESERVATIONS emulation\n",
e3d6f909 4399 dev->transport->name);
c66ac9db
NB
4400 }
4401
4402 return 0;
4403}
This page took 0.27759 seconds and 5 git commands to generate.