target_core_pr.c 123.8 KB
Newer Older
1 2 3 4 5 6
/*******************************************************************************
 * Filename:  target_core_pr.c
 *
 * This file contains SPC-3 compliant persistent reservations and
 * legacy SPC-2 reservations with compatible reservation handling (CRH=1)
 *
7
 * (c) Copyright 2009-2013 Datera, Inc.
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
 *
 * Nicholas A. Bellinger <nab@kernel.org>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 *
 ******************************************************************************/

#include <linux/slab.h>
#include <linux/spinlock.h>
#include <linux/list.h>
30
#include <linux/file.h>
31 32 33 34 35
#include <scsi/scsi.h>
#include <scsi/scsi_cmnd.h>
#include <asm/unaligned.h>

#include <target/target_core_base.h>
36 37
#include <target/target_core_backend.h>
#include <target/target_core_fabric.h>
38

C
Christoph Hellwig 已提交
39
#include "target_core_internal.h"
40 41 42 43 44 45 46 47 48 49
#include "target_core_pr.h"
#include "target_core_ua.h"

/*
 * Used for Specify Initiator Ports Capable Bit (SPEC_I_PT)
 */
struct pr_transport_id_holder {
	struct t10_pr_registration *dest_pr_reg;
	struct se_portal_group *dest_tpg;
	struct se_node_acl *dest_node_acl;
50
	struct se_dev_entry *dest_se_deve;
51 52 53
	struct list_head dest_list;
};

54
void core_pr_dump_initiator_port(
55 56 57 58
	struct t10_pr_registration *pr_reg,
	char *buf,
	u32 size)
{
59
	if (!pr_reg->isid_present_at_reg)
60
		buf[0] = '\0';
61

62
	snprintf(buf, size, ",i,0x%s", pr_reg->pr_reg_isid);
63 64
}

65 66 67 68 69 70 71 72 73 74 75
enum register_type {
	REGISTER,
	REGISTER_AND_IGNORE_EXISTING_KEY,
	REGISTER_AND_MOVE,
};

enum preempt_type {
	PREEMPT,
	PREEMPT_AND_ABORT,
};

76
static void __core_scsi3_complete_pro_release(struct se_device *, struct se_node_acl *,
77
					      struct t10_pr_registration *, int, int);
78

79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
static int is_reservation_holder(
	struct t10_pr_registration *pr_res_holder,
	struct t10_pr_registration *pr_reg)
{
	int pr_res_type;

	if (pr_res_holder) {
		pr_res_type = pr_res_holder->pr_res_type;

		return pr_res_holder == pr_reg ||
		       pr_res_type == PR_TYPE_WRITE_EXCLUSIVE_ALLREG ||
		       pr_res_type == PR_TYPE_EXCLUSIVE_ACCESS_ALLREG;
	}
	return 0;
}

95 96
static sense_reason_t
target_scsi2_reservation_check(struct se_cmd *cmd)
97
{
98 99 100 101
	struct se_device *dev = cmd->se_dev;
	struct se_session *sess = cmd->se_sess;

	switch (cmd->t_task_cdb[0]) {
102 103 104 105 106
	case INQUIRY:
	case RELEASE:
	case RELEASE_10:
		return 0;
	default:
107
		break;
108 109
	}

110
	if (!dev->dev_reserved_node_acl || !sess)
111 112
		return 0;

113
	if (dev->dev_reserved_node_acl != sess->se_node_acl)
114
		return TCM_RESERVATION_CONFLICT;
115 116 117

	if (dev->dev_reservation_flags & DRF_SPC2_RESERVATIONS_WITH_ISID) {
		if (dev->dev_res_bin_isid != sess->sess_bin_isid)
118
			return TCM_RESERVATION_CONFLICT;
119 120
	}

121
	return 0;
122 123
}

124 125 126 127
static struct t10_pr_registration *core_scsi3_locate_pr_reg(struct se_device *,
					struct se_node_acl *, struct se_session *);
static void core_scsi3_put_pr_reg(struct t10_pr_registration *);

128
static int target_check_scsi2_reservation_conflict(struct se_cmd *cmd)
129 130
{
	struct se_session *se_sess = cmd->se_sess;
131
	struct se_device *dev = cmd->se_dev;
132
	struct t10_pr_registration *pr_reg;
133
	struct t10_reservation *pr_tmpl = &dev->t10_pr;
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
	int conflict = 0;

	pr_reg = core_scsi3_locate_pr_reg(cmd->se_dev, se_sess->se_node_acl,
			se_sess);
	if (pr_reg) {
		/*
		 * From spc4r17 5.7.3 Exceptions to SPC-2 RESERVE and RELEASE
		 * behavior
		 *
		 * A RESERVE(6) or RESERVE(10) command shall complete with GOOD
		 * status, but no reservation shall be established and the
		 * persistent reservation shall not be changed, if the command
		 * is received from a) and b) below.
		 *
		 * A RELEASE(6) or RELEASE(10) command shall complete with GOOD
		 * status, but the persistent reservation shall not be released,
		 * if the command is received from a) and b)
		 *
		 * a) An I_T nexus that is a persistent reservation holder; or
		 * b) An I_T nexus that is registered if a registrants only or
		 *    all registrants type persistent reservation is present.
		 *
		 * In all other cases, a RESERVE(6) command, RESERVE(10) command,
		 * RELEASE(6) command, or RELEASE(10) command shall be processed
		 * as defined in SPC-2.
		 */
		if (pr_reg->pr_res_holder) {
			core_scsi3_put_pr_reg(pr_reg);
162
			return 1;
163 164 165 166 167 168
		}
		if ((pr_reg->pr_res_type == PR_TYPE_WRITE_EXCLUSIVE_REGONLY) ||
		    (pr_reg->pr_res_type == PR_TYPE_EXCLUSIVE_ACCESS_REGONLY) ||
		    (pr_reg->pr_res_type == PR_TYPE_WRITE_EXCLUSIVE_ALLREG) ||
		    (pr_reg->pr_res_type == PR_TYPE_EXCLUSIVE_ACCESS_ALLREG)) {
			core_scsi3_put_pr_reg(pr_reg);
169
			return 1;
170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
		}
		core_scsi3_put_pr_reg(pr_reg);
		conflict = 1;
	} else {
		/*
		 * Following spc2r20 5.5.1 Reservations overview:
		 *
		 * If a logical unit has executed a PERSISTENT RESERVE OUT
		 * command with the REGISTER or the REGISTER AND IGNORE
		 * EXISTING KEY service action and is still registered by any
		 * initiator, all RESERVE commands and all RELEASE commands
		 * regardless of initiator shall conflict and shall terminate
		 * with a RESERVATION CONFLICT status.
		 */
		spin_lock(&pr_tmpl->registration_lock);
		conflict = (list_empty(&pr_tmpl->registration_list)) ? 0 : 1;
		spin_unlock(&pr_tmpl->registration_lock);
	}

	if (conflict) {
		pr_err("Received legacy SPC-2 RESERVE/RELEASE"
			" while active SPC-3 registrations exist,"
			" returning RESERVATION_CONFLICT\n");
193
		return -EBUSY;
194 195
	}

196
	return 0;
197 198
}

199 200
sense_reason_t
target_scsi2_reservation_release(struct se_cmd *cmd)
201 202 203
{
	struct se_device *dev = cmd->se_dev;
	struct se_session *sess = cmd->se_sess;
204
	struct se_portal_group *tpg;
205
	int rc;
206

207
	if (!sess || !sess->se_tpg)
208
		goto out;
209 210
	rc = target_check_scsi2_reservation_conflict(cmd);
	if (rc == 1)
211
		goto out;
212 213
	if (rc < 0)
		return TCM_RESERVATION_CONFLICT;
214 215

	spin_lock(&dev->dev_reservation_lock);
216 217 218 219 220
	if (!dev->dev_reserved_node_acl || !sess)
		goto out_unlock;

	if (dev->dev_reserved_node_acl != sess->se_node_acl)
		goto out_unlock;
221

222 223 224
	if (dev->dev_res_bin_isid != sess->sess_bin_isid)
		goto out_unlock;

225
	dev->dev_reserved_node_acl = NULL;
226 227
	dev->dev_reservation_flags &= ~DRF_SPC2_RESERVATIONS;
	if (dev->dev_reservation_flags & DRF_SPC2_RESERVATIONS_WITH_ISID) {
228
		dev->dev_res_bin_isid = 0;
229
		dev->dev_reservation_flags &= ~DRF_SPC2_RESERVATIONS_WITH_ISID;
230
	}
231
	tpg = sess->se_tpg;
232
	pr_debug("SCSI-2 Released reservation for %s LUN: %u ->"
233
		" MAPPED LUN: %u for %s\n", tpg->se_tpg_tfo->get_fabric_name(),
234
		cmd->se_lun->unpacked_lun, cmd->orig_fe_lun,
235 236
		sess->se_node_acl->initiatorname);

237 238 239
out_unlock:
	spin_unlock(&dev->dev_reservation_lock);
out:
240 241
	target_complete_cmd(cmd, GOOD);
	return 0;
242 243
}

244 245
sense_reason_t
target_scsi2_reservation_reserve(struct se_cmd *cmd)
246 247 248
{
	struct se_device *dev = cmd->se_dev;
	struct se_session *sess = cmd->se_sess;
249
	struct se_portal_group *tpg;
250 251
	sense_reason_t ret = 0;
	int rc;
252

253 254
	if ((cmd->t_task_cdb[1] & 0x01) &&
	    (cmd->t_task_cdb[1] & 0x02)) {
255
		pr_err("LongIO and Obselete Bits set, returning"
256
				" ILLEGAL_REQUEST\n");
257
		return TCM_UNSUPPORTED_SCSI_OPCODE;
258 259 260 261 262
	}
	/*
	 * This is currently the case for target_core_mod passthrough struct se_cmd
	 * ops
	 */
263
	if (!sess || !sess->se_tpg)
264
		goto out;
265 266
	rc = target_check_scsi2_reservation_conflict(cmd);
	if (rc == 1)
267
		goto out;
268

269 270 271
	if (rc < 0)
		return TCM_RESERVATION_CONFLICT;

272
	tpg = sess->se_tpg;
273 274 275
	spin_lock(&dev->dev_reservation_lock);
	if (dev->dev_reserved_node_acl &&
	   (dev->dev_reserved_node_acl != sess->se_node_acl)) {
276
		pr_err("SCSI-2 RESERVATION CONFLIFT for %s fabric\n",
277
			tpg->se_tpg_tfo->get_fabric_name());
278
		pr_err("Original reserver LUN: %u %s\n",
279
			cmd->se_lun->unpacked_lun,
280
			dev->dev_reserved_node_acl->initiatorname);
281
		pr_err("Current attempt - LUN: %u -> MAPPED LUN: %u"
282
			" from %s \n", cmd->se_lun->unpacked_lun,
283
			cmd->orig_fe_lun,
284
			sess->se_node_acl->initiatorname);
285
		ret = TCM_RESERVATION_CONFLICT;
286
		goto out_unlock;
287 288 289
	}

	dev->dev_reserved_node_acl = sess->se_node_acl;
290
	dev->dev_reservation_flags |= DRF_SPC2_RESERVATIONS;
291 292
	if (sess->sess_bin_isid != 0) {
		dev->dev_res_bin_isid = sess->sess_bin_isid;
293
		dev->dev_reservation_flags |= DRF_SPC2_RESERVATIONS_WITH_ISID;
294
	}
295
	pr_debug("SCSI-2 Reserved %s LUN: %u -> MAPPED LUN: %u"
296
		" for %s\n", tpg->se_tpg_tfo->get_fabric_name(),
297
		cmd->se_lun->unpacked_lun, cmd->orig_fe_lun,
298 299
		sess->se_node_acl->initiatorname);

300 301 302
out_unlock:
	spin_unlock(&dev->dev_reservation_lock);
out:
303 304
	if (!ret)
		target_complete_cmd(cmd, GOOD);
305
	return ret;
306 307 308 309 310 311 312 313 314
}


/*
 * Begin SPC-3/SPC-4 Persistent Reservations emulation support
 *
 * This function is called by those initiator ports who are *NOT*
 * the active PR reservation holder when a reservation is present.
 */
315 316
static int core_scsi3_pr_seq_non_holder(struct se_cmd *cmd, u32 pr_reg_type,
					bool isid_mismatch)
317
{
318
	unsigned char *cdb = cmd->t_task_cdb;
319
	struct se_session *se_sess = cmd->se_sess;
320
	struct se_node_acl *nacl = se_sess->se_node_acl;
321
	int other_cdb = 0;
322 323 324 325 326 327
	int registered_nexus = 0, ret = 1; /* Conflict by default */
	int all_reg = 0, reg_only = 0; /* ALL_REG, REG_ONLY */
	int we = 0; /* Write Exclusive */
	int legacy = 0; /* Act like a legacy device and return
			 * RESERVATION CONFLICT on some CDBs */

328 329 330 331 332 333 334 335 336 337 338 339
	if (isid_mismatch) {
		registered_nexus = 0;
	} else {
		struct se_dev_entry *se_deve;

		rcu_read_lock();
		se_deve = target_nacl_find_deve(nacl, cmd->orig_fe_lun);
		if (se_deve)
			registered_nexus = test_bit(DEF_PR_REG_ACTIVE,
						    &se_deve->deve_flags);
		rcu_read_unlock();
	}
340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366

	switch (pr_reg_type) {
	case PR_TYPE_WRITE_EXCLUSIVE:
		we = 1;
	case PR_TYPE_EXCLUSIVE_ACCESS:
		/*
		 * Some commands are only allowed for the persistent reservation
		 * holder.
		 */
		break;
	case PR_TYPE_WRITE_EXCLUSIVE_REGONLY:
		we = 1;
	case PR_TYPE_EXCLUSIVE_ACCESS_REGONLY:
		/*
		 * Some commands are only allowed for registered I_T Nexuses.
		 */
		reg_only = 1;
		break;
	case PR_TYPE_WRITE_EXCLUSIVE_ALLREG:
		we = 1;
	case PR_TYPE_EXCLUSIVE_ACCESS_ALLREG:
		/*
		 * Each registered I_T Nexus is a reservation holder.
		 */
		all_reg = 1;
		break;
	default:
367
		return -EINVAL;
368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416
	}
	/*
	 * Referenced from spc4r17 table 45 for *NON* PR holder access
	 */
	switch (cdb[0]) {
	case SECURITY_PROTOCOL_IN:
		if (registered_nexus)
			return 0;
		ret = (we) ? 0 : 1;
		break;
	case MODE_SENSE:
	case MODE_SENSE_10:
	case READ_ATTRIBUTE:
	case READ_BUFFER:
	case RECEIVE_DIAGNOSTIC:
		if (legacy) {
			ret = 1;
			break;
		}
		if (registered_nexus) {
			ret = 0;
			break;
		}
		ret = (we) ? 0 : 1; /* Allowed Write Exclusive */
		break;
	case PERSISTENT_RESERVE_OUT:
		/*
		 * This follows PERSISTENT_RESERVE_OUT service actions that
		 * are allowed in the presence of various reservations.
		 * See spc4r17, table 46
		 */
		switch (cdb[1] & 0x1f) {
		case PRO_CLEAR:
		case PRO_PREEMPT:
		case PRO_PREEMPT_AND_ABORT:
			ret = (registered_nexus) ? 0 : 1;
			break;
		case PRO_REGISTER:
		case PRO_REGISTER_AND_IGNORE_EXISTING_KEY:
			ret = 0;
			break;
		case PRO_REGISTER_AND_MOVE:
		case PRO_RESERVE:
			ret = 1;
			break;
		case PRO_RELEASE:
			ret = (registered_nexus) ? 0 : 1;
			break;
		default:
417
			pr_err("Unknown PERSISTENT_RESERVE_OUT service"
418
				" action: 0x%02x\n", cdb[1] & 0x1f);
419
			return -EINVAL;
420 421 422 423
		}
		break;
	case RELEASE:
	case RELEASE_10:
424
		/* Handled by CRH=1 in target_scsi2_reservation_release() */
425 426 427 428
		ret = 0;
		break;
	case RESERVE:
	case RESERVE_10:
429
		/* Handled by CRH=1 in target_scsi2_reservation_reserve() */
430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463
		ret = 0;
		break;
	case TEST_UNIT_READY:
		ret = (legacy) ? 1 : 0; /* Conflict for legacy */
		break;
	case MAINTENANCE_IN:
		switch (cdb[1] & 0x1f) {
		case MI_MANAGEMENT_PROTOCOL_IN:
			if (registered_nexus) {
				ret = 0;
				break;
			}
			ret = (we) ? 0 : 1; /* Allowed Write Exclusive */
			break;
		case MI_REPORT_SUPPORTED_OPERATION_CODES:
		case MI_REPORT_SUPPORTED_TASK_MANAGEMENT_FUNCTIONS:
			if (legacy) {
				ret = 1;
				break;
			}
			if (registered_nexus) {
				ret = 0;
				break;
			}
			ret = (we) ? 0 : 1; /* Allowed Write Exclusive */
			break;
		case MI_REPORT_ALIASES:
		case MI_REPORT_IDENTIFYING_INFORMATION:
		case MI_REPORT_PRIORITY:
		case MI_REPORT_TARGET_PGS:
		case MI_REPORT_TIMESTAMP:
			ret = 0; /* Allowed */
			break;
		default:
464
			pr_err("Unknown MI Service Action: 0x%02x\n",
465
				(cdb[1] & 0x1f));
466
			return -EINVAL;
467 468 469 470 471 472
		}
		break;
	case ACCESS_CONTROL_IN:
	case ACCESS_CONTROL_OUT:
	case INQUIRY:
	case LOG_SENSE:
473
	case SERVICE_ACTION_IN_12:
474 475
	case REPORT_LUNS:
	case REQUEST_SENSE:
476
	case PERSISTENT_RESERVE_IN:
477 478 479 480 481 482 483
		ret = 0; /*/ Allowed CDBs */
		break;
	default:
		other_cdb = 1;
		break;
	}
	/*
L
Lucas De Marchi 已提交
484
	 * Case where the CDB is explicitly allowed in the above switch
485 486
	 * statement.
	 */
487
	if (!ret && !other_cdb) {
488
		pr_debug("Allowing explicit CDB: 0x%02x for %s"
489 490
			" reservation holder\n", cdb[0],
			core_scsi3_pr_dump_type(pr_reg_type));
491

492 493 494 495 496 497
		return ret;
	}
	/*
	 * Check if write exclusive initiator ports *NOT* holding the
	 * WRITE_EXCLUSIVE_* reservation.
	 */
498
	if (we && !registered_nexus) {
499 500 501 502
		if (cmd->data_direction == DMA_TO_DEVICE) {
			/*
			 * Conflict for write exclusive
			 */
503
			pr_debug("%s Conflict for unregistered nexus"
504 505 506 507 508 509 510 511 512 513 514 515 516 517 518
				" %s CDB: 0x%02x to %s reservation\n",
				transport_dump_cmd_direction(cmd),
				se_sess->se_node_acl->initiatorname, cdb[0],
				core_scsi3_pr_dump_type(pr_reg_type));
			return 1;
		} else {
			/*
			 * Allow non WRITE CDBs for all Write Exclusive
			 * PR TYPEs to pass for registered and
			 * non-registered_nexuxes NOT holding the reservation.
			 *
			 * We only make noise for the unregisterd nexuses,
			 * as we expect registered non-reservation holding
			 * nexuses to issue CDBs.
			 */
519

520
			if (!registered_nexus) {
521
				pr_debug("Allowing implicit CDB: 0x%02x"
522 523 524 525
					" for %s reservation on unregistered"
					" nexus\n", cdb[0],
					core_scsi3_pr_dump_type(pr_reg_type));
			}
526

527 528 529 530 531 532 533 534
			return 0;
		}
	} else if ((reg_only) || (all_reg)) {
		if (registered_nexus) {
			/*
			 * For PR_*_REG_ONLY and PR_*_ALL_REG reservations,
			 * allow commands from registered nexuses.
			 */
535

536
			pr_debug("Allowing implicit CDB: 0x%02x for %s"
537 538
				" reservation\n", cdb[0],
				core_scsi3_pr_dump_type(pr_reg_type));
539

540 541
			return 0;
		}
542 543 544 545 546 547 548 549 550 551 552 553
       } else if (we && registered_nexus) {
               /*
                * Reads are allowed for Write Exclusive locks
                * from all registrants.
                */
               if (cmd->data_direction == DMA_FROM_DEVICE) {
                       pr_debug("Allowing READ CDB: 0x%02x for %s"
                               " reservation\n", cdb[0],
                               core_scsi3_pr_dump_type(pr_reg_type));

                       return 0;
               }
554
	}
555
	pr_debug("%s Conflict for %sregistered nexus %s CDB: 0x%2x"
556 557 558 559 560 561 562 563
		" for %s reservation\n", transport_dump_cmd_direction(cmd),
		(registered_nexus) ? "" : "un",
		se_sess->se_node_acl->initiatorname, cdb[0],
		core_scsi3_pr_dump_type(pr_reg_type));

	return 1; /* Conflict by default */
}

564 565
static sense_reason_t
target_scsi3_pr_reservation_check(struct se_cmd *cmd)
566 567 568 569
{
	struct se_device *dev = cmd->se_dev;
	struct se_session *sess = cmd->se_sess;
	u32 pr_reg_type;
570
	bool isid_mismatch = false;
571 572 573 574 575 576 577 578 579 580 581 582

	if (!dev->dev_pr_res_holder)
		return 0;

	pr_reg_type = dev->dev_pr_res_holder->pr_res_type;
	cmd->pr_res_key = dev->dev_pr_res_holder->pr_res_key;
	if (dev->dev_pr_res_holder->pr_reg_nacl != sess->se_node_acl)
		goto check_nonholder;

	if (dev->dev_pr_res_holder->isid_present_at_reg) {
		if (dev->dev_pr_res_holder->pr_reg_bin_isid !=
		    sess->sess_bin_isid) {
583
			isid_mismatch = true;
584 585 586 587 588 589 590
			goto check_nonholder;
		}
	}

	return 0;

check_nonholder:
591
	if (core_scsi3_pr_seq_non_holder(cmd, pr_reg_type, isid_mismatch))
592
		return TCM_RESERVATION_CONFLICT;
593 594 595
	return 0;
}

596 597 598
static u32 core_scsi3_pr_generation(struct se_device *dev)
{
	u32 prg;
599

600 601 602 603 604 605 606 607 608 609
	/*
	 * PRGeneration field shall contain the value of a 32-bit wrapping
	 * counter mainted by the device server.
	 *
	 * Note that this is done regardless of Active Persist across
	 * Target PowerLoss (APTPL)
	 *
	 * See spc4r17 section 6.3.12 READ_KEYS service action
	 */
	spin_lock(&dev->dev_reservation_lock);
610
	prg = dev->t10_pr.pr_generation++;
611 612 613 614 615 616 617 618
	spin_unlock(&dev->dev_reservation_lock);

	return prg;
}

