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