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