static struct t10_pr_registration *__core_scsi3_do_alloc_registration(
	struct se_device *dev,
	struct se_node_acl *nacl,
619
	struct se_lun *lun,
620
	struct se_dev_entry *deve,
621
	u32 mapped_lun,
622 623 624 625 626 627 628 629
	unsigned char *isid,
	u64 sa_res_key,
	int all_tg_pt,
	int aptpl)
{
	struct t10_pr_registration *pr_reg;

	pr_reg = kmem_cache_zalloc(t10_pr_reg_cache, GFP_ATOMIC);
630 631
	if (!pr_reg) {
		pr_err("Unable to allocate struct t10_pr_registration\n");
632 633 634 635 636 637 638 639 640 641 642
		return NULL;
	}

	INIT_LIST_HEAD(&pr_reg->pr_reg_list);
	INIT_LIST_HEAD(&pr_reg->pr_reg_abort_list);
	INIT_LIST_HEAD(&pr_reg->pr_reg_aptpl_list);
	INIT_LIST_HEAD(&pr_reg->pr_reg_atp_list);
	INIT_LIST_HEAD(&pr_reg->pr_reg_atp_mem_list);
	atomic_set(&pr_reg->pr_res_holders, 0);
	pr_reg->pr_reg_nacl = nacl;
	pr_reg->pr_reg_deve = deve;
643 644
	pr_reg->pr_res_mapped_lun = mapped_lun;
	pr_reg->pr_aptpl_target_lun = lun->unpacked_lun;
645
	pr_reg->tg_pt_sep_rtpi = lun->lun_rtpi;
646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671
	pr_reg->pr_res_key = sa_res_key;
	pr_reg->pr_reg_all_tg_pt = all_tg_pt;
	pr_reg->pr_reg_aptpl = aptpl;
	/*
	 * If an ISID value for this SCSI Initiator Port exists,
	 * save it to the registration now.
	 */
	if (isid != NULL) {
		pr_reg->pr_reg_bin_isid = get_unaligned_be64(isid);
		snprintf(pr_reg->pr_reg_isid, PR_REG_ISID_LEN, "%s", isid);
		pr_reg->isid_present_at_reg = 1;
	}

	return pr_reg;
}

static int core_scsi3_lunacl_depend_item(struct se_dev_entry *);
static void core_scsi3_lunacl_undepend_item(struct se_dev_entry *);

/*
 * Function used for handling PR registrations for ALL_TG_PT=1 and ALL_TG_PT=0
 * modes.
 */
static struct t10_pr_registration *__core_scsi3_alloc_registration(
	struct se_device *dev,
	struct se_node_acl *nacl,
672
	struct se_lun *lun,
673
	struct se_dev_entry *deve,
674
	u32 mapped_lun,
675 676 677 678 679 680 681
	unsigned char *isid,
	u64 sa_res_key,
	int all_tg_pt,
	int aptpl)
{
	struct se_dev_entry *deve_tmp;
	struct se_node_acl *nacl_tmp;
682
	struct se_lun_acl *lacl_tmp;
683
	struct se_lun *lun_tmp, *next, *dest_lun;
684
	const struct target_core_fabric_ops *tfo = nacl->se_tpg->se_tpg_tfo;
685 686 687 688 689 690
	struct t10_pr_registration *pr_reg, *pr_reg_atp, *pr_reg_tmp, *pr_reg_tmp_safe;
	int ret;
	/*
	 * Create a registration for the I_T Nexus upon which the
	 * PROUT REGISTER was received.
	 */
691 692 693
	pr_reg = __core_scsi3_do_alloc_registration(dev, nacl, lun, deve, mapped_lun,
						    isid, sa_res_key, all_tg_pt,
						    aptpl);
694
	if (!pr_reg)
695 696 697 698
		return NULL;
	/*
	 * Return pointer to pr_reg for ALL_TG_PT=0
	 */
699
	if (!all_tg_pt)
700 701 702 703 704 705
		return pr_reg;
	/*
	 * Create list of matching SCSI Initiator Port registrations
	 * for ALL_TG_PT=1
	 */
	spin_lock(&dev->se_port_lock);
706 707
	list_for_each_entry_safe(lun_tmp, next, &dev->dev_sep_list, lun_dev_link) {
		atomic_inc_mb(&lun_tmp->lun_active);
708 709
		spin_unlock(&dev->se_port_lock);

710 711
		spin_lock_bh(&lun_tmp->lun_deve_lock);
		list_for_each_entry(deve_tmp, &lun_tmp->lun_deve_list, lun_link) {
712 713
			/*
			 * This pointer will be NULL for demo mode MappedLUNs
714
			 * that have not been make explicit via a ConfigFS
715 716
			 * MappedLUN group for the SCSI Initiator Node ACL.
			 */
717
			if (!deve_tmp->se_lun_acl)
718 719
				continue;

720
			lacl_tmp = rcu_dereference_check(deve_tmp->se_lun_acl,
721
						lockdep_is_held(&lun_tmp->lun_deve_lock));
722
			nacl_tmp = lacl_tmp->se_lun_nacl;
723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741
			/*
			 * Skip the matching struct se_node_acl that is allocated
			 * above..
			 */
			if (nacl == nacl_tmp)
				continue;
			/*
			 * Only perform PR registrations for target ports on
			 * the same fabric module as the REGISTER w/ ALL_TG_PT=1
			 * arrived.
			 */
			if (tfo != nacl_tmp->se_tpg->se_tpg_tfo)
				continue;
			/*
			 * Look for a matching Initiator Node ACL in ASCII format
			 */
			if (strcmp(nacl->initiatorname, nacl_tmp->initiatorname))
				continue;

742
			kref_get(&deve_tmp->pr_kref);
743
			spin_unlock_bh(&lun_tmp->lun_deve_lock);
744 745 746 747 748 749 750 751
			/*
			 * Grab a configfs group dependency that is released
			 * for the exception path at label out: below, or upon
			 * completion of adding ALL_TG_PT=1 registrations in
			 * __core_scsi3_add_registration()
			 */
			ret = core_scsi3_lunacl_depend_item(deve_tmp);
			if (ret < 0) {
752
				pr_err("core_scsi3_lunacl_depend"
753
						"_item() failed\n");
754
				atomic_dec_mb(&lun->lun_active);
755
				kref_put(&deve_tmp->pr_kref, target_pr_kref_release);
756 757 758 759 760 761 762 763 764
				goto out;
			}
			/*
			 * Located a matching SCSI Initiator Port on a different
			 * port, allocate the pr_reg_atp and attach it to the
			 * pr_reg->pr_reg_atp_list that will be processed once
			 * the original *pr_reg is processed in
			 * __core_scsi3_add_registration()
			 */
765
			dest_lun = rcu_dereference_check(deve_tmp->se_lun,
766 767
				atomic_read(&deve_tmp->pr_kref.refcount) != 0);

768
			pr_reg_atp = __core_scsi3_do_alloc_registration(dev,
769
						nacl_tmp, dest_lun, deve_tmp,
770
						deve_tmp->mapped_lun, NULL,
771
						sa_res_key, all_tg_pt, aptpl);
772
			if (!pr_reg_atp) {
773
				atomic_dec_mb(&lun_tmp->lun_active);
774 775 776 777 778 779
				core_scsi3_lunacl_undepend_item(deve_tmp);
				goto out;
			}

			list_add_tail(&pr_reg_atp->pr_reg_atp_mem_list,
				      &pr_reg->pr_reg_atp_list);
780
			spin_lock_bh(&lun_tmp->lun_deve_lock);
781
		}
782
		spin_unlock_bh(&lun_tmp->lun_deve_lock);
783 784

		spin_lock(&dev->se_port_lock);
785
		atomic_dec_mb(&lun_tmp->lun_active);
786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801
	}
	spin_unlock(&dev->se_port_lock);

	return pr_reg;
out:
	list_for_each_entry_safe(pr_reg_tmp, pr_reg_tmp_safe,
			&pr_reg->pr_reg_atp_list, pr_reg_atp_mem_list) {
		list_del(&pr_reg_tmp->pr_reg_atp_mem_list);
		core_scsi3_lunacl_undepend_item(pr_reg_tmp->pr_reg_deve);
		kmem_cache_free(t10_pr_reg_cache, pr_reg_tmp);
	}
	kmem_cache_free(t10_pr_reg_cache, pr_reg);
	return NULL;
}

int core_scsi3_alloc_aptpl_registration(
802
	struct t10_reservation *pr_tmpl,
803 804 805 806 807 808 809 810 811 812 813 814 815
	u64 sa_res_key,
	unsigned char *i_port,
	unsigned char *isid,
	u32 mapped_lun,
	unsigned char *t_port,
	u16 tpgt,
	u32 target_lun,
	int res_holder,
	int all_tg_pt,
	u8 type)
{
	struct t10_pr_registration *pr_reg;

816 817
	if (!i_port || !t_port || !sa_res_key) {
		pr_err("Illegal parameters for APTPL registration\n");
818
		return -EINVAL;
819 820 821
	}

	pr_reg = kmem_cache_zalloc(t10_pr_reg_cache, GFP_KERNEL);
822 823
	if (!pr_reg) {
		pr_err("Unable to allocate struct t10_pr_registration\n");
824
		return -ENOMEM;
825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865
	}

	INIT_LIST_HEAD(&pr_reg->pr_reg_list);
	INIT_LIST_HEAD(&pr_reg->pr_reg_abort_list);
	INIT_LIST_HEAD(&pr_reg->pr_reg_aptpl_list);
	INIT_LIST_HEAD(&pr_reg->pr_reg_atp_list);
	INIT_LIST_HEAD(&pr_reg->pr_reg_atp_mem_list);
	atomic_set(&pr_reg->pr_res_holders, 0);
	pr_reg->pr_reg_nacl = NULL;
	pr_reg->pr_reg_deve = NULL;
	pr_reg->pr_res_mapped_lun = mapped_lun;
	pr_reg->pr_aptpl_target_lun = target_lun;
	pr_reg->pr_res_key = sa_res_key;
	pr_reg->pr_reg_all_tg_pt = all_tg_pt;
	pr_reg->pr_reg_aptpl = 1;
	pr_reg->pr_res_scope = 0; /* Always LUN_SCOPE */
	pr_reg->pr_res_type = type;
	/*
	 * If an ISID value had been saved in APTPL metadata for this
	 * SCSI Initiator Port, restore it now.
	 */
	if (isid != NULL) {
		pr_reg->pr_reg_bin_isid = get_unaligned_be64(isid);
		snprintf(pr_reg->pr_reg_isid, PR_REG_ISID_LEN, "%s", isid);
		pr_reg->isid_present_at_reg = 1;
	}
	/*
	 * Copy the i_port and t_port information from caller.
	 */
	snprintf(pr_reg->pr_iport, PR_APTPL_MAX_IPORT_LEN, "%s", i_port);
	snprintf(pr_reg->pr_tport, PR_APTPL_MAX_TPORT_LEN, "%s", t_port);
	pr_reg->pr_reg_tpgt = tpgt;
	/*
	 * Set pr_res_holder from caller, the pr_reg who is the reservation
	 * holder will get it's pointer set in core_scsi3_aptpl_reserve() once
	 * the Initiator Node LUN ACL from the fabric module is created for
	 * this registration.
	 */
	pr_reg->pr_res_holder = res_holder;

	list_add_tail(&pr_reg->pr_reg_aptpl_list, &pr_tmpl->aptpl_reg_list);
866
	pr_debug("SPC-3 PR APTPL Successfully added registration%s from"
867 868 869 870 871 872 873 874 875 876 877 878 879
			" metadata\n", (res_holder) ? "+reservation" : "");
	return 0;
}

static void core_scsi3_aptpl_reserve(
	struct se_device *dev,
	struct se_portal_group *tpg,
	struct se_node_acl *node_acl,
	struct t10_pr_registration *pr_reg)
{
	char i_buf[PR_REG_ISID_ID_LEN];

	memset(i_buf, 0, PR_REG_ISID_ID_LEN);
880
	core_pr_dump_initiator_port(pr_reg, i_buf, PR_REG_ISID_ID_LEN);
881 882 883 884 885

	spin_lock(&dev->dev_reservation_lock);
	dev->dev_pr_res_holder = pr_reg;
	spin_unlock(&dev->dev_reservation_lock);

886
	pr_debug("SPC-3 PR [%s] Service Action: APTPL RESERVE created"
887
		" new reservation holder TYPE: %s ALL_TG_PT: %d\n",
888
		tpg->se_tpg_tfo->get_fabric_name(),
889 890
		core_scsi3_pr_dump_type(pr_reg->pr_res_type),
		(pr_reg->pr_reg_all_tg_pt) ? 1 : 0);
891
	pr_debug("SPC-3 PR [%s] RESERVE Node: %s%s\n",
892
		tpg->se_tpg_tfo->get_fabric_name(), node_acl->initiatorname,
893
		i_buf);
894 895 896
}

static void __core_scsi3_add_registration(struct se_device *, struct se_node_acl *,
897
				struct t10_pr_registration *, enum register_type, int);
898 899 900 901 902 903 904

static int __core_scsi3_check_aptpl_registration(
	struct se_device *dev,
	struct se_portal_group *tpg,
	struct se_lun *lun,
	u32 target_lun,
	struct se_node_acl *nacl,
905
	u32 mapped_lun)
906 907
{
	struct t10_pr_registration *pr_reg, *pr_reg_tmp;
908
	struct t10_reservation *pr_tmpl = &dev->t10_pr;
909 910 911 912 913 914 915 916 917 918 919
	unsigned char i_port[PR_APTPL_MAX_IPORT_LEN];
	unsigned char t_port[PR_APTPL_MAX_TPORT_LEN];
	u16 tpgt;

	memset(i_port, 0, PR_APTPL_MAX_IPORT_LEN);
	memset(t_port, 0, PR_APTPL_MAX_TPORT_LEN);
	/*
	 * Copy Initiator Port information from struct se_node_acl
	 */
	snprintf(i_port, PR_APTPL_MAX_IPORT_LEN, "%s", nacl->initiatorname);
	snprintf(t_port, PR_APTPL_MAX_TPORT_LEN, "%s",
920 921
			tpg->se_tpg_tfo->tpg_get_wwn(tpg));
	tpgt = tpg->se_tpg_tfo->tpg_get_tag(tpg);
922 923 924 925 926 927 928 929 930
	/*
	 * Look for the matching registrations+reservation from those
	 * created from APTPL metadata.  Note that multiple registrations
	 * may exist for fabrics that use ISIDs in their SCSI Initiator Port
	 * TransportIDs.
	 */
	spin_lock(&pr_tmpl->aptpl_reg_lock);
	list_for_each_entry_safe(pr_reg, pr_reg_tmp, &pr_tmpl->aptpl_reg_list,
				pr_reg_aptpl_list) {
931

932
		if (!strcmp(pr_reg->pr_iport, i_port) &&
933
		     (pr_reg->pr_res_mapped_lun == mapped_lun) &&
934 935 936 937 938
		    !(strcmp(pr_reg->pr_tport, t_port)) &&
		     (pr_reg->pr_reg_tpgt == tpgt) &&
		     (pr_reg->pr_aptpl_target_lun == target_lun)) {

			pr_reg->pr_reg_nacl = nacl;
939
			pr_reg->tg_pt_sep_rtpi = lun->lun_rtpi;
940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972

			list_del(&pr_reg->pr_reg_aptpl_list);
			spin_unlock(&pr_tmpl->aptpl_reg_lock);
			/*
			 * At this point all of the pointers in *pr_reg will
			 * be setup, so go ahead and add the registration.
			 */

			__core_scsi3_add_registration(dev, nacl, pr_reg, 0, 0);
			/*
			 * If this registration is the reservation holder,
			 * make that happen now..
			 */
			if (pr_reg->pr_res_holder)
				core_scsi3_aptpl_reserve(dev, tpg,
						nacl, pr_reg);
			/*
			 * Reenable pr_aptpl_active to accept new metadata
			 * updates once the SCSI device is active again..
			 */
			spin_lock(&pr_tmpl->aptpl_reg_lock);
			pr_tmpl->pr_aptpl_active = 1;
		}
	}
	spin_unlock(&pr_tmpl->aptpl_reg_lock);

	return 0;
}

int core_scsi3_check_aptpl_registration(
	struct se_device *dev,
	struct se_portal_group *tpg,
	struct se_lun *lun,
973 974
	struct se_node_acl *nacl,
	u32 mapped_lun)
975
{
976
	if (dev->dev_reservation_flags & DRF_SPC2_RESERVATIONS)
977 978 979
		return 0;

	return __core_scsi3_check_aptpl_registration(dev, tpg, lun,
980 981
						     lun->unpacked_lun, nacl,
						     mapped_lun);
982 983 984
}

static void __core_scsi3_dump_registration(
985
	const struct target_core_fabric_ops *tfo,
986 987 988
	struct se_device *dev,
	struct se_node_acl *nacl,
	struct t10_pr_registration *pr_reg,
989
	enum register_type register_type)
990 991 992 993 994
{
	struct se_portal_group *se_tpg = nacl->se_tpg;
	char i_buf[PR_REG_ISID_ID_LEN];

	memset(&i_buf[0], 0, PR_REG_ISID_ID_LEN);
995
	core_pr_dump_initiator_port(pr_reg, i_buf, PR_REG_ISID_ID_LEN);
996

997
	pr_debug("SPC-3 PR [%s] Service Action: REGISTER%s Initiator"
998 999
		" Node: %s%s\n", tfo->get_fabric_name(), (register_type == REGISTER_AND_MOVE) ?
		"_AND_MOVE" : (register_type == REGISTER_AND_IGNORE_EXISTING_KEY) ?
1000
		"_AND_IGNORE_EXISTING_KEY" : "", nacl->initiatorname,
1001
		i_buf);
1002
	pr_debug("SPC-3 PR [%s] registration on Target Port: %s,0x%04x\n",
1003 1004
		 tfo->get_fabric_name(), tfo->tpg_get_wwn(se_tpg),
		tfo->tpg_get_tag(se_tpg));
1005
	pr_debug("SPC-3 PR [%s] for %s TCM Subsystem %s Object Target"
1006 1007
		" Port(s)\n",  tfo->get_fabric_name(),
		(pr_reg->pr_reg_all_tg_pt) ? "ALL" : "SINGLE",
1008
		dev->transport->name);
1009
	pr_debug("SPC-3 PR [%s] SA Res Key: 0x%016Lx PRgeneration:"
1010 1011 1012 1013 1014 1015 1016 1017 1018
		" 0x%08x  APTPL: %d\n", tfo->get_fabric_name(),
		pr_reg->pr_res_key, pr_reg->pr_res_generation,
		pr_reg->pr_reg_aptpl);
}

static void __core_scsi3_add_registration(
	struct se_device *dev,
	struct se_node_acl *nacl,
	struct t10_pr_registration *pr_reg,
1019
	enum register_type register_type,
1020 1021
	int register_move)
{
1022
	const struct target_core_fabric_ops *tfo = nacl->se_tpg->se_tpg_tfo;
1023
	struct t10_pr_registration *pr_reg_tmp, *pr_reg_tmp_safe;
1024
	struct t10_reservation *pr_tmpl = &dev->t10_pr;
1025
	struct se_dev_entry *deve;
1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036

	/*
	 * Increment PRgeneration counter for struct se_device upon a successful
	 * REGISTER, see spc4r17 section 6.3.2 READ_KEYS service action
	 *
	 * Also, when register_move = 1 for PROUT REGISTER_AND_MOVE service
	 * action, the struct se_device->dev_reservation_lock will already be held,
	 * so we do not call core_scsi3_pr_generation() which grabs the lock
	 * for the REGISTER.
	 */
	pr_reg->pr_res_generation = (register_move) ?
1037
			dev->t10_pr.pr_generation++ :
1038 1039 1040 1041 1042 1043 1044
			core_scsi3_pr_generation(dev);

	spin_lock(&pr_tmpl->registration_lock);
	list_add_tail(&pr_reg->pr_reg_list, &pr_tmpl->registration_list);

	__core_scsi3_dump_registration(tfo, dev, nacl, pr_reg, register_type);
	spin_unlock(&pr_tmpl->registration_lock);
1045 1046 1047 1048 1049 1050 1051

	rcu_read_lock();
	deve = pr_reg->pr_reg_deve;
	if (deve)
		set_bit(DEF_PR_REG_ACTIVE, &deve->deve_flags);
	rcu_read_unlock();

1052 1053 1054
	/*
	 * Skip extra processing for ALL_TG_PT=0 or REGISTER_AND_MOVE.
	 */
1055
	if (!pr_reg->pr_reg_all_tg_pt || register_move)
1056 1057 1058 1059 1060 1061 1062
		return;
	/*
	 * Walk pr_reg->pr_reg_atp_list and add registrations for ALL_TG_PT=1
	 * allocated in __core_scsi3_alloc_registration()
	 */
	list_for_each_entry_safe(pr_reg_tmp, pr_reg_tmp_safe,
			&pr_reg->pr_reg_atp_list, pr_reg_atp_mem_list) {
1063 1064
		struct se_node_acl *nacl_tmp = pr_reg_tmp->pr_reg_nacl;

1065 1066 1067 1068 1069 1070 1071 1072
		list_del(&pr_reg_tmp->pr_reg_atp_mem_list);

		pr_reg_tmp->pr_res_generation = core_scsi3_pr_generation(dev);

		spin_lock(&pr_tmpl->registration_lock);
		list_add_tail(&pr_reg_tmp->pr_reg_list,
			      &pr_tmpl->registration_list);

1073 1074
		__core_scsi3_dump_registration(tfo, dev, nacl_tmp, pr_reg_tmp,
					       register_type);
1075
		spin_unlock(&pr_tmpl->registration_lock);
1076 1077 1078 1079 1080 1081 1082

		rcu_read_lock();
		deve = pr_reg_tmp->pr_reg_deve;
		if (deve)
			set_bit(DEF_PR_REG_ACTIVE, &deve->deve_flags);
		rcu_read_unlock();

1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093
		/*
		 * Drop configfs group dependency reference from
		 * __core_scsi3_alloc_registration()
		 */
		core_scsi3_lunacl_undepend_item(pr_reg_tmp->pr_reg_deve);
	}
}

static int core_scsi3_alloc_registration(
	struct se_device *dev,
	struct se_node_acl *nacl,
1094
	struct se_lun *lun,
1095
	struct se_dev_entry *deve,
1096
	u32 mapped_lun,
1097 1098 1099 1100
	unsigned char *isid,
	u64 sa_res_key,
	int all_tg_pt,
	int aptpl,
1101
	enum register_type register_type,
1102 1103 1104 1105
	int register_move)
{
	struct t10_pr_registration *pr_reg;

1106 1107 1108
	pr_reg = __core_scsi3_alloc_registration(dev, nacl, lun, deve, mapped_lun,
						 isid, sa_res_key, all_tg_pt,
						 aptpl);
1109
	if (!pr_reg)
1110
		return -EPERM;
1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121

	__core_scsi3_add_registration(dev, nacl, pr_reg,
			register_type, register_move);
	return 0;
}

static struct t10_pr_registration *__core_scsi3_locate_pr_reg(
	struct se_device *dev,
	struct se_node_acl *nacl,
	unsigned char *isid)
{
1122
	struct t10_reservation *pr_tmpl = &dev->t10_pr;
1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139
	struct t10_pr_registration *pr_reg, *pr_reg_tmp;
	struct se_portal_group *tpg;

	spin_lock(&pr_tmpl->registration_lock);
	list_for_each_entry_safe(pr_reg, pr_reg_tmp,
			&pr_tmpl->registration_list, pr_reg_list) {
		/*
		 * First look for a matching struct se_node_acl
		 */
		if (pr_reg->pr_reg_nacl != nacl)
			continue;

		tpg = pr_reg->pr_reg_nacl->se_tpg;
		/*
		 * If this registration does NOT contain a fabric provided
		 * ISID, then we have found a match.
		 */
1140
		if (!pr_reg->isid_present_at_reg) {
1141 1142 1143 1144 1145
			/*
			 * Determine if this SCSI device server requires that
			 * SCSI Intiatior TransportID w/ ISIDs is enforced
			 * for fabric modules (iSCSI) requiring them.
			 */
1146
			if (tpg->se_tpg_tfo->sess_get_initiator_sid != NULL) {
1147
				if (dev->dev_attrib.enforce_pr_isids)
1148 1149
					continue;
			}
1150
			atomic_inc_mb(&pr_reg->pr_res_holders);
1151 1152 1153 1154 1155 1156 1157 1158
			spin_unlock(&pr_tmpl->registration_lock);
			return pr_reg;
		}
		/*
		 * If the *pr_reg contains a fabric defined ISID for multi-value
		 * SCSI Initiator Port TransportIDs, then we expect a valid
		 * matching ISID to be provided by the local SCSI Initiator Port.
		 */
1159
		if (!isid)
1160 1161 1162 1163
			continue;
		if (strcmp(isid, pr_reg->pr_reg_isid))
			continue;

1164
		atomic_inc_mb(&pr_reg->pr_res_holders);
1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180
		spin_unlock(&pr_tmpl->registration_lock);
		return pr_reg;
	}
	spin_unlock(&pr_tmpl->registration_lock);

	return NULL;
}

static struct t10_pr_registration *core_scsi3_locate_pr_reg(
	struct se_device *dev,
	struct se_node_acl *nacl,
	struct se_session *sess)
{
	struct se_portal_group *tpg = nacl->se_tpg;
	unsigned char buf[PR_REG_ISID_LEN], *isid_ptr = NULL;

1181
	if (tpg->se_tpg_tfo->sess_get_initiator_sid != NULL) {
1182
		memset(&buf[0], 0, PR_REG_ISID_LEN);
1183
		tpg->se_tpg_tfo->sess_get_initiator_sid(sess, &buf[0],
1184 1185 1186 1187 1188 1189 1190 1191 1192
					PR_REG_ISID_LEN);
		isid_ptr = &buf[0];
	}

	return __core_scsi3_locate_pr_reg(dev, nacl, isid_ptr);
}

static void core_scsi3_put_pr_reg(struct t10_pr_registration *pr_reg)
{
1193
	atomic_dec_mb(&pr_reg->pr_res_holders);
1194 1195
}

1196
static int core_scsi3_check_implicit_release(
1197 1198 1199 1200 1201 1202 1203 1204 1205
	struct se_device *dev,
	struct t10_pr_registration *pr_reg)
{
	struct se_node_acl *nacl = pr_reg->pr_reg_nacl;
	struct t10_pr_registration *pr_res_holder;
	int ret = 0;

	spin_lock(&dev->dev_reservation_lock);
	pr_res_holder = dev->dev_pr_res_holder;
1206
	if (!pr_res_holder) {
1207 1208 1209 1210 1211
		spin_unlock(&dev->dev_reservation_lock);
		return ret;
	}
	if (pr_res_holder == pr_reg) {
		/*
1212
		 * Perform an implicit RELEASE if the registration that
1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223
		 * is being released is holding the reservation.
		 *
		 * From spc4r17, section 5.7.11.1:
		 *
		 * e) If the I_T nexus is the persistent reservation holder
		 *    and the persistent reservation is not an all registrants
		 *    type, then a PERSISTENT RESERVE OUT command with REGISTER
		 *    service action or REGISTER AND  IGNORE EXISTING KEY
		 *    service action with the SERVICE ACTION RESERVATION KEY
		 *    field set to zero (see 5.7.11.3).
		 */
1224
		__core_scsi3_complete_pro_release(dev, nacl, pr_reg, 0, 1);
1225 1226 1227 1228 1229
		ret = 1;
		/*
		 * For 'All Registrants' reservation types, all existing
		 * registrations are still processed as reservation holders
		 * in core_scsi3_pr_seq_non_holder() after the initial
1230
		 * reservation holder is implicitly released here.
1231 1232 1233 1234 1235
		 */
	} else if (pr_reg->pr_reg_all_tg_pt &&
		  (!strcmp(pr_res_holder->pr_reg_nacl->initiatorname,
			  pr_reg->pr_reg_nacl->initiatorname)) &&
		  (pr_res_holder->pr_res_key == pr_reg->pr_res_key)) {
1236
		pr_err("SPC-3 PR: Unable to perform ALL_TG_PT=1"
1237 1238 1239
			" UNREGISTER while existing reservation with matching"
			" key 0x%016Lx is present from another SCSI Initiator"
			" Port\n", pr_reg->pr_res_key);
1240
		ret = -EPERM;
1241 1242 1243 1244 1245 1246 1247
	}
	spin_unlock(&dev->dev_reservation_lock);

	return ret;
}

/*
1248
 * Called with struct t10_reservation->registration_lock held.
1249 1250 1251 1252 1253 1254
 */
static void __core_scsi3_free_registration(
	struct se_device *dev,
	struct t10_pr_registration *pr_reg,
	struct list_head *preempt_and_abort_list,
	int dec_holders)
1255 1256
	__releases(&pr_tmpl->registration_lock)
	__acquires(&pr_tmpl->registration_lock)
1257
{
1258
	const struct target_core_fabric_ops *tfo =
1259
			pr_reg->pr_reg_nacl->se_tpg->se_tpg_tfo;
1260
	struct t10_reservation *pr_tmpl = &dev->t10_pr;
1261 1262
	struct se_node_acl *nacl = pr_reg->pr_reg_nacl;
	struct se_dev_entry *deve;
1263 1264 1265
	char i_buf[PR_REG_ISID_ID_LEN];

	memset(i_buf, 0, PR_REG_ISID_ID_LEN);
1266
	core_pr_dump_initiator_port(pr_reg, i_buf, PR_REG_ISID_ID_LEN);
1267

1268 1269
	if (!list_empty(&pr_reg->pr_reg_list))
		list_del(&pr_reg->pr_reg_list);
1270 1271 1272 1273 1274 1275
	/*
	 * Caller accessing *pr_reg using core_scsi3_locate_pr_reg(),
	 * so call core_scsi3_put_pr_reg() to decrement our reference.
	 */
	if (dec_holders)
		core_scsi3_put_pr_reg(pr_reg);
1276 1277

	spin_unlock(&pr_tmpl->registration_lock);
1278 1279 1280 1281 1282 1283 1284
	/*
	 * Wait until all reference from any other I_T nexuses for this
	 * *pr_reg have been released.  Because list_del() is called above,
	 * the last core_scsi3_put_pr_reg(pr_reg) will release this reference
	 * count back to zero, and we release *pr_reg.
	 */
	while (atomic_read(&pr_reg->pr_res_holders) != 0) {
1285
		pr_debug("SPC-3 PR [%s] waiting for pr_res_holders\n",
1286 1287 1288 1289
				tfo->get_fabric_name());
		cpu_relax();
	}

1290 1291 1292 1293 1294 1295 1296
	rcu_read_lock();
	deve = target_nacl_find_deve(nacl, pr_reg->pr_res_mapped_lun);
	if (deve)
		clear_bit(DEF_PR_REG_ACTIVE, &deve->deve_flags);
	rcu_read_unlock();

	spin_lock(&pr_tmpl->registration_lock);
1297
	pr_debug("SPC-3 PR [%s] Service Action: UNREGISTER Initiator"
1298 1299
		" Node: %s%s\n", tfo->get_fabric_name(),
		pr_reg->pr_reg_nacl->initiatorname,
1300
		i_buf);
1301
	pr_debug("SPC-3 PR [%s] for %s TCM Subsystem %s Object Target"
1302 1303
		" Port(s)\n", tfo->get_fabric_name(),
		(pr_reg->pr_reg_all_tg_pt) ? "ALL" : "SINGLE",
1304
		dev->transport->name);
1305
	pr_debug("SPC-3 PR [%s] SA Res Key: 0x%016Lx PRgeneration:"
1306 1307 1308
		" 0x%08x\n", tfo->get_fabric_name(), pr_reg->pr_res_key,
		pr_reg->pr_res_generation);

1309
	if (!preempt_and_abort_list) {
1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325
		pr_reg->pr_reg_deve = NULL;
		pr_reg->pr_reg_nacl = NULL;
		kmem_cache_free(t10_pr_reg_cache, pr_reg);
		return;
	}
	/*
	 * For PREEMPT_AND_ABORT, the list of *pr_reg in preempt_and_abort_list
	 * are released once the ABORT_TASK_SET has completed..
	 */
	list_add_tail(&pr_reg->pr_reg_abort_list, preempt_and_abort_list);
}

void core_scsi3_free_pr_reg_from_nacl(
	struct se_device *dev,
	struct se_node_acl *nacl)
{
1326
	struct t10_reservation *pr_tmpl = &dev->t10_pr;
1327
	struct t10_pr_registration *pr_reg, *pr_reg_tmp, *pr_res_holder;
1328
	bool free_reg = false;
1329 1330 1331 1332 1333 1334 1335
	/*
	 * If the passed se_node_acl matches the reservation holder,
	 * release the reservation.
	 */
	spin_lock(&dev->dev_reservation_lock);
	pr_res_holder = dev->dev_pr_res_holder;
	if ((pr_res_holder != NULL) &&
1336 1337 1338 1339
	    (pr_res_holder->pr_reg_nacl == nacl)) {
		__core_scsi3_complete_pro_release(dev, nacl, pr_res_holder, 0, 1);
		free_reg = true;
	}
1340 1341 1342 1343 1344
	spin_unlock(&dev->dev_reservation_lock);
	/*
	 * Release any registration associated with the struct se_node_acl.
	 */
	spin_lock(&pr_tmpl->registration_lock);
1345 1346 1347
	if (pr_res_holder && free_reg)
		__core_scsi3_free_registration(dev, pr_res_holder, NULL, 0);

1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361
	list_for_each_entry_safe(pr_reg, pr_reg_tmp,
			&pr_tmpl->registration_list, pr_reg_list) {

		if (pr_reg->pr_reg_nacl != nacl)
			continue;

		__core_scsi3_free_registration(dev, pr_reg, NULL, 0);
	}
	spin_unlock(&pr_tmpl->registration_lock);
}

void core_scsi3_free_all_registrations(
	struct se_device *dev)
{
1362
	struct t10_reservation *pr_tmpl = &dev->t10_pr;
1363 1364 1365 1366 1367 1368 1369
	struct t10_pr_registration *pr_reg, *pr_reg_tmp, *pr_res_holder;

	spin_lock(&dev->dev_reservation_lock);
	pr_res_holder = dev->dev_pr_res_holder;
	if (pr_res_holder != NULL) {
		struct se_node_acl *pr_res_nacl = pr_res_holder->pr_reg_nacl;
		__core_scsi3_complete_pro_release(dev, pr_res_nacl,
1370
						  pr_res_holder, 0, 0);
1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392
	}
	spin_unlock(&dev->dev_reservation_lock);

	spin_lock(&pr_tmpl->registration_lock);
	list_for_each_entry_safe(pr_reg, pr_reg_tmp,
			&pr_tmpl->registration_list, pr_reg_list) {

		__core_scsi3_free_registration(dev, pr_reg, NULL, 0);
	}
	spin_unlock(&pr_tmpl->registration_lock);

	spin_lock(&pr_tmpl->aptpl_reg_lock);
	list_for_each_entry_safe(pr_reg, pr_reg_tmp, &pr_tmpl->aptpl_reg_list,
				pr_reg_aptpl_list) {
		list_del(&pr_reg->pr_reg_aptpl_list);
		kmem_cache_free(t10_pr_reg_cache, pr_reg);
	}
	spin_unlock(&pr_tmpl->aptpl_reg_lock);
}

static int core_scsi3_tpg_depend_item(struct se_portal_group *tpg)
{
1393
	return target_depend_item(&tpg->tpg_group.cg_item);
1394 1395 1396 1397
}

static void core_scsi3_tpg_undepend_item(struct se_portal_group *tpg)
{
1398
	target_undepend_item(&tpg->tpg_group.cg_item);
1399
	atomic_dec_mb(&tpg->tpg_pr_ref_count);
1400 1401 1402 1403 1404 1405
}

static int core_scsi3_nodeacl_depend_item(struct se_node_acl *nacl)
{
	if (nacl->dynamic_node_acl)
		return 0;
1406
	return target_depend_item(&nacl->acl_group.cg_item);
1407 1408 1409 1410
}

static void core_scsi3_nodeacl_undepend_item(struct se_node_acl *nacl)
{
1411 1412
	if (!nacl->dynamic_node_acl)
		target_undepend_item(&nacl->acl_group.cg_item);
1413
	atomic_dec_mb(&nacl->acl_pr_ref_count);
1414 1415 1416 1417
}

static int core_scsi3_lunacl_depend_item(struct se_dev_entry *se_deve)
{
1418
	struct se_lun_acl *lun_acl;
1419 1420 1421 1422 1423
	struct se_node_acl *nacl;
	struct se_portal_group *tpg;
	/*
	 * For nacl->dynamic_node_acl=1
	 */
1424 1425
	lun_acl = rcu_dereference_check(se_deve->se_lun_acl,
				atomic_read(&se_deve->pr_kref.refcount) != 0);
1426
	if (!lun_acl)
1427 1428 1429 1430 1431
		return 0;

	nacl = lun_acl->se_lun_nacl;
	tpg = nacl->se_tpg;

1432
	return target_depend_item(&lun_acl->se_lun_group.cg_item);
1433 1434 1435 1436
}

static void core_scsi3_lunacl_undepend_item(struct se_dev_entry *se_deve)
{
1437
	struct se_lun_acl *lun_acl;
1438 1439 1440 1441 1442
	struct se_node_acl *nacl;
	struct se_portal_group *tpg;
	/*
	 * For nacl->dynamic_node_acl=1
	 */
1443 1444
	lun_acl = rcu_dereference_check(se_deve->se_lun_acl,
				atomic_read(&se_deve->pr_kref.refcount) != 0);
1445
	if (!lun_acl) {
1446
		kref_put(&se_deve->pr_kref, target_pr_kref_release);
1447 1448 1449 1450 1451
		return;
	}
	nacl = lun_acl->se_lun_nacl;
	tpg = nacl->se_tpg;

1452
	target_undepend_item(&lun_acl->se_lun_group.cg_item);
1453
	kref_put(&se_deve->pr_kref, target_pr_kref_release);
1454 1455
}

1456 1457
static sense_reason_t
core_scsi3_decode_spec_i_port(
1458 1459 1460 1461 1462 1463 1464
	struct se_cmd *cmd,
	struct se_portal_group *tpg,
	unsigned char *l_isid,
	u64 sa_res_key,
	int all_tg_pt,
	int aptpl)
{
1465
	struct se_device *dev = cmd->se_dev;
1466
	struct se_portal_group *dest_tpg = NULL, *tmp_tpg;
1467
	struct se_session *se_sess = cmd->se_sess;
1468
	struct se_node_acl *dest_node_acl = NULL;
1469
	struct se_dev_entry *dest_se_deve = NULL;
1470 1471
	struct t10_pr_registration *dest_pr_reg, *local_pr_reg, *pr_reg_e;
	struct t10_pr_registration *pr_reg_tmp, *pr_reg_tmp_safe;
1472
	LIST_HEAD(tid_dest_list);
1473
	struct pr_transport_id_holder *tidh_new, *tidh, *tidh_tmp;
1474 1475
	unsigned char *buf, *ptr, proto_ident;
	const unsigned char *i_str;
J
Julia Lawall 已提交
1476
	char *iport_ptr = NULL, i_buf[PR_REG_ISID_ID_LEN];
1477
	sense_reason_t ret;
1478 1479 1480 1481 1482
	u32 tpdl, tid_len = 0;
	u32 dest_rtpi = 0;

	/*
	 * Allocate a struct pr_transport_id_holder and setup the
1483 1484
	 * local_node_acl pointer and add to struct list_head tid_dest_list
	 * for add registration processing in the loop of tid_dest_list below.
1485 1486
	 */
	tidh_new = kzalloc(sizeof(struct pr_transport_id_holder), GFP_KERNEL);
1487 1488
	if (!tidh_new) {
		pr_err("Unable to allocate tidh_new\n");
1489
		return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
1490 1491 1492 1493 1494
	}
	INIT_LIST_HEAD(&tidh_new->dest_list);
	tidh_new->dest_tpg = tpg;
	tidh_new->dest_node_acl = se_sess->se_node_acl;

1495
	local_pr_reg = __core_scsi3_alloc_registration(cmd->se_dev,
1496 1497
				se_sess->se_node_acl, cmd->se_lun,
				NULL, cmd->orig_fe_lun, l_isid,
1498
				sa_res_key, all_tg_pt, aptpl);
1499
	if (!local_pr_reg) {
1500
		kfree(tidh_new);
1501
		return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
1502 1503 1504 1505
	}
	tidh_new->dest_pr_reg = local_pr_reg;
	/*
	 * The local I_T nexus does not hold any configfs dependances,
1506
	 * so we set tidh_new->dest_se_deve to NULL to prevent the
1507 1508
	 * configfs_undepend_item() calls in the tid_dest_list loops below.
	 */
1509
	tidh_new->dest_se_deve = NULL;
1510
	list_add_tail(&tidh_new->dest_list, &tid_dest_list);
1511

1512 1513 1514
	if (cmd->data_length < 28) {
		pr_warn("SPC-PR: Received PR OUT parameter list"
			" length too small: %u\n", cmd->data_length);
1515
		ret = TCM_INVALID_PARAMETER_LIST;
1516 1517 1518
		goto out;
	}

1519
	buf = transport_kmap_data_sg(cmd);
1520 1521 1522 1523 1524
	if (!buf) {
		ret = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
		goto out;
	}

1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535
	/*
	 * For a PERSISTENT RESERVE OUT specify initiator ports payload,
	 * first extract TransportID Parameter Data Length, and make sure
	 * the value matches up to the SCSI expected data transfer length.
	 */
	tpdl = (buf[24] & 0xff) << 24;
	tpdl |= (buf[25] & 0xff) << 16;
	tpdl |= (buf[26] & 0xff) << 8;
	tpdl |= buf[27] & 0xff;

	if ((tpdl + 28) != cmd->data_length) {
1536
		pr_err("SPC-3 PR: Illegal tpdl: %u + 28 byte header"
1537 1538
			" does not equal CDB data_length: %u\n", tpdl,
			cmd->data_length);
1539 1540
		ret = TCM_INVALID_PARAMETER_LIST;
		goto out_unmap;
1541 1542 1543 1544 1545 1546 1547 1548 1549
	}
	/*
	 * Start processing the received transport IDs using the
	 * receiving I_T Nexus portal's fabric dependent methods to
	 * obtain the SCSI Initiator Port/Device Identifiers.
	 */
	ptr = &buf[28];

	while (tpdl > 0) {
1550
		struct se_lun *dest_lun, *tmp_lun;
1551

1552 1553 1554 1555
		proto_ident = (ptr[0] & 0x0f);
		dest_tpg = NULL;

		spin_lock(&dev->se_port_lock);
1556 1557
		list_for_each_entry(tmp_lun, &dev->dev_sep_list, lun_dev_link) {
			tmp_tpg = tmp_lun->lun_tpg;
1558

1559 1560 1561 1562
			/*
			 * Look for the matching proto_ident provided by
			 * the received TransportID
			 */
1563
			if (tmp_tpg->proto_id != proto_ident)
1564
				continue;
1565
			dest_rtpi = tmp_lun->lun_rtpi;
1566

1567 1568
			i_str = target_parse_pr_out_transport_id(tmp_tpg,
					(const char *)ptr, &tid_len, &iport_ptr);
1569
			if (!i_str)
1570 1571
				continue;

1572
			atomic_inc_mb(&tmp_tpg->tpg_pr_ref_count);
1573 1574
			spin_unlock(&dev->se_port_lock);

1575
			if (core_scsi3_tpg_depend_item(tmp_tpg)) {
1576
				pr_err(" core_scsi3_tpg_depend_item()"
1577
					" for tmp_tpg\n");
1578
				atomic_dec_mb(&tmp_tpg->tpg_pr_ref_count);
1579 1580
				ret = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
				goto out_unmap;
1581 1582
			}
			/*
1583
			 * Locate the destination initiator ACL to be registered
1584 1585 1586
			 * from the decoded fabric module specific TransportID
			 * at *i_str.
			 */
1587
			mutex_lock(&tmp_tpg->acl_node_mutex);
1588 1589
			dest_node_acl = __core_tpg_get_initiator_node_acl(
						tmp_tpg, i_str);
1590 1591
			if (dest_node_acl)
				atomic_inc_mb(&dest_node_acl->acl_pr_ref_count);
1592
			mutex_unlock(&tmp_tpg->acl_node_mutex);
1593

1594
			if (!dest_node_acl) {
1595 1596 1597 1598 1599
				core_scsi3_tpg_undepend_item(tmp_tpg);
				spin_lock(&dev->se_port_lock);
				continue;
			}

1600
			if (core_scsi3_nodeacl_depend_item(dest_node_acl)) {
1601
				pr_err("configfs_depend_item() failed"
1602
					" for dest_node_acl->acl_group\n");
1603
				atomic_dec_mb(&dest_node_acl->acl_pr_ref_count);
1604
				core_scsi3_tpg_undepend_item(tmp_tpg);
1605 1606
				ret = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
				goto out_unmap;
1607 1608 1609
			}

			dest_tpg = tmp_tpg;
1610
			pr_debug("SPC-3 PR SPEC_I_PT: Located %s Node:"
1611
				" %s Port RTPI: %hu\n",
1612
				dest_tpg->se_tpg_tfo->get_fabric_name(),
1613 1614 1615 1616 1617 1618 1619
				dest_node_acl->initiatorname, dest_rtpi);

			spin_lock(&dev->se_port_lock);
			break;
		}
		spin_unlock(&dev->se_port_lock);

1620 1621
		if (!dest_tpg) {
			pr_err("SPC-3 PR SPEC_I_PT: Unable to locate"
1622
					" dest_tpg\n");
1623 1624
			ret = TCM_INVALID_PARAMETER_LIST;
			goto out_unmap;
1625
		}
1626

1627
		pr_debug("SPC-3 PR SPEC_I_PT: Got %s data_length: %u tpdl: %u"
1628
			" tid_len: %d for %s + %s\n",
1629
			dest_tpg->se_tpg_tfo->get_fabric_name(), cmd->data_length,
1630
			tpdl, tid_len, i_str, iport_ptr);
1631

1632
		if (tid_len > tpdl) {
1633
			pr_err("SPC-3 PR SPEC_I_PT: Illegal tid_len:"
1634 1635 1636
				" %u for Transport ID: %s\n", tid_len, ptr);
			core_scsi3_nodeacl_undepend_item(dest_node_acl);
			core_scsi3_tpg_undepend_item(dest_tpg);
1637 1638
			ret = TCM_INVALID_PARAMETER_LIST;
			goto out_unmap;
1639 1640 1641 1642 1643 1644 1645 1646
		}
		/*
		 * Locate the desintation struct se_dev_entry pointer for matching
		 * RELATIVE TARGET PORT IDENTIFIER on the receiving I_T Nexus
		 * Target Port.
		 */
		dest_se_deve = core_get_se_deve_from_rtpi(dest_node_acl,
					dest_rtpi);
1647 1648
		if (!dest_se_deve) {
			pr_err("Unable to locate %s dest_se_deve"
1649
				" from destination RTPI: %hu\n",
1650
				dest_tpg->se_tpg_tfo->get_fabric_name(),
1651 1652 1653 1654
				dest_rtpi);

			core_scsi3_nodeacl_undepend_item(dest_node_acl);
			core_scsi3_tpg_undepend_item(dest_tpg);
1655 1656
			ret = TCM_INVALID_PARAMETER_LIST;
			goto out_unmap;
1657 1658
		}

1659
		if (core_scsi3_lunacl_depend_item(dest_se_deve)) {
1660
			pr_err("core_scsi3_lunacl_depend_item()"
1661
					" failed\n");
1662
			kref_put(&dest_se_deve->pr_kref, target_pr_kref_release);
1663 1664
			core_scsi3_nodeacl_undepend_item(dest_node_acl);
			core_scsi3_tpg_undepend_item(dest_tpg);
1665 1666
			ret = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
			goto out_unmap;
1667
		}
1668

1669
		pr_debug("SPC-3 PR SPEC_I_PT: Located %s Node: %s"
1670
			" dest_se_deve mapped_lun: %u\n",
1671
			dest_tpg->se_tpg_tfo->get_fabric_name(),
1672
			dest_node_acl->initiatorname, dest_se_deve->mapped_lun);
1673

1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696
		/*
		 * Skip any TransportIDs that already have a registration for
		 * this target port.
		 */
		pr_reg_e = __core_scsi3_locate_pr_reg(dev, dest_node_acl,
					iport_ptr);
		if (pr_reg_e) {
			core_scsi3_put_pr_reg(pr_reg_e);
			core_scsi3_lunacl_undepend_item(dest_se_deve);
			core_scsi3_nodeacl_undepend_item(dest_node_acl);
			core_scsi3_tpg_undepend_item(dest_tpg);
			ptr += tid_len;
			tpdl -= tid_len;
			tid_len = 0;
			continue;
		}
		/*
		 * Allocate a struct pr_transport_id_holder and setup
		 * the dest_node_acl and dest_se_deve pointers for the
		 * loop below.
		 */
		tidh_new = kzalloc(sizeof(struct pr_transport_id_holder),
				GFP_KERNEL);
1697 1698
		if (!tidh_new) {
			pr_err("Unable to allocate tidh_new\n");
1699 1700 1701
			core_scsi3_lunacl_undepend_item(dest_se_deve);
			core_scsi3_nodeacl_undepend_item(dest_node_acl);
			core_scsi3_tpg_undepend_item(dest_tpg);
1702 1703
			ret = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
			goto out_unmap;
1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725
		}
		INIT_LIST_HEAD(&tidh_new->dest_list);
		tidh_new->dest_tpg = dest_tpg;
		tidh_new->dest_node_acl = dest_node_acl;
		tidh_new->dest_se_deve = dest_se_deve;

		/*
		 * Allocate, but do NOT add the registration for the
		 * TransportID referenced SCSI Initiator port.  This
		 * done because of the following from spc4r17 in section
		 * 6.14.3 wrt SPEC_I_PT:
		 *
		 * "If a registration fails for any initiator port (e.g., if th
		 * logical unit does not have enough resources available to
		 * hold the registration information), no registrations shall be
		 * made, and the command shall be terminated with
		 * CHECK CONDITION status."
		 *
		 * That means we call __core_scsi3_alloc_registration() here,
		 * and then call __core_scsi3_add_registration() in the
		 * 2nd loop which will never fail.
		 */
1726 1727 1728
		dest_lun = rcu_dereference_check(dest_se_deve->se_lun,
				atomic_read(&dest_se_deve->pr_kref.refcount) != 0);

1729
		dest_pr_reg = __core_scsi3_alloc_registration(cmd->se_dev,
1730 1731 1732
					dest_node_acl, dest_lun, dest_se_deve,
					dest_se_deve->mapped_lun, iport_ptr,
					sa_res_key, all_tg_pt, aptpl);
1733
		if (!dest_pr_reg) {
1734 1735 1736 1737
			core_scsi3_lunacl_undepend_item(dest_se_deve);
			core_scsi3_nodeacl_undepend_item(dest_node_acl);
			core_scsi3_tpg_undepend_item(dest_tpg);
			kfree(tidh_new);
1738 1739
			ret = TCM_INVALID_PARAMETER_LIST;
			goto out_unmap;
1740 1741 1742 1743 1744 1745 1746 1747 1748
		}
		tidh_new->dest_pr_reg = dest_pr_reg;
		list_add_tail(&tidh_new->dest_list, &tid_dest_list);

		ptr += tid_len;
		tpdl -= tid_len;
		tid_len = 0;

	}
1749

1750
	transport_kunmap_data_sg(cmd);
1751

1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774
	/*
	 * Go ahead and create a registrations from tid_dest_list for the
	 * SPEC_I_PT provided TransportID for the *tidh referenced dest_node_acl
	 * and dest_se_deve.
	 *
	 * The SA Reservation Key from the PROUT is set for the
	 * registration, and ALL_TG_PT is also passed.  ALL_TG_PT=1
	 * means that the TransportID Initiator port will be
	 * registered on all of the target ports in the SCSI target device
	 * ALL_TG_PT=0 means the registration will only be for the
	 * SCSI target port the PROUT REGISTER with SPEC_I_PT=1
	 * was received.
	 */
	list_for_each_entry_safe(tidh, tidh_tmp, &tid_dest_list, dest_list) {
		dest_tpg = tidh->dest_tpg;
		dest_node_acl = tidh->dest_node_acl;
		dest_se_deve = tidh->dest_se_deve;
		dest_pr_reg = tidh->dest_pr_reg;

		list_del(&tidh->dest_list);
		kfree(tidh);

		memset(i_buf, 0, PR_REG_ISID_ID_LEN);
1775
		core_pr_dump_initiator_port(dest_pr_reg, i_buf, PR_REG_ISID_ID_LEN);
1776

1777
		__core_scsi3_add_registration(cmd->se_dev, dest_node_acl,
1778 1779
					dest_pr_reg, 0, 0);

1780
		pr_debug("SPC-3 PR [%s] SPEC_I_PT: Successfully"
1781
			" registered Transport ID for Node: %s%s Mapped LUN:"
1782
			" %u\n", dest_tpg->se_tpg_tfo->get_fabric_name(),
1783 1784
			dest_node_acl->initiatorname, i_buf, (dest_se_deve) ?
			dest_se_deve->mapped_lun : 0);
1785

1786
		if (!dest_se_deve)
1787 1788 1789 1790 1791 1792 1793 1794
			continue;

		core_scsi3_lunacl_undepend_item(dest_se_deve);
		core_scsi3_nodeacl_undepend_item(dest_node_acl);
		core_scsi3_tpg_undepend_item(dest_tpg);
	}

	return 0;
1795
out_unmap:
1796
	transport_kunmap_data_sg(cmd);
1797
out:
1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823
	/*
	 * For the failure case, release everything from tid_dest_list
	 * including *dest_pr_reg and the configfs dependances..
	 */
	list_for_each_entry_safe(tidh, tidh_tmp, &tid_dest_list, dest_list) {
		dest_tpg = tidh->dest_tpg;
		dest_node_acl = tidh->dest_node_acl;
		dest_se_deve = tidh->dest_se_deve;
		dest_pr_reg = tidh->dest_pr_reg;

		list_del(&tidh->dest_list);
		kfree(tidh);
		/*
		 * Release any extra ALL_TG_PT=1 registrations for
		 * the SPEC_I_PT=1 case.
		 */
		list_for_each_entry_safe(pr_reg_tmp, pr_reg_tmp_safe,
				&dest_pr_reg->pr_reg_atp_list,
				pr_reg_atp_mem_list) {
			list_del(&pr_reg_tmp->pr_reg_atp_mem_list);
			core_scsi3_lunacl_undepend_item(pr_reg_tmp->pr_reg_deve);
			kmem_cache_free(t10_pr_reg_cache, pr_reg_tmp);
		}

		kmem_cache_free(t10_pr_reg_cache, dest_pr_reg);

1824
		if (!dest_se_deve)
1825 1826 1827 1828 1829 1830 1831 1832 1833
			continue;

		core_scsi3_lunacl_undepend_item(dest_se_deve);
		core_scsi3_nodeacl_undepend_item(dest_node_acl);
		core_scsi3_tpg_undepend_item(dest_tpg);
	}
	return ret;
}

1834
static int core_scsi3_update_aptpl_buf(
1835 1836
	struct se_device *dev,
	unsigned char *buf,
1837
	u32 pr_aptpl_buf_len)
1838 1839 1840 1841 1842 1843
{
	struct se_portal_group *tpg;
	struct t10_pr_registration *pr_reg;
	unsigned char tmp[512], isid_buf[32];
	ssize_t len = 0;
	int reg_count = 0;
1844
	int ret = 0;
1845

1846 1847
	spin_lock(&dev->dev_reservation_lock);
	spin_lock(&dev->t10_pr.registration_lock);
1848 1849 1850
	/*
	 * Walk the registration list..
	 */
1851
	list_for_each_entry(pr_reg, &dev->t10_pr.registration_list,
1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875
			pr_reg_list) {

		tmp[0] = '\0';
		isid_buf[0] = '\0';
		tpg = pr_reg->pr_reg_nacl->se_tpg;
		/*
		 * Write out any ISID value to APTPL metadata that was included
		 * in the original registration.
		 */
		if (pr_reg->isid_present_at_reg)
			snprintf(isid_buf, 32, "initiator_sid=%s\n",
					pr_reg->pr_reg_isid);
		/*
		 * Include special metadata if the pr_reg matches the
		 * reservation holder.
		 */
		if (dev->dev_pr_res_holder == pr_reg) {
			snprintf(tmp, 512, "PR_REG_START: %d"
				"\ninitiator_fabric=%s\n"
				"initiator_node=%s\n%s"
				"sa_res_key=%llu\n"
				"res_holder=1\nres_type=%02x\n"
				"res_scope=%02x\nres_all_tg_pt=%d\n"
				"mapped_lun=%u\n", reg_count,
1876
				tpg->se_tpg_tfo->get_fabric_name(),
1877 1878 1879 1880 1881 1882 1883 1884 1885
				pr_reg->pr_reg_nacl->initiatorname, isid_buf,
				pr_reg->pr_res_key, pr_reg->pr_res_type,
				pr_reg->pr_res_scope, pr_reg->pr_reg_all_tg_pt,
				pr_reg->pr_res_mapped_lun);
		} else {
			snprintf(tmp, 512, "PR_REG_START: %d\n"
				"initiator_fabric=%s\ninitiator_node=%s\n%s"
				"sa_res_key=%llu\nres_holder=0\n"
				"res_all_tg_pt=%d\nmapped_lun=%u\n",
1886
				reg_count, tpg->se_tpg_tfo->get_fabric_name(),
1887 1888 1889 1890 1891
				pr_reg->pr_reg_nacl->initiatorname, isid_buf,
				pr_reg->pr_res_key, pr_reg->pr_reg_all_tg_pt,
				pr_reg->pr_res_mapped_lun);
		}

1892
		if ((len + strlen(tmp) >= pr_aptpl_buf_len)) {
1893 1894
			pr_err("Unable to update renaming APTPL metadata,"
			       " reallocating larger buffer\n");
1895 1896
			ret = -EMSGSIZE;
			goto out;
1897 1898 1899 1900 1901 1902 1903 1904
		}
		len += sprintf(buf+len, "%s", tmp);

		/*
		 * Include information about the associated SCSI target port.
		 */
		snprintf(tmp, 512, "target_fabric=%s\ntarget_node=%s\n"
			"tpgt=%hu\nport_rtpi=%hu\ntarget_lun=%u\nPR_REG_END:"
1905 1906 1907
			" %d\n", tpg->se_tpg_tfo->get_fabric_name(),
			tpg->se_tpg_tfo->tpg_get_wwn(tpg),
			tpg->se_tpg_tfo->tpg_get_tag(tpg),
1908 1909
			pr_reg->tg_pt_sep_rtpi, pr_reg->pr_aptpl_target_lun,
			reg_count);
1910

1911
		if ((len + strlen(tmp) >= pr_aptpl_buf_len)) {
1912 1913
			pr_err("Unable to update renaming APTPL metadata,"
			       " reallocating larger buffer\n");
1914 1915
			ret = -EMSGSIZE;
			goto out;
1916 1917 1918 1919 1920
		}
		len += sprintf(buf+len, "%s", tmp);
		reg_count++;
	}

1921
	if (!reg_count)
1922 1923
		len += sprintf(buf+len, "No Registrations or Reservations");

1924 1925
out:
	spin_unlock(&dev->t10_pr.registration_lock);
1926 1927 1928 1929 1930 1931 1932
	spin_unlock(&dev->dev_reservation_lock);

	return ret;
}

static int __core_scsi3_write_aptpl_to_file(
	struct se_device *dev,
1933
	unsigned char *buf)
1934
{
1935
	struct t10_wwn *wwn = &dev->t10_wwn;
1936 1937 1938
	struct file *file;
	int flags = O_RDWR | O_CREAT | O_TRUNC;
	char path[512];
1939
	u32 pr_aptpl_buf_len;
1940 1941 1942 1943
	int ret;

	memset(path, 0, 512);

1944
	if (strlen(&wwn->unit_serial[0]) >= 512) {
1945
		pr_err("WWN value for struct se_device does not fit"
1946
			" into path buffer\n");
1947
		return -EMSGSIZE;
1948 1949 1950 1951
	}

	snprintf(path, 512, "/var/target/pr/aptpl_%s", &wwn->unit_serial[0]);
	file = filp_open(path, flags, 0600);
1952
	if (IS_ERR(file)) {
1953
		pr_err("filp_open(%s) for APTPL metadata"
1954
			" failed\n", path);
1955
		return PTR_ERR(file);
1956 1957
	}

1958
	pr_aptpl_buf_len = (strlen(buf) + 1); /* Add extra for NULL */
1959

1960
	ret = kernel_write(file, buf, pr_aptpl_buf_len, 0);
1961

1962
	if (ret < 0)
1963
		pr_debug("Error writing APTPL metadata file: %s\n", path);
1964
	fput(file);
1965

1966
	return (ret < 0) ? -EIO : 0;
1967 1968
}

1969 1970 1971 1972
/*
 * Clear the APTPL metadata if APTPL has been disabled, otherwise
 * write out the updated metadata to struct file for this SCSI device.
 */
1973
static sense_reason_t core_scsi3_update_and_write_aptpl(struct se_device *dev, bool aptpl)
1974
{
1975
	unsigned char *buf;
1976
	int rc, len = PR_APTPL_BUF_LEN;
1977

1978 1979 1980
	if (!aptpl) {
		char *null_buf = "No Registrations or Reservations\n";

1981
		rc = __core_scsi3_write_aptpl_to_file(dev, null_buf);
1982 1983 1984
		dev->t10_pr.pr_aptpl_active = 0;
		pr_debug("SPC-3 PR: Set APTPL Bit Deactivated\n");

1985 1986
		if (rc)
			return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
1987

1988 1989
		return 0;
	}
1990 1991
retry:
	buf = vzalloc(len);
1992 1993 1994
	if (!buf)
		return TCM_OUT_OF_RESOURCES;

1995
	rc = core_scsi3_update_aptpl_buf(dev, buf, len);
1996
	if (rc < 0) {
1997 1998 1999
		vfree(buf);
		len *= 2;
		goto retry;
2000 2001
	}

2002 2003 2004
	rc = __core_scsi3_write_aptpl_to_file(dev, buf);
	if (rc != 0) {
		pr_err("SPC-3 PR: Could not update APTPL\n");
2005
		vfree(buf);
2006 2007 2008
		return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
	}
	dev->t10_pr.pr_aptpl_active = 1;
2009
	vfree(buf);
2010 2011
	pr_debug("SPC-3 PR: Set APTPL Bit Activated\n");
	return 0;
2012 2013
}

2014 2015
static sense_reason_t
core_scsi3_emulate_pro_register(struct se_cmd *cmd, u64 res_key, u64 sa_res_key,
2016
		bool aptpl, bool all_tg_pt, bool spec_i_pt, enum register_type register_type)
2017
{
2018
	struct se_session *se_sess = cmd->se_sess;
2019
	struct se_device *dev = cmd->se_dev;
2020
	struct se_lun *se_lun = cmd->se_lun;
2021
	struct se_portal_group *se_tpg;
2022
	struct t10_pr_registration *pr_reg, *pr_reg_p, *pr_reg_tmp;
2023
	struct t10_reservation *pr_tmpl = &dev->t10_pr;
2024
	unsigned char isid_buf[PR_REG_ISID_LEN], *isid_ptr = NULL;
2025
	sense_reason_t ret = TCM_NO_SENSE;
2026
	int pr_holder = 0, type;
2027

2028 2029
	if (!se_sess || !se_lun) {
		pr_err("SPC-3 PR: se_sess || struct se_lun is NULL!\n");
2030
		return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
2031 2032
	}
	se_tpg = se_sess->se_tpg;
2033

2034
	if (se_tpg->se_tpg_tfo->sess_get_initiator_sid) {
2035
		memset(&isid_buf[0], 0, PR_REG_ISID_LEN);
2036
		se_tpg->se_tpg_tfo->sess_get_initiator_sid(se_sess, &isid_buf[0],
2037 2038 2039 2040 2041 2042
				PR_REG_ISID_LEN);
		isid_ptr = &isid_buf[0];
	}
	/*
	 * Follow logic from spc4r17 Section 5.7.7, Register Behaviors Table 47
	 */
2043 2044
	pr_reg = core_scsi3_locate_pr_reg(dev, se_sess->se_node_acl, se_sess);
	if (!pr_reg) {
2045
		if (res_key) {
2046
			pr_warn("SPC-3 PR: Reservation Key non-zero"
2047
				" for SA REGISTER, returning CONFLICT\n");
2048
			return TCM_RESERVATION_CONFLICT;
2049 2050 2051 2052
		}
		/*
		 * Do nothing but return GOOD status.
		 */
2053
		if (!sa_res_key)
2054
			return 0;
2055

2056
		if (!spec_i_pt) {
2057 2058 2059 2060 2061
			/*
			 * Perform the Service Action REGISTER on the Initiator
			 * Port Endpoint that the PRO was received from on the
			 * Logical Unit of the SCSI device server.
			 */
2062
			if (core_scsi3_alloc_registration(cmd->se_dev,
2063 2064
					se_sess->se_node_acl, cmd->se_lun,
					NULL, cmd->orig_fe_lun, isid_ptr,
2065
					sa_res_key, all_tg_pt, aptpl,
2066
					register_type, 0)) {
2067
				pr_err("Unable to allocate"
2068
					" struct t10_pr_registration\n");
2069
				return TCM_INVALID_PARAMETER_LIST;
2070 2071 2072 2073 2074 2075 2076 2077 2078 2079
			}
		} else {
			/*
			 * Register both the Initiator port that received
			 * PROUT SA REGISTER + SPEC_I_PT=1 and extract SCSI
			 * TransportID from Parameter list and loop through
			 * fabric dependent parameter list while calling
			 * logic from of core_scsi3_alloc_registration() for
			 * each TransportID provided SCSI Initiator Port/Device
			 */
2080
			ret = core_scsi3_decode_spec_i_port(cmd, se_tpg,
2081
					isid_ptr, sa_res_key, all_tg_pt, aptpl);
2082
			if (ret != 0)
2083 2084
				return ret;
		}
2085
		return core_scsi3_update_and_write_aptpl(dev, aptpl);
2086 2087
	}

2088 2089 2090 2091 2092 2093 2094 2095 2096 2097
	/* ok, existing registration */

	if ((register_type == REGISTER) && (res_key != pr_reg->pr_res_key)) {
		pr_err("SPC-3 PR REGISTER: Received"
		       " res_key: 0x%016Lx does not match"
		       " existing SA REGISTER res_key:"
		       " 0x%016Lx\n", res_key,
		       pr_reg->pr_res_key);
		ret = TCM_RESERVATION_CONFLICT;
		goto out;
2098 2099 2100
	}

	if (spec_i_pt) {
2101 2102
		pr_err("SPC-3 PR REGISTER: SPEC_I_PT"
			" set on a registered nexus\n");
2103
		ret = TCM_INVALID_PARAMETER_LIST;
2104
		goto out;
2105 2106 2107 2108 2109 2110
	}

	/*
	 * An existing ALL_TG_PT=1 registration being released
	 * must also set ALL_TG_PT=1 in the incoming PROUT.
	 */
2111 2112
	if (pr_reg->pr_reg_all_tg_pt && !all_tg_pt) {
		pr_err("SPC-3 PR REGISTER: ALL_TG_PT=1"
2113 2114 2115
			" registration exists, but ALL_TG_PT=1 bit not"
			" present in received PROUT\n");
		ret = TCM_INVALID_CDB_FIELD;
2116
		goto out;
2117 2118 2119
	}

	/*
2120
	 * sa_res_key=1 Change Reservation Key for registered I_T Nexus.
2121
	 */
2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140
	if (sa_res_key) {
		/*
		 * Increment PRgeneration counter for struct se_device"
		 * upon a successful REGISTER, see spc4r17 section 6.3.2
		 * READ_KEYS service action.
		 */
		pr_reg->pr_res_generation = core_scsi3_pr_generation(cmd->se_dev);
		pr_reg->pr_res_key = sa_res_key;
		pr_debug("SPC-3 PR [%s] REGISTER%s: Changed Reservation"
			 " Key for %s to: 0x%016Lx PRgeneration:"
			 " 0x%08x\n", cmd->se_tfo->get_fabric_name(),
			 (register_type == REGISTER_AND_IGNORE_EXISTING_KEY) ? "_AND_IGNORE_EXISTING_KEY" : "",
			 pr_reg->pr_reg_nacl->initiatorname,
			 pr_reg->pr_res_key, pr_reg->pr_res_generation);

	} else {
		/*
		 * sa_res_key=0 Unregister Reservation Key for registered I_T Nexus.
		 */
2141 2142 2143
		type = pr_reg->pr_res_type;
		pr_holder = core_scsi3_check_implicit_release(cmd->se_dev,
							      pr_reg);
2144 2145
		if (pr_holder < 0) {
			ret = TCM_RESERVATION_CONFLICT;
2146
			goto out;
2147
		}
2148 2149

		spin_lock(&pr_tmpl->registration_lock);
2150
		/*
2151 2152
		 * Release all ALL_TG_PT=1 for the matching SCSI Initiator Port
		 * and matching pr_res_key.
2153
		 */
2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170
		if (pr_reg->pr_reg_all_tg_pt) {
			list_for_each_entry_safe(pr_reg_p, pr_reg_tmp,
					&pr_tmpl->registration_list,
					pr_reg_list) {

				if (!pr_reg_p->pr_reg_all_tg_pt)
					continue;
				if (pr_reg_p->pr_res_key != res_key)
					continue;
				if (pr_reg == pr_reg_p)
					continue;
				if (strcmp(pr_reg->pr_reg_nacl->initiatorname,
					   pr_reg_p->pr_reg_nacl->initiatorname))
					continue;

				__core_scsi3_free_registration(dev,
						pr_reg_p, NULL, 0);
2171 2172
			}
		}
2173

2174
		/*
2175
		 * Release the calling I_T Nexus registration now..
2176
		 */
2177
		__core_scsi3_free_registration(cmd->se_dev, pr_reg, NULL, 1);
2178
		pr_reg = NULL;
2179

2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191
		/*
		 * From spc4r17, section 5.7.11.3 Unregistering
		 *
		 * If the persistent reservation is a registrants only
		 * type, the device server shall establish a unit
		 * attention condition for the initiator port associated
		 * with every registered I_T nexus except for the I_T
		 * nexus on which the PERSISTENT RESERVE OUT command was
		 * received, with the additional sense code set to
		 * RESERVATIONS RELEASED.
		 */
		if (pr_holder &&
2192 2193
		    (type == PR_TYPE_WRITE_EXCLUSIVE_REGONLY ||
		     type == PR_TYPE_EXCLUSIVE_ACCESS_REGONLY)) {
2194 2195 2196 2197 2198 2199 2200 2201 2202
			list_for_each_entry(pr_reg_p,
					&pr_tmpl->registration_list,
					pr_reg_list) {

				core_scsi3_ua_allocate(
					pr_reg_p->pr_reg_nacl,
					pr_reg_p->pr_res_mapped_lun,
					0x2A,
					ASCQ_2AH_RESERVATIONS_RELEASED);
2203
			}
2204
		}
2205

2206
		spin_unlock(&pr_tmpl->registration_lock);
2207
	}
2208

2209
	ret = core_scsi3_update_and_write_aptpl(dev, aptpl);
2210

2211
out:
2212 2213
	if (pr_reg)
		core_scsi3_put_pr_reg(pr_reg);
2214
	return ret;
2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238
}

unsigned char *core_scsi3_pr_dump_type(int type)
{
	switch (type) {
	case PR_TYPE_WRITE_EXCLUSIVE:
		return "Write Exclusive Access";
	case PR_TYPE_EXCLUSIVE_ACCESS:
		return "Exclusive Access";
	case PR_TYPE_WRITE_EXCLUSIVE_REGONLY:
		return "Write Exclusive Access, Registrants Only";
	case PR_TYPE_EXCLUSIVE_ACCESS_REGONLY:
		return "Exclusive Access, Registrants Only";
	case PR_TYPE_WRITE_EXCLUSIVE_ALLREG:
		return "Write Exclusive Access, All Registrants";
	case PR_TYPE_EXCLUSIVE_ACCESS_ALLREG:
		return "Exclusive Access, All Registrants";
	default:
		break;
	}

	return "Unknown SPC-3 PR Type";
}

2239 2240
static sense_reason_t
core_scsi3_pro_reserve(struct se_cmd *cmd, int type, int scope, u64 res_key)
2241
{
2242
	struct se_device *dev = cmd->se_dev;
2243 2244
	struct se_session *se_sess = cmd->se_sess;
	struct se_lun *se_lun = cmd->se_lun;
2245
	struct t10_pr_registration *pr_reg, *pr_res_holder;
2246
	struct t10_reservation *pr_tmpl = &dev->t10_pr;
2247
	char i_buf[PR_REG_ISID_ID_LEN];
2248
	sense_reason_t ret;
2249 2250 2251

	memset(i_buf, 0, PR_REG_ISID_ID_LEN);

2252 2253
	if (!se_sess || !se_lun) {
		pr_err("SPC-3 PR: se_sess || struct se_lun is NULL!\n");
2254
		return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
2255 2256 2257 2258
	}
	/*
	 * Locate the existing *pr_reg via struct se_node_acl pointers
	 */
2259
	pr_reg = core_scsi3_locate_pr_reg(cmd->se_dev, se_sess->se_node_acl,
2260
				se_sess);
2261 2262
	if (!pr_reg) {
		pr_err("SPC-3 PR: Unable to locate"
2263
			" PR_REGISTERED *pr_reg for RESERVE\n");
2264
		return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275
	}
	/*
	 * From spc4r17 Section 5.7.9: Reserving:
	 *
	 * An application client creates a persistent reservation by issuing
	 * a PERSISTENT RESERVE OUT command with RESERVE service action through
	 * a registered I_T nexus with the following parameters:
	 *    a) RESERVATION KEY set to the value of the reservation key that is
	 * 	 registered with the logical unit for the I_T nexus; and
	 */
	if (res_key != pr_reg->pr_res_key) {
2276
		pr_err("SPC-3 PR RESERVE: Received res_key: 0x%016Lx"
2277 2278
			" does not match existing SA REGISTER res_key:"
			" 0x%016Lx\n", res_key, pr_reg->pr_res_key);
2279 2280
		ret = TCM_RESERVATION_CONFLICT;
		goto out_put_pr_reg;
2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292
	}
	/*
	 * From spc4r17 Section 5.7.9: Reserving:
	 *
	 * From above:
	 *  b) TYPE field and SCOPE field set to the persistent reservation
	 *     being created.
	 *
	 * Only one persistent reservation is allowed at a time per logical unit
	 * and that persistent reservation has a scope of LU_SCOPE.
	 */
	if (scope != PR_SCOPE_LU_SCOPE) {
2293
		pr_err("SPC-3 PR: Illegal SCOPE: 0x%02x\n", scope);
2294 2295
		ret = TCM_INVALID_PARAMETER_LIST;
		goto out_put_pr_reg;
2296 2297 2298 2299 2300 2301 2302 2303
	}
	/*
	 * See if we have an existing PR reservation holder pointer at
	 * struct se_device->dev_pr_res_holder in the form struct t10_pr_registration
	 * *pr_res_holder.
	 */
	spin_lock(&dev->dev_reservation_lock);
	pr_res_holder = dev->dev_pr_res_holder;
2304
	if (pr_res_holder) {
2305 2306 2307 2308 2309 2310 2311 2312 2313 2314
		/*
		 * From spc4r17 Section 5.7.9: Reserving:
		 *
		 * If the device server receives a PERSISTENT RESERVE OUT
		 * command from an I_T nexus other than a persistent reservation
		 * holder (see 5.7.10) that attempts to create a persistent
		 * reservation when a persistent reservation already exists for
		 * the logical unit, then the command shall be completed with
		 * RESERVATION CONFLICT status.
		 */
2315
		if (!is_reservation_holder(pr_res_holder, pr_reg)) {
2316
			struct se_node_acl *pr_res_nacl = pr_res_holder->pr_reg_nacl;
2317
			pr_err("SPC-3 PR: Attempted RESERVE from"
2318 2319
				" [%s]: %s while reservation already held by"
				" [%s]: %s, returning RESERVATION_CONFLICT\n",
2320
				cmd->se_tfo->get_fabric_name(),
2321
				se_sess->se_node_acl->initiatorname,
2322
				pr_res_nacl->se_tpg->se_tpg_tfo->get_fabric_name(),
2323 2324 2325
				pr_res_holder->pr_reg_nacl->initiatorname);

			spin_unlock(&dev->dev_reservation_lock);
2326 2327
			ret = TCM_RESERVATION_CONFLICT;
			goto out_put_pr_reg;
2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338
		}
		/*
		 * From spc4r17 Section 5.7.9: Reserving:
		 *
		 * If a persistent reservation holder attempts to modify the
		 * type or scope of an existing persistent reservation, the
		 * command shall be completed with RESERVATION CONFLICT status.
		 */
		if ((pr_res_holder->pr_res_type != type) ||
		    (pr_res_holder->pr_res_scope != scope)) {
			struct se_node_acl *pr_res_nacl = pr_res_holder->pr_reg_nacl;
2339
			pr_err("SPC-3 PR: Attempted RESERVE from"
2340 2341 2342
				" [%s]: %s trying to change TYPE and/or SCOPE,"
				" while reservation already held by [%s]: %s,"
				" returning RESERVATION_CONFLICT\n",
2343
				cmd->se_tfo->get_fabric_name(),
2344
				se_sess->se_node_acl->initiatorname,
2345
				pr_res_nacl->se_tpg->se_tpg_tfo->get_fabric_name(),
2346 2347 2348
				pr_res_holder->pr_reg_nacl->initiatorname);

			spin_unlock(&dev->dev_reservation_lock);
2349 2350
			ret = TCM_RESERVATION_CONFLICT;
			goto out_put_pr_reg;
2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362
		}
		/*
		 * From spc4r17 Section 5.7.9: Reserving:
		 *
		 * If the device server receives a PERSISTENT RESERVE OUT
		 * command with RESERVE service action where the TYPE field and
		 * the SCOPE field contain the same values as the existing type
		 * and scope from a persistent reservation holder, it shall not
		 * make any change to the existing persistent reservation and
		 * shall completethe command with GOOD status.
		 */
		spin_unlock(&dev->dev_reservation_lock);
2363 2364
		ret = 0;
		goto out_put_pr_reg;
2365 2366 2367 2368 2369 2370 2371 2372 2373
	}
	/*
	 * Otherwise, our *pr_reg becomes the PR reservation holder for said
	 * TYPE/SCOPE.  Also set the received scope and type in *pr_reg.
	 */
	pr_reg->pr_res_scope = scope;
	pr_reg->pr_res_type = type;
	pr_reg->pr_res_holder = 1;
	dev->dev_pr_res_holder = pr_reg;
2374
	core_pr_dump_initiator_port(pr_reg, i_buf, PR_REG_ISID_ID_LEN);
2375

2376
	pr_debug("SPC-3 PR [%s] Service Action: RESERVE created new"
2377
		" reservation holder TYPE: %s ALL_TG_PT: %d\n",
2378
		cmd->se_tfo->get_fabric_name(), core_scsi3_pr_dump_type(type),
2379
		(pr_reg->pr_reg_all_tg_pt) ? 1 : 0);
2380
	pr_debug("SPC-3 PR [%s] RESERVE Node: %s%s\n",
2381
			cmd->se_tfo->get_fabric_name(),
2382
			se_sess->se_node_acl->initiatorname,
2383
			i_buf);
2384 2385
	spin_unlock(&dev->dev_reservation_lock);

2386 2387
	if (pr_tmpl->pr_aptpl_active)
		core_scsi3_update_and_write_aptpl(cmd->se_dev, true);
2388

2389 2390
	ret = 0;
out_put_pr_reg:
2391
	core_scsi3_put_pr_reg(pr_reg);
2392
	return ret;
2393 2394
}

2395 2396 2397
static sense_reason_t
core_scsi3_emulate_pro_reserve(struct se_cmd *cmd, int type, int scope,
		u64 res_key)
2398 2399 2400 2401 2402 2403 2404 2405
{
	switch (type) {
	case PR_TYPE_WRITE_EXCLUSIVE:
	case PR_TYPE_EXCLUSIVE_ACCESS:
	case PR_TYPE_WRITE_EXCLUSIVE_REGONLY:
	case PR_TYPE_EXCLUSIVE_ACCESS_REGONLY:
	case PR_TYPE_WRITE_EXCLUSIVE_ALLREG:
	case PR_TYPE_EXCLUSIVE_ACCESS_ALLREG:
2406
		return core_scsi3_pro_reserve(cmd, type, scope, res_key);
2407
	default:
2408
		pr_err("SPC-3 PR: Unknown Service Action RESERVE Type:"
2409
			" 0x%02x\n", type);
2410
		return TCM_INVALID_CDB_FIELD;
2411 2412 2413 2414 2415 2416 2417 2418 2419 2420
	}
}

/*
 * Called with struct se_device->dev_reservation_lock held.
 */
static void __core_scsi3_complete_pro_release(
	struct se_device *dev,
	struct se_node_acl *se_nacl,
	struct t10_pr_registration *pr_reg,
2421 2422
	int explicit,
	int unreg)
2423
{
2424
	const struct target_core_fabric_ops *tfo = se_nacl->se_tpg->se_tpg_tfo;
2425
	char i_buf[PR_REG_ISID_ID_LEN];
2426
	int pr_res_type = 0, pr_res_scope = 0;
2427 2428

	memset(i_buf, 0, PR_REG_ISID_ID_LEN);
2429
	core_pr_dump_initiator_port(pr_reg, i_buf, PR_REG_ISID_ID_LEN);
2430 2431
	/*
	 * Go ahead and release the current PR reservation holder.
2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445
	 * If an All Registrants reservation is currently active and
	 * a unregister operation is requested, replace the current
	 * dev_pr_res_holder with another active registration.
	 */
	if (dev->dev_pr_res_holder) {
		pr_res_type = dev->dev_pr_res_holder->pr_res_type;
		pr_res_scope = dev->dev_pr_res_holder->pr_res_scope;
		dev->dev_pr_res_holder->pr_res_type = 0;
		dev->dev_pr_res_holder->pr_res_scope = 0;
		dev->dev_pr_res_holder->pr_res_holder = 0;
		dev->dev_pr_res_holder = NULL;
	}
	if (!unreg)
		goto out;
2446

2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473
	spin_lock(&dev->t10_pr.registration_lock);
	list_del_init(&pr_reg->pr_reg_list);
	/*
	 * If the I_T nexus is a reservation holder, the persistent reservation
	 * is of an all registrants type, and the I_T nexus is the last remaining
	 * registered I_T nexus, then the device server shall also release the
	 * persistent reservation.
	 */
	if (!list_empty(&dev->t10_pr.registration_list) &&
	    ((pr_res_type == PR_TYPE_WRITE_EXCLUSIVE_ALLREG) ||
	     (pr_res_type == PR_TYPE_EXCLUSIVE_ACCESS_ALLREG))) {
		dev->dev_pr_res_holder =
			list_entry(dev->t10_pr.registration_list.next,
				   struct t10_pr_registration, pr_reg_list);
		dev->dev_pr_res_holder->pr_res_type = pr_res_type;
		dev->dev_pr_res_holder->pr_res_scope = pr_res_scope;
		dev->dev_pr_res_holder->pr_res_holder = 1;
	}
	spin_unlock(&dev->t10_pr.registration_lock);
out:
	if (!dev->dev_pr_res_holder) {
		pr_debug("SPC-3 PR [%s] Service Action: %s RELEASE cleared"
			" reservation holder TYPE: %s ALL_TG_PT: %d\n",
			tfo->get_fabric_name(), (explicit) ? "explicit" :
			"implicit", core_scsi3_pr_dump_type(pr_res_type),
			(pr_reg->pr_reg_all_tg_pt) ? 1 : 0);
	}
2474
	pr_debug("SPC-3 PR [%s] RELEASE Node: %s%s\n",
2475
		tfo->get_fabric_name(), se_nacl->initiatorname,
2476
		i_buf);
2477 2478 2479 2480 2481 2482
	/*
	 * Clear TYPE and SCOPE for the next PROUT Service Action: RESERVE
	 */
	pr_reg->pr_res_holder = pr_reg->pr_res_type = pr_reg->pr_res_scope = 0;
}

2483 2484 2485
static sense_reason_t
core_scsi3_emulate_pro_release(struct se_cmd *cmd, int type, int scope,
		u64 res_key)
2486 2487
{
	struct se_device *dev = cmd->se_dev;
2488 2489
	struct se_session *se_sess = cmd->se_sess;
	struct se_lun *se_lun = cmd->se_lun;
2490
	struct t10_pr_registration *pr_reg, *pr_reg_p, *pr_res_holder;
2491
	struct t10_reservation *pr_tmpl = &dev->t10_pr;
2492
	sense_reason_t ret = 0;
2493

2494 2495
	if (!se_sess || !se_lun) {
		pr_err("SPC-3 PR: se_sess || struct se_lun is NULL!\n");
2496
		return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
2497 2498 2499 2500 2501
	}
	/*
	 * Locate the existing *pr_reg via struct se_node_acl pointers
	 */
	pr_reg = core_scsi3_locate_pr_reg(dev, se_sess->se_node_acl, se_sess);
2502 2503
	if (!pr_reg) {
		pr_err("SPC-3 PR: Unable to locate"
2504
			" PR_REGISTERED *pr_reg for RELEASE\n");
2505
		return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520
	}
	/*
	 * From spc4r17 Section 5.7.11.2 Releasing:
	 *
	 * If there is no persistent reservation or in response to a persistent
	 * reservation release request from a registered I_T nexus that is not a
	 * persistent reservation holder (see 5.7.10), the device server shall
	 * do the following:
	 *
	 *     a) Not release the persistent reservation, if any;
	 *     b) Not remove any registrations; and
	 *     c) Complete the command with GOOD status.
	 */
	spin_lock(&dev->dev_reservation_lock);
	pr_res_holder = dev->dev_pr_res_holder;
2521
	if (!pr_res_holder) {
2522 2523 2524 2525
		/*
		 * No persistent reservation, return GOOD status.
		 */
		spin_unlock(&dev->dev_reservation_lock);
2526
		goto out_put_pr_reg;
2527 2528
	}

2529
	if (!is_reservation_holder(pr_res_holder, pr_reg)) {
2530 2531 2532 2533 2534
		/*
		 * Release request from a registered I_T nexus that is not a
		 * persistent reservation holder. return GOOD status.
		 */
		spin_unlock(&dev->dev_reservation_lock);
2535
		goto out_put_pr_reg;
2536
	}
2537

2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552
	/*
	 * From spc4r17 Section 5.7.11.2 Releasing:
	 *
	 * Only the persistent reservation holder (see 5.7.10) is allowed to
	 * release a persistent reservation.
	 *
	 * An application client releases the persistent reservation by issuing
	 * a PERSISTENT RESERVE OUT command with RELEASE service action through
	 * an I_T nexus that is a persistent reservation holder with the
	 * following parameters:
	 *
	 *     a) RESERVATION KEY field set to the value of the reservation key
	 *	  that is registered with the logical unit for the I_T nexus;
	 */
	if (res_key != pr_reg->pr_res_key) {
2553
		pr_err("SPC-3 PR RELEASE: Received res_key: 0x%016Lx"
2554 2555 2556
			" does not match existing SA REGISTER res_key:"
			" 0x%016Lx\n", res_key, pr_reg->pr_res_key);
		spin_unlock(&dev->dev_reservation_lock);
2557 2558
		ret = TCM_RESERVATION_CONFLICT;
		goto out_put_pr_reg;
2559 2560 2561 2562 2563 2564 2565 2566 2567 2568
	}
	/*
	 * From spc4r17 Section 5.7.11.2 Releasing and above:
	 *
	 * b) TYPE field and SCOPE field set to match the persistent
	 *    reservation being released.
	 */
	if ((pr_res_holder->pr_res_type != type) ||
	    (pr_res_holder->pr_res_scope != scope)) {
		struct se_node_acl *pr_res_nacl = pr_res_holder->pr_reg_nacl;
2569
		pr_err("SPC-3 PR RELEASE: Attempted to release"
2570 2571 2572
			" reservation from [%s]: %s with different TYPE "
			"and/or SCOPE  while reservation already held by"
			" [%s]: %s, returning RESERVATION_CONFLICT\n",
2573
			cmd->se_tfo->get_fabric_name(),
2574
			se_sess->se_node_acl->initiatorname,
2575
			pr_res_nacl->se_tpg->se_tpg_tfo->get_fabric_name(),
2576 2577 2578
			pr_res_holder->pr_reg_nacl->initiatorname);

		spin_unlock(&dev->dev_reservation_lock);
2579 2580
		ret = TCM_RESERVATION_CONFLICT;
		goto out_put_pr_reg;
2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598
	}
	/*
	 * In response to a persistent reservation release request from the
	 * persistent reservation holder the device server shall perform a
	 * release by doing the following as an uninterrupted series of actions:
	 * a) Release the persistent reservation;
	 * b) Not remove any registration(s);
	 * c) If the released persistent reservation is a registrants only type
	 * or all registrants type persistent reservation,
	 *    the device server shall establish a unit attention condition for
	 *    the initiator port associated with every regis-
	 *    tered I_T nexus other than I_T nexus on which the PERSISTENT
	 *    RESERVE OUT command with RELEASE service action was received,
	 *    with the additional sense code set to RESERVATIONS RELEASED; and
	 * d) If the persistent reservation is of any other type, the device
	 *    server shall not establish a unit attention condition.
	 */
	__core_scsi3_complete_pro_release(dev, se_sess->se_node_acl,
2599
					  pr_reg, 1, 0);
2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631

	spin_unlock(&dev->dev_reservation_lock);

	if ((type != PR_TYPE_WRITE_EXCLUSIVE_REGONLY) &&
	    (type != PR_TYPE_EXCLUSIVE_ACCESS_REGONLY) &&
	    (type != PR_TYPE_WRITE_EXCLUSIVE_ALLREG) &&
	    (type != PR_TYPE_EXCLUSIVE_ACCESS_ALLREG)) {
		/*
		 * If no UNIT ATTENTION conditions will be established for
		 * PR_TYPE_WRITE_EXCLUSIVE or PR_TYPE_EXCLUSIVE_ACCESS
		 * go ahead and check for APTPL=1 update+write below
		 */
		goto write_aptpl;
	}

	spin_lock(&pr_tmpl->registration_lock);
	list_for_each_entry(pr_reg_p, &pr_tmpl->registration_list,
			pr_reg_list) {
		/*
		 * Do not establish a UNIT ATTENTION condition
		 * for the calling I_T Nexus
		 */
		if (pr_reg_p == pr_reg)
			continue;

		core_scsi3_ua_allocate(pr_reg_p->pr_reg_nacl,
				pr_reg_p->pr_res_mapped_lun,
				0x2A, ASCQ_2AH_RESERVATIONS_RELEASED);
	}
	spin_unlock(&pr_tmpl->registration_lock);

write_aptpl:
2632 2633 2634
	if (pr_tmpl->pr_aptpl_active)
		core_scsi3_update_and_write_aptpl(cmd->se_dev, true);

2635
out_put_pr_reg:
2636
	core_scsi3_put_pr_reg(pr_reg);
2637
	return ret;
2638 2639
}

2640 2641
static sense_reason_t
core_scsi3_emulate_pro_clear(struct se_cmd *cmd, u64 res_key)
2642 2643 2644
{
	struct se_device *dev = cmd->se_dev;
	struct se_node_acl *pr_reg_nacl;
2645
	struct se_session *se_sess = cmd->se_sess;
2646
	struct t10_reservation *pr_tmpl = &dev->t10_pr;
2647 2648 2649 2650 2651 2652
	struct t10_pr_registration *pr_reg, *pr_reg_tmp, *pr_reg_n, *pr_res_holder;
	u32 pr_res_mapped_lun = 0;
	int calling_it_nexus = 0;
	/*
	 * Locate the existing *pr_reg via struct se_node_acl pointers
	 */
2653
	pr_reg_n = core_scsi3_locate_pr_reg(cmd->se_dev,
2654
			se_sess->se_node_acl, se_sess);
2655 2656
	if (!pr_reg_n) {
		pr_err("SPC-3 PR: Unable to locate"
2657
			" PR_REGISTERED *pr_reg for CLEAR\n");
2658
		return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671
	}
	/*
	 * From spc4r17 section 5.7.11.6, Clearing:
	 *
	 * Any application client may release the persistent reservation and
	 * remove all registrations from a device server by issuing a
	 * PERSISTENT RESERVE OUT command with CLEAR service action through a
	 * registered I_T nexus with the following parameter:
	 *
	 *	a) RESERVATION KEY field set to the value of the reservation key
	 * 	   that is registered with the logical unit for the I_T nexus.
	 */
	if (res_key != pr_reg_n->pr_res_key) {
2672
		pr_err("SPC-3 PR REGISTER: Received"
2673 2674 2675 2676
			" res_key: 0x%016Lx does not match"
			" existing SA REGISTER res_key:"
			" 0x%016Lx\n", res_key, pr_reg_n->pr_res_key);
		core_scsi3_put_pr_reg(pr_reg_n);
2677
		return TCM_RESERVATION_CONFLICT;
2678 2679 2680 2681 2682 2683 2684 2685 2686
	}
	/*
	 * a) Release the persistent reservation, if any;
	 */
	spin_lock(&dev->dev_reservation_lock);
	pr_res_holder = dev->dev_pr_res_holder;
	if (pr_res_holder) {
		struct se_node_acl *pr_res_nacl = pr_res_holder->pr_reg_nacl;
		__core_scsi3_complete_pro_release(dev, pr_res_nacl,
2687
						  pr_res_holder, 0, 0);
2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708
	}
	spin_unlock(&dev->dev_reservation_lock);
	/*
	 * b) Remove all registration(s) (see spc4r17 5.7.7);
	 */
	spin_lock(&pr_tmpl->registration_lock);
	list_for_each_entry_safe(pr_reg, pr_reg_tmp,
			&pr_tmpl->registration_list, pr_reg_list) {

		calling_it_nexus = (pr_reg_n == pr_reg) ? 1 : 0;
		pr_reg_nacl = pr_reg->pr_reg_nacl;
		pr_res_mapped_lun = pr_reg->pr_res_mapped_lun;
		__core_scsi3_free_registration(dev, pr_reg, NULL,
					calling_it_nexus);
		/*
		 * e) Establish a unit attention condition for the initiator
		 *    port associated with every registered I_T nexus other
		 *    than the I_T nexus on which the PERSISTENT RESERVE OUT
		 *    command with CLEAR service action was received, with the
		 *    additional sense code set to RESERVATIONS PREEMPTED.
		 */
2709
		if (!calling_it_nexus)
2710 2711 2712 2713 2714
			core_scsi3_ua_allocate(pr_reg_nacl, pr_res_mapped_lun,
				0x2A, ASCQ_2AH_RESERVATIONS_PREEMPTED);
	}
	spin_unlock(&pr_tmpl->registration_lock);

2715
	pr_debug("SPC-3 PR [%s] Service Action: CLEAR complete\n",
2716
		cmd->se_tfo->get_fabric_name());
2717

2718
	core_scsi3_update_and_write_aptpl(cmd->se_dev, false);
2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732

	core_scsi3_pr_generation(dev);
	return 0;
}

/*
 * Called with struct se_device->dev_reservation_lock held.
 */
static void __core_scsi3_complete_pro_preempt(
	struct se_device *dev,
	struct t10_pr_registration *pr_reg,
	struct list_head *preempt_and_abort_list,
	int type,
	int scope,
2733
	enum preempt_type preempt_type)
2734 2735
{
	struct se_node_acl *nacl = pr_reg->pr_reg_nacl;
2736
	const struct target_core_fabric_ops *tfo = nacl->se_tpg->se_tpg_tfo;
2737 2738 2739
	char i_buf[PR_REG_ISID_ID_LEN];

	memset(i_buf, 0, PR_REG_ISID_ID_LEN);
2740
	core_pr_dump_initiator_port(pr_reg, i_buf, PR_REG_ISID_ID_LEN);
2741
	/*
2742
	 * Do an implicit RELEASE of the existing reservation.
2743 2744 2745
	 */
	if (dev->dev_pr_res_holder)
		__core_scsi3_complete_pro_release(dev, nacl,
2746
						  dev->dev_pr_res_holder, 0, 0);
2747 2748 2749 2750 2751 2752

	dev->dev_pr_res_holder = pr_reg;
	pr_reg->pr_res_holder = 1;
	pr_reg->pr_res_type = type;
	pr_reg->pr_res_scope = scope;

2753
	pr_debug("SPC-3 PR [%s] Service Action: PREEMPT%s created new"
2754
		" reservation holder TYPE: %s ALL_TG_PT: %d\n",
2755
		tfo->get_fabric_name(), (preempt_type == PREEMPT_AND_ABORT) ? "_AND_ABORT" : "",
2756 2757
		core_scsi3_pr_dump_type(type),
		(pr_reg->pr_reg_all_tg_pt) ? 1 : 0);
2758
	pr_debug("SPC-3 PR [%s] PREEMPT%s from Node: %s%s\n",
2759
		tfo->get_fabric_name(), (preempt_type == PREEMPT_AND_ABORT) ? "_AND_ABORT" : "",
2760
		nacl->initiatorname, i_buf);
2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783
	/*
	 * For PREEMPT_AND_ABORT, add the preempting reservation's
	 * struct t10_pr_registration to the list that will be compared
	 * against received CDBs..
	 */
	if (preempt_and_abort_list)
		list_add_tail(&pr_reg->pr_reg_abort_list,
				preempt_and_abort_list);
}

static void core_scsi3_release_preempt_and_abort(
	struct list_head *preempt_and_abort_list,
	struct t10_pr_registration *pr_reg_holder)
{
	struct t10_pr_registration *pr_reg, *pr_reg_tmp;

	list_for_each_entry_safe(pr_reg, pr_reg_tmp, preempt_and_abort_list,
				pr_reg_abort_list) {

		list_del(&pr_reg->pr_reg_abort_list);
		if (pr_reg_holder == pr_reg)
			continue;
		if (pr_reg->pr_res_holder) {
2784
			pr_warn("pr_reg->pr_res_holder still set\n");
2785 2786 2787 2788 2789 2790 2791 2792 2793
			continue;
		}

		pr_reg->pr_reg_deve = NULL;
		pr_reg->pr_reg_nacl = NULL;
		kmem_cache_free(t10_pr_reg_cache, pr_reg);
	}
}

2794 2795
static sense_reason_t
core_scsi3_pro_preempt(struct se_cmd *cmd, int type, int scope, u64 res_key,
2796
		u64 sa_res_key, enum preempt_type preempt_type)
2797
{
2798
	struct se_device *dev = cmd->se_dev;
2799
	struct se_node_acl *pr_reg_nacl;
2800
	struct se_session *se_sess = cmd->se_sess;
2801
	LIST_HEAD(preempt_and_abort_list);
2802
	struct t10_pr_registration *pr_reg, *pr_reg_tmp, *pr_reg_n, *pr_res_holder;
2803
	struct t10_reservation *pr_tmpl = &dev->t10_pr;
2804
	u32 pr_res_mapped_lun = 0;
2805 2806
	int all_reg = 0, calling_it_nexus = 0;
	bool sa_res_key_unmatched = sa_res_key != 0;
2807
	int prh_type = 0, prh_scope = 0;
2808

2809 2810
	if (!se_sess)
		return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
2811

2812
	pr_reg_n = core_scsi3_locate_pr_reg(cmd->se_dev, se_sess->se_node_acl,
2813
				se_sess);
2814 2815
	if (!pr_reg_n) {
		pr_err("SPC-3 PR: Unable to locate"
2816
			" PR_REGISTERED *pr_reg for PREEMPT%s\n",
2817
			(preempt_type == PREEMPT_AND_ABORT) ? "_AND_ABORT" : "");
2818
		return TCM_RESERVATION_CONFLICT;
2819 2820 2821
	}
	if (pr_reg_n->pr_res_key != res_key) {
		core_scsi3_put_pr_reg(pr_reg_n);
2822
		return TCM_RESERVATION_CONFLICT;
2823 2824
	}
	if (scope != PR_SCOPE_LU_SCOPE) {
2825
		pr_err("SPC-3 PR: Illegal SCOPE: 0x%02x\n", scope);
2826
		core_scsi3_put_pr_reg(pr_reg_n);
2827
		return TCM_INVALID_PARAMETER_LIST;
2828 2829 2830 2831 2832 2833 2834 2835 2836
	}

	spin_lock(&dev->dev_reservation_lock);
	pr_res_holder = dev->dev_pr_res_holder;
	if (pr_res_holder &&
	   ((pr_res_holder->pr_res_type == PR_TYPE_WRITE_EXCLUSIVE_ALLREG) ||
	    (pr_res_holder->pr_res_type == PR_TYPE_EXCLUSIVE_ACCESS_ALLREG)))
		all_reg = 1;

2837
	if (!all_reg && !sa_res_key) {
2838 2839
		spin_unlock(&dev->dev_reservation_lock);
		core_scsi3_put_pr_reg(pr_reg_n);
2840
		return TCM_INVALID_PARAMETER_LIST;
2841 2842 2843 2844 2845 2846 2847 2848 2849 2850
	}
	/*
	 * From spc4r17, section 5.7.11.4.4 Removing Registrations:
	 *
	 * If the SERVICE ACTION RESERVATION KEY field does not identify a
	 * persistent reservation holder or there is no persistent reservation
	 * holder (i.e., there is no persistent reservation), then the device
	 * server shall perform a preempt by doing the following in an
	 * uninterrupted series of actions. (See below..)
	 */
2851
	if (!pr_res_holder || (pr_res_holder->pr_res_key != sa_res_key)) {
2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877
		/*
		 * No existing or SA Reservation Key matching reservations..
		 *
		 * PROUT SA PREEMPT with All Registrant type reservations are
		 * allowed to be processed without a matching SA Reservation Key
		 */
		spin_lock(&pr_tmpl->registration_lock);
		list_for_each_entry_safe(pr_reg, pr_reg_tmp,
				&pr_tmpl->registration_list, pr_reg_list) {
			/*
			 * Removing of registrations in non all registrants
			 * type reservations without a matching SA reservation
			 * key.
			 *
			 * a) Remove the registrations for all I_T nexuses
			 *    specified by the SERVICE ACTION RESERVATION KEY
			 *    field;
			 * b) Ignore the contents of the SCOPE and TYPE fields;
			 * c) Process tasks as defined in 5.7.1; and
			 * d) Establish a unit attention condition for the
			 *    initiator port associated with every I_T nexus
			 *    that lost its registration other than the I_T
			 *    nexus on which the PERSISTENT RESERVE OUT command
			 *    was received, with the additional sense code set
			 *    to REGISTRATIONS PREEMPTED.
			 */
2878
			if (!all_reg) {
2879 2880
				if (pr_reg->pr_res_key != sa_res_key)
					continue;
2881
				sa_res_key_unmatched = false;
2882 2883 2884 2885 2886

				calling_it_nexus = (pr_reg_n == pr_reg) ? 1 : 0;
				pr_reg_nacl = pr_reg->pr_reg_nacl;
				pr_res_mapped_lun = pr_reg->pr_res_mapped_lun;
				__core_scsi3_free_registration(dev, pr_reg,
2887
					(preempt_type == PREEMPT_AND_ABORT) ? &preempt_and_abort_list :
2888 2889 2890 2891 2892 2893 2894 2895
						NULL, calling_it_nexus);
			} else {
				/*
				 * Case for any existing all registrants type
				 * reservation, follow logic in spc4r17 section
				 * 5.7.11.4 Preempting, Table 52 and Figure 7.
				 *
				 * For a ZERO SA Reservation key, release
2896
				 * all other registrations and do an implicit
2897 2898 2899 2900 2901 2902 2903 2904 2905
				 * release of active persistent reservation.
				 *
				 * For a non-ZERO SA Reservation key, only
				 * release the matching reservation key from
				 * registrations.
				 */
				if ((sa_res_key) &&
				     (pr_reg->pr_res_key != sa_res_key))
					continue;
2906
				sa_res_key_unmatched = false;
2907 2908 2909 2910 2911 2912 2913 2914

				calling_it_nexus = (pr_reg_n == pr_reg) ? 1 : 0;
				if (calling_it_nexus)
					continue;

				pr_reg_nacl = pr_reg->pr_reg_nacl;
				pr_res_mapped_lun = pr_reg->pr_res_mapped_lun;
				__core_scsi3_free_registration(dev, pr_reg,
2915
					(preempt_type == PREEMPT_AND_ABORT) ? &preempt_and_abort_list :
2916 2917
						NULL, 0);
			}
2918
			if (!calling_it_nexus)
2919 2920
				core_scsi3_ua_allocate(pr_reg_nacl,
					pr_res_mapped_lun, 0x2A,
2921
					ASCQ_2AH_REGISTRATIONS_PREEMPTED);
2922 2923 2924 2925 2926 2927 2928 2929 2930
		}
		spin_unlock(&pr_tmpl->registration_lock);
		/*
		 * If a PERSISTENT RESERVE OUT with a PREEMPT service action or
		 * a PREEMPT AND ABORT service action sets the SERVICE ACTION
		 * RESERVATION KEY field to a value that does not match any
		 * registered reservation key, then the device server shall
		 * complete the command with RESERVATION CONFLICT status.
		 */
2931
		if (sa_res_key_unmatched) {
2932 2933
			spin_unlock(&dev->dev_reservation_lock);
			core_scsi3_put_pr_reg(pr_reg_n);
2934
			return TCM_RESERVATION_CONFLICT;
2935 2936 2937 2938 2939 2940 2941 2942
		}
		/*
		 * For an existing all registrants type reservation
		 * with a zero SA rservation key, preempt the existing
		 * reservation with the new PR type and scope.
		 */
		if (pr_res_holder && all_reg && !(sa_res_key)) {
			__core_scsi3_complete_pro_preempt(dev, pr_reg_n,
2943 2944
				(preempt_type == PREEMPT_AND_ABORT) ? &preempt_and_abort_list : NULL,
				type, scope, preempt_type);
2945

2946
			if (preempt_type == PREEMPT_AND_ABORT)
2947 2948 2949 2950 2951
				core_scsi3_release_preempt_and_abort(
					&preempt_and_abort_list, pr_reg_n);
		}
		spin_unlock(&dev->dev_reservation_lock);

2952 2953
		if (pr_tmpl->pr_aptpl_active)
			core_scsi3_update_and_write_aptpl(cmd->se_dev, true);
2954 2955

		core_scsi3_put_pr_reg(pr_reg_n);
2956
		core_scsi3_pr_generation(cmd->se_dev);
2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990
		return 0;
	}
	/*
	 * The PREEMPTing SA reservation key matches that of the
	 * existing persistent reservation, first, we check if
	 * we are preempting our own reservation.
	 * From spc4r17, section 5.7.11.4.3 Preempting
	 * persistent reservations and registration handling
	 *
	 * If an all registrants persistent reservation is not
	 * present, it is not an error for the persistent
	 * reservation holder to preempt itself (i.e., a
	 * PERSISTENT RESERVE OUT with a PREEMPT service action
	 * or a PREEMPT AND ABORT service action with the
	 * SERVICE ACTION RESERVATION KEY value equal to the
	 * persistent reservation holder's reservation key that
	 * is received from the persistent reservation holder).
	 * In that case, the device server shall establish the
	 * new persistent reservation and maintain the
	 * registration.
	 */
	prh_type = pr_res_holder->pr_res_type;
	prh_scope = pr_res_holder->pr_res_scope;
	/*
	 * If the SERVICE ACTION RESERVATION KEY field identifies a
	 * persistent reservation holder (see 5.7.10), the device
	 * server shall perform a preempt by doing the following as
	 * an uninterrupted series of actions:
	 *
	 * a) Release the persistent reservation for the holder
	 *    identified by the SERVICE ACTION RESERVATION KEY field;
	 */
	if (pr_reg_n != pr_res_holder)
		__core_scsi3_complete_pro_release(dev,
2991 2992
						  pr_res_holder->pr_reg_nacl,
						  dev->dev_pr_res_holder, 0, 0);
2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016
	/*
	 * b) Remove the registrations for all I_T nexuses identified
	 *    by the SERVICE ACTION RESERVATION KEY field, except the
	 *    I_T nexus that is being used for the PERSISTENT RESERVE
	 *    OUT command. If an all registrants persistent reservation
	 *    is present and the SERVICE ACTION RESERVATION KEY field
	 *    is set to zero, then all registrations shall be removed
	 *    except for that of the I_T nexus that is being used for
	 *    the PERSISTENT RESERVE OUT command;
	 */
	spin_lock(&pr_tmpl->registration_lock);
	list_for_each_entry_safe(pr_reg, pr_reg_tmp,
			&pr_tmpl->registration_list, pr_reg_list) {

		calling_it_nexus = (pr_reg_n == pr_reg) ? 1 : 0;
		if (calling_it_nexus)
			continue;

		if (pr_reg->pr_res_key != sa_res_key)
			continue;

		pr_reg_nacl = pr_reg->pr_reg_nacl;
		pr_res_mapped_lun = pr_reg->pr_res_mapped_lun;
		__core_scsi3_free_registration(dev, pr_reg,
3017
				(preempt_type == PREEMPT_AND_ABORT) ? &preempt_and_abort_list : NULL,
3018 3019 3020 3021 3022 3023 3024 3025
				calling_it_nexus);
		/*
		 * e) Establish a unit attention condition for the initiator
		 *    port associated with every I_T nexus that lost its
		 *    persistent reservation and/or registration, with the
		 *    additional sense code set to REGISTRATIONS PREEMPTED;
		 */
		core_scsi3_ua_allocate(pr_reg_nacl, pr_res_mapped_lun, 0x2A,
3026
				ASCQ_2AH_REGISTRATIONS_PREEMPTED);
3027 3028 3029 3030 3031 3032 3033
	}
	spin_unlock(&pr_tmpl->registration_lock);
	/*
	 * c) Establish a persistent reservation for the preempting
	 *    I_T nexus using the contents of the SCOPE and TYPE fields;
	 */
	__core_scsi3_complete_pro_preempt(dev, pr_reg_n,
3034 3035
			(preempt_type == PREEMPT_AND_ABORT) ? &preempt_and_abort_list : NULL,
			type, scope, preempt_type);
3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074
	/*
	 * d) Process tasks as defined in 5.7.1;
	 * e) See above..
	 * f) If the type or scope has changed, then for every I_T nexus
	 *    whose reservation key was not removed, except for the I_T
	 *    nexus on which the PERSISTENT RESERVE OUT command was
	 *    received, the device server shall establish a unit
	 *    attention condition for the initiator port associated with
	 *    that I_T nexus, with the additional sense code set to
	 *    RESERVATIONS RELEASED. If the type or scope have not
	 *    changed, then no unit attention condition(s) shall be
	 *    established for this reason.
	 */
	if ((prh_type != type) || (prh_scope != scope)) {
		spin_lock(&pr_tmpl->registration_lock);
		list_for_each_entry_safe(pr_reg, pr_reg_tmp,
				&pr_tmpl->registration_list, pr_reg_list) {

			calling_it_nexus = (pr_reg_n == pr_reg) ? 1 : 0;
			if (calling_it_nexus)
				continue;

			core_scsi3_ua_allocate(pr_reg->pr_reg_nacl,
					pr_reg->pr_res_mapped_lun, 0x2A,
					ASCQ_2AH_RESERVATIONS_RELEASED);
		}
		spin_unlock(&pr_tmpl->registration_lock);
	}
	spin_unlock(&dev->dev_reservation_lock);
	/*
	 * Call LUN_RESET logic upon list of struct t10_pr_registration,
	 * All received CDBs for the matching existing reservation and
	 * registrations undergo ABORT_TASK logic.
	 *
	 * From there, core_scsi3_release_preempt_and_abort() will
	 * release every registration in the list (which have already
	 * been removed from the primary pr_reg list), except the
	 * new persistent reservation holder, the calling Initiator Port.
	 */
3075
	if (preempt_type == PREEMPT_AND_ABORT) {
3076 3077 3078 3079 3080
		core_tmr_lun_reset(dev, NULL, &preempt_and_abort_list, cmd);
		core_scsi3_release_preempt_and_abort(&preempt_and_abort_list,
						pr_reg_n);
	}

3081 3082
	if (pr_tmpl->pr_aptpl_active)
		core_scsi3_update_and_write_aptpl(cmd->se_dev, true);
3083 3084

	core_scsi3_put_pr_reg(pr_reg_n);
3085
	core_scsi3_pr_generation(cmd->se_dev);
3086 3087 3088
	return 0;
}

3089 3090
static sense_reason_t
core_scsi3_emulate_pro_preempt(struct se_cmd *cmd, int type, int scope,
3091
		u64 res_key, u64 sa_res_key, enum preempt_type preempt_type)
3092 3093 3094 3095 3096 3097 3098 3099
{
	switch (type) {
	case PR_TYPE_WRITE_EXCLUSIVE:
	case PR_TYPE_EXCLUSIVE_ACCESS:
	case PR_TYPE_WRITE_EXCLUSIVE_REGONLY:
	case PR_TYPE_EXCLUSIVE_ACCESS_REGONLY:
	case PR_TYPE_WRITE_EXCLUSIVE_ALLREG:
	case PR_TYPE_EXCLUSIVE_ACCESS_ALLREG:
3100
		return core_scsi3_pro_preempt(cmd, type, scope, res_key,
3101
					      sa_res_key, preempt_type);
3102
	default:
3103
		pr_err("SPC-3 PR: Unknown Service Action PREEMPT%s"
3104
			" Type: 0x%02x\n", (preempt_type == PREEMPT_AND_ABORT) ? "_AND_ABORT" : "", type);
3105
		return TCM_INVALID_CDB_FIELD;
3106 3107 3108 3109
	}
}


3110 3111 3112
static sense_reason_t
core_scsi3_emulate_pro_register_and_move(struct se_cmd *cmd, u64 res_key,
		u64 sa_res_key, int aptpl, int unreg)
3113
{
3114
	struct se_session *se_sess = cmd->se_sess;
3115
	struct se_device *dev = cmd->se_dev;
J
Jörn Engel 已提交
3116
	struct se_dev_entry *dest_se_deve = NULL;
3117
	struct se_lun *se_lun = cmd->se_lun, *tmp_lun;
3118 3119
	struct se_node_acl *pr_res_nacl, *pr_reg_nacl, *dest_node_acl = NULL;
	struct se_portal_group *se_tpg, *dest_se_tpg = NULL;
3120
	const struct target_core_fabric_ops *dest_tf_ops = NULL, *tf_ops;
3121
	struct t10_pr_registration *pr_reg, *pr_res_holder, *dest_pr_reg;
3122
	struct t10_reservation *pr_tmpl = &dev->t10_pr;
3123
	unsigned char *buf;
3124
	const unsigned char *initiator_str;
J
Julia Lawall 已提交
3125
	char *iport_ptr = NULL, i_buf[PR_REG_ISID_ID_LEN];
3126
	u32 tid_len, tmp_tid_len;
3127
	int new_reg = 0, type, scope, matching_iname;
3128
	sense_reason_t ret;
3129 3130 3131
	unsigned short rtpi;
	unsigned char proto_ident;

3132 3133
	if (!se_sess || !se_lun) {
		pr_err("SPC-3 PR: se_sess || struct se_lun is NULL!\n");
3134
		return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
3135
	}
3136

3137 3138
	memset(i_buf, 0, PR_REG_ISID_ID_LEN);
	se_tpg = se_sess->se_tpg;
3139
	tf_ops = se_tpg->se_tpg_tfo;
3140 3141 3142 3143 3144 3145
	/*
	 * Follow logic from spc4r17 Section 5.7.8, Table 50 --
	 *	Register behaviors for a REGISTER AND MOVE service action
	 *
	 * Locate the existing *pr_reg via struct se_node_acl pointers
	 */
3146
	pr_reg = core_scsi3_locate_pr_reg(cmd->se_dev, se_sess->se_node_acl,
3147
				se_sess);
3148 3149
	if (!pr_reg) {
		pr_err("SPC-3 PR: Unable to locate PR_REGISTERED"
3150
			" *pr_reg for REGISTER_AND_MOVE\n");
3151
		return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
3152 3153 3154 3155 3156 3157
	}
	/*
	 * The provided reservation key much match the existing reservation key
	 * provided during this initiator's I_T nexus registration.
	 */
	if (res_key != pr_reg->pr_res_key) {
3158
		pr_warn("SPC-3 PR REGISTER_AND_MOVE: Received"
3159 3160
			" res_key: 0x%016Lx does not match existing SA REGISTER"
			" res_key: 0x%016Lx\n", res_key, pr_reg->pr_res_key);
3161 3162
		ret = TCM_RESERVATION_CONFLICT;
		goto out_put_pr_reg;
3163 3164 3165 3166
	}
	/*
	 * The service active reservation key needs to be non zero
	 */
3167 3168
	if (!sa_res_key) {
		pr_warn("SPC-3 PR REGISTER_AND_MOVE: Received zero"
3169
			" sa_res_key\n");
3170 3171
		ret = TCM_INVALID_PARAMETER_LIST;
		goto out_put_pr_reg;
3172
	}
3173

3174 3175 3176 3177 3178
	/*
	 * Determine the Relative Target Port Identifier where the reservation
	 * will be moved to for the TransportID containing SCSI initiator WWN
	 * information.
	 */
3179
	buf = transport_kmap_data_sg(cmd);
3180 3181 3182 3183 3184
	if (!buf) {
		ret = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
		goto out_put_pr_reg;
	}

3185 3186 3187 3188 3189 3190
	rtpi = (buf[18] & 0xff) << 8;
	rtpi |= buf[19] & 0xff;
	tid_len = (buf[20] & 0xff) << 24;
	tid_len |= (buf[21] & 0xff) << 16;
	tid_len |= (buf[22] & 0xff) << 8;
	tid_len |= buf[23] & 0xff;
3191
	transport_kunmap_data_sg(cmd);
3192
	buf = NULL;
3193 3194

	if ((tid_len + 24) != cmd->data_length) {
3195
		pr_err("SPC-3 PR: Illegal tid_len: %u + 24 byte header"
3196 3197
			" does not equal CDB data_length: %u\n", tid_len,
			cmd->data_length);
3198 3199
		ret = TCM_INVALID_PARAMETER_LIST;
		goto out_put_pr_reg;
3200 3201 3202
	}

	spin_lock(&dev->se_port_lock);
3203 3204
	list_for_each_entry(tmp_lun, &dev->dev_sep_list, lun_dev_link) {
		if (tmp_lun->lun_rtpi != rtpi)
3205
			continue;
3206
		dest_se_tpg = tmp_lun->lun_tpg;
3207
		dest_tf_ops = dest_se_tpg->se_tpg_tfo;
3208
		if (!dest_tf_ops)
3209 3210
			continue;

3211
		atomic_inc_mb(&dest_se_tpg->tpg_pr_ref_count);
3212 3213
		spin_unlock(&dev->se_port_lock);

3214
		if (core_scsi3_tpg_depend_item(dest_se_tpg)) {
3215
			pr_err("core_scsi3_tpg_depend_item() failed"
3216
				" for dest_se_tpg\n");
3217
			atomic_dec_mb(&dest_se_tpg->tpg_pr_ref_count);
3218 3219
			ret = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
			goto out_put_pr_reg;
3220 3221 3222 3223 3224 3225 3226
		}

		spin_lock(&dev->se_port_lock);
		break;
	}
	spin_unlock(&dev->se_port_lock);

3227 3228
	if (!dest_se_tpg || !dest_tf_ops) {
		pr_err("SPC-3 PR REGISTER_AND_MOVE: Unable to locate"
3229 3230
			" fabric ops from Relative Target Port Identifier:"
			" %hu\n", rtpi);
3231 3232
		ret = TCM_INVALID_PARAMETER_LIST;
		goto out_put_pr_reg;
3233
	}
3234

3235
	buf = transport_kmap_data_sg(cmd);
3236 3237 3238 3239
	if (!buf) {
		ret = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
		goto out_put_pr_reg;
	}
3240
	proto_ident = (buf[24] & 0x0f);
3241

3242
	pr_debug("SPC-3 PR REGISTER_AND_MOVE: Extracted Protocol Identifier:"
3243
			" 0x%02x\n", proto_ident);
3244

3245
	if (proto_ident != dest_se_tpg->proto_id) {
3246
		pr_err("SPC-3 PR REGISTER_AND_MOVE: Received"
3247 3248
			" proto_ident: 0x%02x does not match ident: 0x%02x"
			" from fabric: %s\n", proto_ident,
3249
			dest_se_tpg->proto_id,
3250
			dest_tf_ops->get_fabric_name());
3251
		ret = TCM_INVALID_PARAMETER_LIST;
3252 3253
		goto out;
	}
3254
	initiator_str = target_parse_pr_out_transport_id(dest_se_tpg,
3255
			(const char *)&buf[24], &tmp_tid_len, &iport_ptr);
3256 3257
	if (!initiator_str) {
		pr_err("SPC-3 PR REGISTER_AND_MOVE: Unable to locate"
3258
			" initiator_str from Transport ID\n");
3259
		ret = TCM_INVALID_PARAMETER_LIST;
3260 3261 3262
		goto out;
	}

3263
	transport_kunmap_data_sg(cmd);
3264 3265
	buf = NULL;

3266
	pr_debug("SPC-3 PR [%s] Extracted initiator %s identifier: %s"
3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280
		" %s\n", dest_tf_ops->get_fabric_name(), (iport_ptr != NULL) ?
		"port" : "device", initiator_str, (iport_ptr != NULL) ?
		iport_ptr : "");
	/*
	 * If a PERSISTENT RESERVE OUT command with a REGISTER AND MOVE service
	 * action specifies a TransportID that is the same as the initiator port
	 * of the I_T nexus for the command received, then the command shall
	 * be terminated with CHECK CONDITION status, with the sense key set to
	 * ILLEGAL REQUEST, and the additional sense code set to INVALID FIELD
	 * IN PARAMETER LIST.
	 */
	pr_reg_nacl = pr_reg->pr_reg_nacl;
	matching_iname = (!strcmp(initiator_str,
				  pr_reg_nacl->initiatorname)) ? 1 : 0;
3281
	if (!matching_iname)
3282 3283
		goto after_iport_check;

3284 3285
	if (!iport_ptr || !pr_reg->isid_present_at_reg) {
		pr_err("SPC-3 PR REGISTER_AND_MOVE: TransportID: %s"
3286 3287
			" matches: %s on received I_T Nexus\n", initiator_str,
			pr_reg_nacl->initiatorname);
3288
		ret = TCM_INVALID_PARAMETER_LIST;
3289 3290
		goto out;
	}
3291 3292
	if (!strcmp(iport_ptr, pr_reg->pr_reg_isid)) {
		pr_err("SPC-3 PR REGISTER_AND_MOVE: TransportID: %s %s"
3293 3294 3295
			" matches: %s %s on received I_T Nexus\n",
			initiator_str, iport_ptr, pr_reg_nacl->initiatorname,
			pr_reg->pr_reg_isid);
3296
		ret = TCM_INVALID_PARAMETER_LIST;
3297 3298 3299 3300 3301 3302
		goto out;
	}
after_iport_check:
	/*
	 * Locate the destination struct se_node_acl from the received Transport ID
	 */
3303
	mutex_lock(&dest_se_tpg->acl_node_mutex);
3304 3305
	dest_node_acl = __core_tpg_get_initiator_node_acl(dest_se_tpg,
				initiator_str);
3306 3307
	if (dest_node_acl)
		atomic_inc_mb(&dest_node_acl->acl_pr_ref_count);
3308
	mutex_unlock(&dest_se_tpg->acl_node_mutex);
3309

3310 3311
	if (!dest_node_acl) {
		pr_err("Unable to locate %s dest_node_acl for"
3312 3313
			" TransportID%s\n", dest_tf_ops->get_fabric_name(),
			initiator_str);
3314
		ret = TCM_INVALID_PARAMETER_LIST;
3315 3316
		goto out;
	}
3317 3318

	if (core_scsi3_nodeacl_depend_item(dest_node_acl)) {
3319
		pr_err("core_scsi3_nodeacl_depend_item() for"
3320
			" dest_node_acl\n");
3321
		atomic_dec_mb(&dest_node_acl->acl_pr_ref_count);
3322
		dest_node_acl = NULL;
3323
		ret = TCM_INVALID_PARAMETER_LIST;
3324 3325
		goto out;
	}
3326

3327
	pr_debug("SPC-3 PR REGISTER_AND_MOVE: Found %s dest_node_acl:"
3328 3329
		" %s from TransportID\n", dest_tf_ops->get_fabric_name(),
		dest_node_acl->initiatorname);
3330

3331 3332 3333 3334 3335
	/*
	 * Locate the struct se_dev_entry pointer for the matching RELATIVE TARGET
	 * PORT IDENTIFIER.
	 */
	dest_se_deve = core_get_se_deve_from_rtpi(dest_node_acl, rtpi);
3336 3337
	if (!dest_se_deve) {
		pr_err("Unable to locate %s dest_se_deve from RTPI:"
3338
			" %hu\n",  dest_tf_ops->get_fabric_name(), rtpi);
3339
		ret = TCM_INVALID_PARAMETER_LIST;
3340 3341 3342
		goto out;
	}

3343
	if (core_scsi3_lunacl_depend_item(dest_se_deve)) {
3344
		pr_err("core_scsi3_lunacl_depend_item() failed\n");
3345
		kref_put(&dest_se_deve->pr_kref, target_pr_kref_release);
3346
		dest_se_deve = NULL;
3347
		ret = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
3348 3349
		goto out;
	}
3350

3351
	pr_debug("SPC-3 PR REGISTER_AND_MOVE: Located %s node %s LUN"
3352 3353 3354
		" ACL for dest_se_deve->mapped_lun: %u\n",
		dest_tf_ops->get_fabric_name(), dest_node_acl->initiatorname,
		dest_se_deve->mapped_lun);
3355

3356 3357 3358 3359 3360 3361
	/*
	 * A persistent reservation needs to already existing in order to
	 * successfully complete the REGISTER_AND_MOVE service action..
	 */
	spin_lock(&dev->dev_reservation_lock);
	pr_res_holder = dev->dev_pr_res_holder;
3362 3363
	if (!pr_res_holder) {
		pr_warn("SPC-3 PR REGISTER_AND_MOVE: No reservation"
3364 3365
			" currently held\n");
		spin_unlock(&dev->dev_reservation_lock);
3366
		ret = TCM_INVALID_CDB_FIELD;
3367 3368 3369 3370 3371 3372 3373 3374
		goto out;
	}
	/*
	 * The received on I_T Nexus must be the reservation holder.
	 *
	 * From spc4r17 section 5.7.8  Table 50 --
	 * 	Register behaviors for a REGISTER AND MOVE service action
	 */
3375
	if (!is_reservation_holder(pr_res_holder, pr_reg)) {
3376
		pr_warn("SPC-3 PR REGISTER_AND_MOVE: Calling I_T"
3377 3378
			" Nexus is not reservation holder\n");
		spin_unlock(&dev->dev_reservation_lock);
3379
		ret = TCM_RESERVATION_CONFLICT;
3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392
		goto out;
	}
	/*
	 * From spc4r17 section 5.7.8: registering and moving reservation
	 *
	 * If a PERSISTENT RESERVE OUT command with a REGISTER AND MOVE service
	 * action is received and the established persistent reservation is a
	 * Write Exclusive - All Registrants type or Exclusive Access -
	 * All Registrants type reservation, then the command shall be completed
	 * with RESERVATION CONFLICT status.
	 */
	if ((pr_res_holder->pr_res_type == PR_TYPE_WRITE_EXCLUSIVE_ALLREG) ||
	    (pr_res_holder->pr_res_type == PR_TYPE_EXCLUSIVE_ACCESS_ALLREG)) {
3393
		pr_warn("SPC-3 PR REGISTER_AND_MOVE: Unable to move"
3394 3395 3396
			" reservation for type: %s\n",
			core_scsi3_pr_dump_type(pr_res_holder->pr_res_type));
		spin_unlock(&dev->dev_reservation_lock);
3397
		ret = TCM_RESERVATION_CONFLICT;
3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427
		goto out;
	}
	pr_res_nacl = pr_res_holder->pr_reg_nacl;
	/*
	 * b) Ignore the contents of the (received) SCOPE and TYPE fields;
	 */
	type = pr_res_holder->pr_res_type;
	scope = pr_res_holder->pr_res_type;
	/*
	 * c) Associate the reservation key specified in the SERVICE ACTION
	 *    RESERVATION KEY field with the I_T nexus specified as the
	 *    destination of the register and move, where:
	 *    A) The I_T nexus is specified by the TransportID and the
	 *	 RELATIVE TARGET PORT IDENTIFIER field (see 6.14.4); and
	 *    B) Regardless of the TransportID format used, the association for
	 *       the initiator port is based on either the initiator port name
	 *       (see 3.1.71) on SCSI transport protocols where port names are
	 *       required or the initiator port identifier (see 3.1.70) on SCSI
	 *       transport protocols where port names are not required;
	 * d) Register the reservation key specified in the SERVICE ACTION
	 *    RESERVATION KEY field;
	 * e) Retain the reservation key specified in the SERVICE ACTION
	 *    RESERVATION KEY field and associated information;
	 *
	 * Also, It is not an error for a REGISTER AND MOVE service action to
	 * register an I_T nexus that is already registered with the same
	 * reservation key or a different reservation key.
	 */
	dest_pr_reg = __core_scsi3_locate_pr_reg(dev, dest_node_acl,
					iport_ptr);
3428
	if (!dest_pr_reg) {
3429 3430 3431
		struct se_lun *dest_lun = rcu_dereference_check(dest_se_deve->se_lun,
				atomic_read(&dest_se_deve->pr_kref.refcount) != 0);

3432
		spin_unlock(&dev->dev_reservation_lock);
3433 3434 3435
		if (core_scsi3_alloc_registration(cmd->se_dev, dest_node_acl,
					dest_lun, dest_se_deve, dest_se_deve->mapped_lun,
					iport_ptr, sa_res_key, 0, aptpl, 2, 1)) {
3436
			ret = TCM_INVALID_PARAMETER_LIST;
3437 3438
			goto out;
		}
3439
		spin_lock(&dev->dev_reservation_lock);
3440 3441 3442 3443 3444 3445 3446 3447 3448
		dest_pr_reg = __core_scsi3_locate_pr_reg(dev, dest_node_acl,
						iport_ptr);
		new_reg = 1;
	}
	/*
	 * f) Release the persistent reservation for the persistent reservation
	 *    holder (i.e., the I_T nexus on which the
	 */
	__core_scsi3_complete_pro_release(dev, pr_res_nacl,
3449
					  dev->dev_pr_res_holder, 0, 0);
3450 3451 3452 3453 3454 3455 3456 3457 3458
	/*
	 * g) Move the persistent reservation to the specified I_T nexus using
	 *    the same scope and type as the persistent reservation released in
	 *    item f); and
	 */
	dev->dev_pr_res_holder = dest_pr_reg;
	dest_pr_reg->pr_res_holder = 1;
	dest_pr_reg->pr_res_type = type;
	pr_reg->pr_res_scope = scope;
3459
	core_pr_dump_initiator_port(pr_reg, i_buf, PR_REG_ISID_ID_LEN);
3460 3461 3462
	/*
	 * Increment PRGeneration for existing registrations..
	 */
3463
	if (!new_reg)
3464 3465 3466
		dest_pr_reg->pr_res_generation = pr_tmpl->pr_generation++;
	spin_unlock(&dev->dev_reservation_lock);

3467
	pr_debug("SPC-3 PR [%s] Service Action: REGISTER_AND_MOVE"
3468 3469 3470 3471
		" created new reservation holder TYPE: %s on object RTPI:"
		" %hu  PRGeneration: 0x%08x\n", dest_tf_ops->get_fabric_name(),
		core_scsi3_pr_dump_type(type), rtpi,
		dest_pr_reg->pr_res_generation);
3472
	pr_debug("SPC-3 PR Successfully moved reservation from"
3473 3474
		" %s Fabric Node: %s%s -> %s Fabric Node: %s %s\n",
		tf_ops->get_fabric_name(), pr_reg_nacl->initiatorname,
3475
		i_buf, dest_tf_ops->get_fabric_name(),
3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495
		dest_node_acl->initiatorname, (iport_ptr != NULL) ?
		iport_ptr : "");
	/*
	 * It is now safe to release configfs group dependencies for destination
	 * of Transport ID Initiator Device/Port Identifier
	 */
	core_scsi3_lunacl_undepend_item(dest_se_deve);
	core_scsi3_nodeacl_undepend_item(dest_node_acl);
	core_scsi3_tpg_undepend_item(dest_se_tpg);
	/*
	 * h) If the UNREG bit is set to one, unregister (see 5.7.11.3) the I_T
	 * nexus on which PERSISTENT RESERVE OUT command was received.
	 */
	if (unreg) {
		spin_lock(&pr_tmpl->registration_lock);
		__core_scsi3_free_registration(dev, pr_reg, NULL, 1);
		spin_unlock(&pr_tmpl->registration_lock);
	} else
		core_scsi3_put_pr_reg(pr_reg);

3496
	core_scsi3_update_and_write_aptpl(cmd->se_dev, aptpl);
3497

3498
	transport_kunmap_data_sg(cmd);
3499

3500 3501 3502
	core_scsi3_put_pr_reg(dest_pr_reg);
	return 0;
out:
3503
	if (buf)
3504
		transport_kunmap_data_sg(cmd);
3505 3506 3507 3508 3509
	if (dest_se_deve)
		core_scsi3_lunacl_undepend_item(dest_se_deve);
	if (dest_node_acl)
		core_scsi3_nodeacl_undepend_item(dest_node_acl);
	core_scsi3_tpg_undepend_item(dest_se_tpg);
3510 3511

out_put_pr_reg:
3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528
	core_scsi3_put_pr_reg(pr_reg);
	return ret;
}

static unsigned long long core_scsi3_extract_reservation_key(unsigned char *cdb)
{
	unsigned int __v1, __v2;

	__v1 = (cdb[0] << 24) | (cdb[1] << 16) | (cdb[2] << 8) | cdb[3];
	__v2 = (cdb[4] << 24) | (cdb[5] << 16) | (cdb[6] << 8) | cdb[7];

	return ((unsigned long long)__v2) | (unsigned long long)__v1 << 32;
}

/*
 * See spc4r17 section 6.14 Table 170
 */
3529 3530
sense_reason_t
target_scsi3_emulate_pr_out(struct se_cmd *cmd)
3531
{
3532
	struct se_device *dev = cmd->se_dev;
3533
	unsigned char *cdb = &cmd->t_task_cdb[0];
3534
	unsigned char *buf;
3535 3536 3537
	u64 res_key, sa_res_key;
	int sa, scope, type, aptpl;
	int spec_i_pt = 0, all_tg_pt = 0, unreg = 0;
3538
	sense_reason_t ret;
3539 3540 3541 3542 3543 3544 3545 3546 3547 3548

	/*
	 * Following spc2r20 5.5.1 Reservations overview:
	 *
	 * If a logical unit has been reserved by any RESERVE command and is
	 * still reserved by any initiator, all PERSISTENT RESERVE IN and all
	 * PERSISTENT RESERVE OUT commands shall conflict regardless of
	 * initiator or service action and shall terminate with a RESERVATION
	 * CONFLICT status.
	 */
3549
	if (cmd->se_dev->dev_reservation_flags & DRF_SPC2_RESERVATIONS) {
3550 3551 3552
		pr_err("Received PERSISTENT_RESERVE CDB while legacy"
			" SPC-2 reservation is held, returning"
			" RESERVATION_CONFLICT\n");
3553
		return TCM_RESERVATION_CONFLICT;
3554 3555
	}

3556 3557 3558 3559
	/*
	 * FIXME: A NULL struct se_session pointer means an this is not coming from
	 * a $FABRIC_MOD's nexus, but from internal passthrough ops.
	 */
3560 3561
	if (!cmd->se_sess)
		return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
3562 3563

	if (cmd->data_length < 24) {
3564
		pr_warn("SPC-PR: Received PR OUT parameter list"
3565
			" length too small: %u\n", cmd->data_length);
3566
		return TCM_INVALID_PARAMETER_LIST;
3567
	}
3568

3569 3570 3571 3572 3573 3574
	/*
	 * From the PERSISTENT_RESERVE_OUT command descriptor block (CDB)
	 */
	sa = (cdb[1] & 0x1f);
	scope = (cdb[2] & 0xf0);
	type = (cdb[2] & 0x0f);
3575

3576
	buf = transport_kmap_data_sg(cmd);
3577 3578 3579
	if (!buf)
		return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;

3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596
	/*
	 * From PERSISTENT_RESERVE_OUT parameter list (payload)
	 */
	res_key = core_scsi3_extract_reservation_key(&buf[0]);
	sa_res_key = core_scsi3_extract_reservation_key(&buf[8]);
	/*
	 * REGISTER_AND_MOVE uses a different SA parameter list containing
	 * SCSI TransportIDs.
	 */
	if (sa != PRO_REGISTER_AND_MOVE) {
		spec_i_pt = (buf[20] & 0x08);
		all_tg_pt = (buf[20] & 0x04);
		aptpl = (buf[20] & 0x01);
	} else {
		aptpl = (buf[17] & 0x01);
		unreg = (buf[17] & 0x02);
	}
3597 3598 3599 3600 3601 3602 3603
	/*
	 * If the backend device has been configured to force APTPL metadata
	 * write-out, go ahead and propigate aptpl=1 down now.
	 */
	if (dev->dev_attrib.force_pr_aptpl)
		aptpl = 1;

3604
	transport_kunmap_data_sg(cmd);
3605 3606
	buf = NULL;

3607 3608 3609
	/*
	 * SPEC_I_PT=1 is only valid for Service action: REGISTER
	 */
3610 3611
	if (spec_i_pt && ((cdb[1] & 0x1f) != PRO_REGISTER))
		return TCM_INVALID_PARAMETER_LIST;
3612

3613 3614 3615 3616 3617 3618 3619 3620 3621
	/*
	 * From spc4r17 section 6.14:
	 *
	 * If the SPEC_I_PT bit is set to zero, the service action is not
	 * REGISTER AND MOVE, and the parameter list length is not 24, then
	 * the command shall be terminated with CHECK CONDITION status, with
	 * the sense key set to ILLEGAL REQUEST, and the additional sense
	 * code set to PARAMETER LIST LENGTH ERROR.
	 */
3622
	if (!spec_i_pt && ((cdb[1] & 0x1f) != PRO_REGISTER_AND_MOVE) &&
3623
	    (cmd->data_length != 24)) {
3624
		pr_warn("SPC-PR: Received PR OUT illegal parameter"
3625
			" list length: %u\n", cmd->data_length);
3626
		return TCM_INVALID_PARAMETER_LIST;
3627
	}
3628

3629 3630 3631 3632 3633 3634 3635
	/*
	 * (core_scsi3_emulate_pro_* function parameters
	 * are defined by spc4r17 Table 174:
	 * PERSISTENT_RESERVE_OUT service actions and valid parameters.
	 */
	switch (sa) {
	case PRO_REGISTER:
3636
		ret = core_scsi3_emulate_pro_register(cmd,
3637
			res_key, sa_res_key, aptpl, all_tg_pt, spec_i_pt, REGISTER);
3638
		break;
3639
	case PRO_RESERVE:
3640 3641
		ret = core_scsi3_emulate_pro_reserve(cmd, type, scope, res_key);
		break;
3642
	case PRO_RELEASE:
3643 3644
		ret = core_scsi3_emulate_pro_release(cmd, type, scope, res_key);
		break;
3645
	case PRO_CLEAR:
3646 3647
		ret = core_scsi3_emulate_pro_clear(cmd, res_key);
		break;
3648
	case PRO_PREEMPT:
3649
		ret = core_scsi3_emulate_pro_preempt(cmd, type, scope,
3650
					res_key, sa_res_key, PREEMPT);
3651
		break;
3652
	case PRO_PREEMPT_AND_ABORT:
3653
		ret = core_scsi3_emulate_pro_preempt(cmd, type, scope,
3654
					res_key, sa_res_key, PREEMPT_AND_ABORT);
3655
		break;
3656
	case PRO_REGISTER_AND_IGNORE_EXISTING_KEY:
3657
		ret = core_scsi3_emulate_pro_register(cmd,
3658
			0, sa_res_key, aptpl, all_tg_pt, spec_i_pt, REGISTER_AND_IGNORE_EXISTING_KEY);
3659
		break;
3660
	case PRO_REGISTER_AND_MOVE:
3661
		ret = core_scsi3_emulate_pro_register_and_move(cmd, res_key,
3662
				sa_res_key, aptpl, unreg);
3663
		break;
3664
	default:
3665
		pr_err("Unknown PERSISTENT_RESERVE_OUT service"
3666
			" action: 0x%02x\n", cdb[1] & 0x1f);
3667
		return TCM_INVALID_CDB_FIELD;
3668 3669
	}

3670 3671
	if (!ret)
		target_complete_cmd(cmd, GOOD);
3672
	return ret;
3673 3674 3675 3676 3677 3678 3679
}

/*
 * PERSISTENT_RESERVE_IN Service Action READ_KEYS
 *
 * See spc4r17 section 5.7.6.2 and section 6.13.2, Table 160
 */
3680 3681
static sense_reason_t
core_scsi3_pri_read_keys(struct se_cmd *cmd)
3682
{
3683
	struct se_device *dev = cmd->se_dev;
3684
	struct t10_pr_registration *pr_reg;
3685
	unsigned char *buf;
3686 3687 3688
	u32 add_len = 0, off = 8;

	if (cmd->data_length < 8) {
3689
		pr_err("PRIN SA READ_KEYS SCSI Data Length: %u"
3690
			" too small\n", cmd->data_length);
3691
		return TCM_INVALID_CDB_FIELD;
3692 3693
	}

3694
	buf = transport_kmap_data_sg(cmd);
3695 3696 3697
	if (!buf)
		return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;

3698 3699 3700 3701
	buf[0] = ((dev->t10_pr.pr_generation >> 24) & 0xff);
	buf[1] = ((dev->t10_pr.pr_generation >> 16) & 0xff);
	buf[2] = ((dev->t10_pr.pr_generation >> 8) & 0xff);
	buf[3] = (dev->t10_pr.pr_generation & 0xff);
3702

3703 3704
	spin_lock(&dev->t10_pr.registration_lock);
	list_for_each_entry(pr_reg, &dev->t10_pr.registration_list,
3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723
			pr_reg_list) {
		/*
		 * Check for overflow of 8byte PRI READ_KEYS payload and
		 * next reservation key list descriptor.
		 */
		if ((add_len + 8) > (cmd->data_length - 8))
			break;

		buf[off++] = ((pr_reg->pr_res_key >> 56) & 0xff);
		buf[off++] = ((pr_reg->pr_res_key >> 48) & 0xff);
		buf[off++] = ((pr_reg->pr_res_key >> 40) & 0xff);
		buf[off++] = ((pr_reg->pr_res_key >> 32) & 0xff);
		buf[off++] = ((pr_reg->pr_res_key >> 24) & 0xff);
		buf[off++] = ((pr_reg->pr_res_key >> 16) & 0xff);
		buf[off++] = ((pr_reg->pr_res_key >> 8) & 0xff);
		buf[off++] = (pr_reg->pr_res_key & 0xff);

		add_len += 8;
	}
3724
	spin_unlock(&dev->t10_pr.registration_lock);
3725 3726 3727 3728 3729 3730

	buf[4] = ((add_len >> 24) & 0xff);
	buf[5] = ((add_len >> 16) & 0xff);
	buf[6] = ((add_len >> 8) & 0xff);
	buf[7] = (add_len & 0xff);

3731
	transport_kunmap_data_sg(cmd);
3732

3733 3734 3735 3736 3737 3738 3739 3740
	return 0;
}

/*
 * PERSISTENT_RESERVE_IN Service Action READ_RESERVATION
 *
 * See spc4r17 section 5.7.6.3 and section 6.13.3.2 Table 161 and 162
 */
3741 3742
static sense_reason_t
core_scsi3_pri_read_reservation(struct se_cmd *cmd)
3743
{
3744
	struct se_device *dev = cmd->se_dev;
3745
	struct t10_pr_registration *pr_reg;
3746
	unsigned char *buf;
3747 3748 3749 3750
	u64 pr_res_key;
	u32 add_len = 16; /* Hardcoded to 16 when a reservation is held. */

	if (cmd->data_length < 8) {
3751
		pr_err("PRIN SA READ_RESERVATIONS SCSI Data Length: %u"
3752
			" too small\n", cmd->data_length);
3753
		return TCM_INVALID_CDB_FIELD;
3754 3755
	}

3756
	buf = transport_kmap_data_sg(cmd);
3757 3758 3759
	if (!buf)
		return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;

3760 3761 3762 3763
	buf[0] = ((dev->t10_pr.pr_generation >> 24) & 0xff);
	buf[1] = ((dev->t10_pr.pr_generation >> 16) & 0xff);
	buf[2] = ((dev->t10_pr.pr_generation >> 8) & 0xff);
	buf[3] = (dev->t10_pr.pr_generation & 0xff);
3764

3765 3766
	spin_lock(&dev->dev_reservation_lock);
	pr_reg = dev->dev_pr_res_holder;
3767
	if (pr_reg) {
3768 3769 3770 3771 3772 3773 3774 3775
		/*
		 * Set the hardcoded Additional Length
		 */
		buf[4] = ((add_len >> 24) & 0xff);
		buf[5] = ((add_len >> 16) & 0xff);
		buf[6] = ((add_len >> 8) & 0xff);
		buf[7] = (add_len & 0xff);

3776 3777 3778
		if (cmd->data_length < 22)
			goto err;

3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814
		/*
		 * Set the Reservation key.
		 *
		 * From spc4r17, section 5.7.10:
		 * A persistent reservation holder has its reservation key
		 * returned in the parameter data from a PERSISTENT
		 * RESERVE IN command with READ RESERVATION service action as
		 * follows:
		 * a) For a persistent reservation of the type Write Exclusive
		 *    - All Registrants or Exclusive Access ­ All Regitrants,
		 *      the reservation key shall be set to zero; or
		 * b) For all other persistent reservation types, the
		 *    reservation key shall be set to the registered
		 *    reservation key for the I_T nexus that holds the
		 *    persistent reservation.
		 */
		if ((pr_reg->pr_res_type == PR_TYPE_WRITE_EXCLUSIVE_ALLREG) ||
		    (pr_reg->pr_res_type == PR_TYPE_EXCLUSIVE_ACCESS_ALLREG))
			pr_res_key = 0;
		else
			pr_res_key = pr_reg->pr_res_key;

		buf[8] = ((pr_res_key >> 56) & 0xff);
		buf[9] = ((pr_res_key >> 48) & 0xff);
		buf[10] = ((pr_res_key >> 40) & 0xff);
		buf[11] = ((pr_res_key >> 32) & 0xff);
		buf[12] = ((pr_res_key >> 24) & 0xff);
		buf[13] = ((pr_res_key >> 16) & 0xff);
		buf[14] = ((pr_res_key >> 8) & 0xff);
		buf[15] = (pr_res_key & 0xff);
		/*
		 * Set the SCOPE and TYPE
		 */
		buf[21] = (pr_reg->pr_res_scope & 0xf0) |
			  (pr_reg->pr_res_type & 0x0f);
	}
3815 3816

err:
3817
	spin_unlock(&dev->dev_reservation_lock);
3818
	transport_kunmap_data_sg(cmd);
3819 3820 3821 3822 3823 3824 3825 3826 3827

	return 0;
}

/*
 * PERSISTENT_RESERVE_IN Service Action REPORT_CAPABILITIES
 *
 * See spc4r17 section 6.13.4 Table 165
 */
3828 3829
static sense_reason_t
core_scsi3_pri_report_capabilities(struct se_cmd *cmd)
3830
{
3831
	struct se_device *dev = cmd->se_dev;
3832
	struct t10_reservation *pr_tmpl = &dev->t10_pr;
3833
	unsigned char *buf;
3834 3835 3836
	u16 add_len = 8; /* Hardcoded to 8. */

	if (cmd->data_length < 6) {
3837
		pr_err("PRIN SA REPORT_CAPABILITIES SCSI Data Length:"
3838
			" %u too small\n", cmd->data_length);
3839
		return TCM_INVALID_CDB_FIELD;
3840 3841
	}

3842
	buf = transport_kmap_data_sg(cmd);
3843 3844
	if (!buf)
		return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
3845

3846
	buf[0] = ((add_len >> 8) & 0xff);
3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875
	buf[1] = (add_len & 0xff);
	buf[2] |= 0x10; /* CRH: Compatible Reservation Hanlding bit. */
	buf[2] |= 0x08; /* SIP_C: Specify Initiator Ports Capable bit */
	buf[2] |= 0x04; /* ATP_C: All Target Ports Capable bit */
	buf[2] |= 0x01; /* PTPL_C: Persistence across Target Power Loss bit */
	/*
	 * We are filling in the PERSISTENT RESERVATION TYPE MASK below, so
	 * set the TMV: Task Mask Valid bit.
	 */
	buf[3] |= 0x80;
	/*
	 * Change ALLOW COMMANDs to 0x20 or 0x40 later from Table 166
	 */
	buf[3] |= 0x10; /* ALLOW COMMANDs field 001b */
	/*
	 * PTPL_A: Persistence across Target Power Loss Active bit
	 */
	if (pr_tmpl->pr_aptpl_active)
		buf[3] |= 0x01;
	/*
	 * Setup the PERSISTENT RESERVATION TYPE MASK from Table 167
	 */
	buf[4] |= 0x80; /* PR_TYPE_EXCLUSIVE_ACCESS_ALLREG */
	buf[4] |= 0x40; /* PR_TYPE_EXCLUSIVE_ACCESS_REGONLY */
	buf[4] |= 0x20; /* PR_TYPE_WRITE_EXCLUSIVE_REGONLY */
	buf[4] |= 0x08; /* PR_TYPE_EXCLUSIVE_ACCESS */
	buf[4] |= 0x02; /* PR_TYPE_WRITE_EXCLUSIVE */
	buf[5] |= 0x01; /* PR_TYPE_EXCLUSIVE_ACCESS_ALLREG */

3876
	transport_kunmap_data_sg(cmd);
3877

3878 3879 3880 3881 3882 3883 3884 3885
	return 0;
}

/*
 * PERSISTENT_RESERVE_IN Service Action READ_FULL_STATUS
 *
 * See spc4r17 section 6.13.5 Table 168 and 169
 */
3886 3887
static sense_reason_t
core_scsi3_pri_read_full_status(struct se_cmd *cmd)
3888
{
3889
	struct se_device *dev = cmd->se_dev;
3890 3891 3892
	struct se_node_acl *se_nacl;
	struct se_portal_group *se_tpg;
	struct t10_pr_registration *pr_reg, *pr_reg_tmp;
3893
	struct t10_reservation *pr_tmpl = &dev->t10_pr;
3894
	unsigned char *buf;
3895
	u32 add_desc_len = 0, add_len = 0;
3896
	u32 off = 8; /* off into first Full Status descriptor */
3897
	int format_code = 0, pr_res_type = 0, pr_res_scope = 0;
3898
	int exp_desc_len, desc_len;
3899
	bool all_reg = false;
3900 3901

	if (cmd->data_length < 8) {
3902
		pr_err("PRIN SA READ_FULL_STATUS SCSI Data Length: %u"
3903
			" too small\n", cmd->data_length);
3904
		return TCM_INVALID_CDB_FIELD;
3905 3906
	}

3907
	buf = transport_kmap_data_sg(cmd);
3908 3909
	if (!buf)
		return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
3910

3911 3912 3913 3914
	buf[0] = ((dev->t10_pr.pr_generation >> 24) & 0xff);
	buf[1] = ((dev->t10_pr.pr_generation >> 16) & 0xff);
	buf[2] = ((dev->t10_pr.pr_generation >> 8) & 0xff);
	buf[3] = (dev->t10_pr.pr_generation & 0xff);
3915

3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928
	spin_lock(&dev->dev_reservation_lock);
	if (dev->dev_pr_res_holder) {
		struct t10_pr_registration *pr_holder = dev->dev_pr_res_holder;

		if (pr_holder->pr_res_type == PR_TYPE_WRITE_EXCLUSIVE_ALLREG ||
		    pr_holder->pr_res_type == PR_TYPE_EXCLUSIVE_ACCESS_ALLREG) {
			all_reg = true;
			pr_res_type = pr_holder->pr_res_type;
			pr_res_scope = pr_holder->pr_res_scope;
		}
	}
	spin_unlock(&dev->dev_reservation_lock);

3929 3930 3931 3932 3933 3934 3935 3936
	spin_lock(&pr_tmpl->registration_lock);
	list_for_each_entry_safe(pr_reg, pr_reg_tmp,
			&pr_tmpl->registration_list, pr_reg_list) {

		se_nacl = pr_reg->pr_reg_nacl;
		se_tpg = pr_reg->pr_reg_nacl->se_tpg;
		add_desc_len = 0;

3937
		atomic_inc_mb(&pr_reg->pr_res_holders);
3938 3939 3940 3941 3942
		spin_unlock(&pr_tmpl->registration_lock);
		/*
		 * Determine expected length of $FABRIC_MOD specific
		 * TransportID full status descriptor..
		 */
3943 3944 3945 3946
		exp_desc_len = target_get_pr_transport_id_len(se_nacl, pr_reg,
					&format_code);
		if (exp_desc_len < 0 ||
		    exp_desc_len + add_len > cmd->data_length) {
3947
			pr_warn("SPC-3 PRIN READ_FULL_STATUS ran"
3948 3949
				" out of buffer: %d\n", cmd->data_length);
			spin_lock(&pr_tmpl->registration_lock);
3950
			atomic_dec_mb(&pr_reg->pr_res_holders);
3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975
			break;
		}
		/*
		 * Set RESERVATION KEY
		 */
		buf[off++] = ((pr_reg->pr_res_key >> 56) & 0xff);
		buf[off++] = ((pr_reg->pr_res_key >> 48) & 0xff);
		buf[off++] = ((pr_reg->pr_res_key >> 40) & 0xff);
		buf[off++] = ((pr_reg->pr_res_key >> 32) & 0xff);
		buf[off++] = ((pr_reg->pr_res_key >> 24) & 0xff);
		buf[off++] = ((pr_reg->pr_res_key >> 16) & 0xff);
		buf[off++] = ((pr_reg->pr_res_key >> 8) & 0xff);
		buf[off++] = (pr_reg->pr_res_key & 0xff);
		off += 4; /* Skip Over Reserved area */

		/*
		 * Set ALL_TG_PT bit if PROUT SA REGISTER had this set.
		 */
		if (pr_reg->pr_reg_all_tg_pt)
			buf[off] = 0x02;
		/*
		 * The struct se_lun pointer will be present for the
		 * reservation holder for PR_HOLDER bit.
		 *
		 * Also, if this registration is the reservation
3976 3977
		 * holder or there is an All Registrants reservation
		 * active, fill in SCOPE and TYPE in the next byte.
3978 3979 3980 3981 3982
		 */
		if (pr_reg->pr_res_holder) {
			buf[off++] |= 0x01;
			buf[off++] = (pr_reg->pr_res_scope & 0xf0) |
				     (pr_reg->pr_res_type & 0x0f);
3983 3984 3985 3986 3987
		} else if (all_reg) {
			buf[off++] |= 0x01;
			buf[off++] = (pr_res_scope & 0xf0) |
				     (pr_res_type & 0x0f);
		} else {
3988
			off += 2;
3989
		}
3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001

		off += 4; /* Skip over reserved area */
		/*
		 * From spc4r17 6.3.15:
		 *
		 * If the ALL_TG_PT bit set to zero, the RELATIVE TARGET PORT
		 * IDENTIFIER field contains the relative port identifier (see
		 * 3.1.120) of the target port that is part of the I_T nexus
		 * described by this full status descriptor. If the ALL_TG_PT
		 * bit is set to one, the contents of the RELATIVE TARGET PORT
		 * IDENTIFIER field are not defined by this standard.
		 */
4002
		if (!pr_reg->pr_reg_all_tg_pt) {
4003
			u16 sep_rtpi = pr_reg->tg_pt_sep_rtpi;
4004

4005 4006
			buf[off++] = ((sep_rtpi >> 8) & 0xff);
			buf[off++] = (sep_rtpi & 0xff);
4007
		} else
4008
			off += 2; /* Skip over RELATIVE TARGET PORT IDENTIFIER */
4009

4010 4011
		buf[off+4] = se_tpg->proto_id;

4012
		/*
4013
		 * Now, have the $FABRIC_MOD fill in the transport ID.
4014
		 */
4015 4016
		desc_len = target_get_pr_transport_id(se_nacl, pr_reg,
				&format_code, &buf[off+4]);
4017 4018

		spin_lock(&pr_tmpl->registration_lock);
4019
		atomic_dec_mb(&pr_reg->pr_res_holders);
4020 4021 4022

		if (desc_len < 0)
			break;
4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050
		/*
		 * Set the ADDITIONAL DESCRIPTOR LENGTH
		 */
		buf[off++] = ((desc_len >> 24) & 0xff);
		buf[off++] = ((desc_len >> 16) & 0xff);
		buf[off++] = ((desc_len >> 8) & 0xff);
		buf[off++] = (desc_len & 0xff);
		/*
		 * Size of full desctipor header minus TransportID
		 * containing $FABRIC_MOD specific) initiator device/port
		 * WWN information.
		 *
		 *  See spc4r17 Section 6.13.5 Table 169
		 */
		add_desc_len = (24 + desc_len);

		off += desc_len;
		add_len += add_desc_len;
	}
	spin_unlock(&pr_tmpl->registration_lock);
	/*
	 * Set ADDITIONAL_LENGTH
	 */
	buf[4] = ((add_len >> 24) & 0xff);
	buf[5] = ((add_len >> 16) & 0xff);
	buf[6] = ((add_len >> 8) & 0xff);
	buf[7] = (add_len & 0xff);

4051
	transport_kunmap_data_sg(cmd);
4052

4053 4054 4055
	return 0;
}

4056 4057
sense_reason_t
target_scsi3_emulate_pr_in(struct se_cmd *cmd)
4058
{
4059
	sense_reason_t ret;
4060

4061 4062 4063 4064 4065 4066 4067 4068 4069
	/*
	 * Following spc2r20 5.5.1 Reservations overview:
	 *
	 * If a logical unit has been reserved by any RESERVE command and is
	 * still reserved by any initiator, all PERSISTENT RESERVE IN and all
	 * PERSISTENT RESERVE OUT commands shall conflict regardless of
	 * initiator or service action and shall terminate with a RESERVATION
	 * CONFLICT status.
	 */
4070
	if (cmd->se_dev->dev_reservation_flags & DRF_SPC2_RESERVATIONS) {
4071
		pr_err("Received PERSISTENT_RESERVE CDB while legacy"
4072 4073
			" SPC-2 reservation is held, returning"
			" RESERVATION_CONFLICT\n");
4074
		return TCM_RESERVATION_CONFLICT;
4075 4076
	}

4077 4078
	switch (cmd->t_task_cdb[1] & 0x1f) {
	case PRI_READ_KEYS:
4079 4080
		ret = core_scsi3_pri_read_keys(cmd);
		break;
4081
	case PRI_READ_RESERVATION:
4082 4083
		ret = core_scsi3_pri_read_reservation(cmd);
		break;
4084
	case PRI_REPORT_CAPABILITIES:
4085 4086
		ret = core_scsi3_pri_report_capabilities(cmd);
		break;
4087
	case PRI_READ_FULL_STATUS:
4088 4089
		ret = core_scsi3_pri_read_full_status(cmd);
		break;
4090 4091 4092
	default:
		pr_err("Unknown PERSISTENT_RESERVE_IN service"
			" action: 0x%02x\n", cmd->t_task_cdb[1] & 0x1f);
4093
		return TCM_INVALID_CDB_FIELD;
4094 4095
	}

4096 4097
	if (!ret)
		target_complete_cmd(cmd, GOOD);
4098
	return ret;
4099 4100
}

4101 4102
sense_reason_t
target_check_reservation(struct se_cmd *cmd)
4103
{
4104
	struct se_device *dev = cmd->se_dev;
4105
	sense_reason_t ret;
4106

4107 4108 4109 4110
	if (!cmd->se_sess)
		return 0;
	if (dev->se_hba->hba_flags & HBA_FLAGS_INTERNAL_USE)
		return 0;
4111
	if (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH)
4112
		return 0;
4113

4114 4115 4116 4117 4118 4119
	spin_lock(&dev->dev_reservation_lock);
	if (dev->dev_reservation_flags & DRF_SPC2_RESERVATIONS)
		ret = target_scsi2_reservation_check(cmd);
	else
		ret = target_scsi3_pr_reservation_check(cmd);
	spin_unlock(&dev->dev_reservation_lock);
4120

4121
	return ret;
4122
}