Commit e2480563 authored by Nicholas Bellinger's avatar Nicholas Bellinger

target: Fix APTPL metadata handling for dynamic MappedLUNs

This patch fixes a bug in handling of SPC-3 PR Activate Persistence
across Target Power Loss (APTPL) logic where re-creation of state for
MappedLUNs from dynamically generated NodeACLs did not occur during
I_T Nexus establishment.

It adds the missing core_scsi3_check_aptpl_registration() call during
core_tpg_check_initiator_node_acl() -> core_tpg_add_node_to_devs() in
order to replay any pre-loaded APTPL metadata state associated with
the newly connected SCSI Initiator Port.

Cc: Mike Christie <michaelc@cs.wisc.edu>
Cc: <stable@vger.kernel.org>
Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
parent f4c24db1
...@@ -1399,7 +1399,8 @@ int core_dev_add_initiator_node_lun_acl( ...@@ -1399,7 +1399,8 @@ int core_dev_add_initiator_node_lun_acl(
* Check to see if there are any existing persistent reservation APTPL * Check to see if there are any existing persistent reservation APTPL
* pre-registrations that need to be enabled for this LUN ACL.. * pre-registrations that need to be enabled for this LUN ACL..
*/ */
core_scsi3_check_aptpl_registration(lun->lun_se_dev, tpg, lun, lacl); core_scsi3_check_aptpl_registration(lun->lun_se_dev, tpg, lun, nacl,
lacl->mapped_lun);
return 0; return 0;
} }
......
...@@ -937,10 +937,10 @@ int core_scsi3_check_aptpl_registration( ...@@ -937,10 +937,10 @@ int core_scsi3_check_aptpl_registration(
struct se_device *dev, struct se_device *dev,
struct se_portal_group *tpg, struct se_portal_group *tpg,
struct se_lun *lun, struct se_lun *lun,
struct se_lun_acl *lun_acl) struct se_node_acl *nacl,
u32 mapped_lun)
{ {
struct se_node_acl *nacl = lun_acl->se_lun_nacl; struct se_dev_entry *deve = nacl->device_list[mapped_lun];
struct se_dev_entry *deve = nacl->device_list[lun_acl->mapped_lun];
if (dev->dev_reservation_flags & DRF_SPC2_RESERVATIONS) if (dev->dev_reservation_flags & DRF_SPC2_RESERVATIONS)
return 0; return 0;
......
...@@ -60,7 +60,7 @@ extern int core_scsi3_alloc_aptpl_registration( ...@@ -60,7 +60,7 @@ extern int core_scsi3_alloc_aptpl_registration(
unsigned char *, u16, u32, int, int, u8); unsigned char *, u16, u32, int, int, u8);
extern int core_scsi3_check_aptpl_registration(struct se_device *, extern int core_scsi3_check_aptpl_registration(struct se_device *,
struct se_portal_group *, struct se_lun *, struct se_portal_group *, struct se_lun *,
struct se_lun_acl *); struct se_node_acl *, u32);
extern void core_scsi3_free_pr_reg_from_nacl(struct se_device *, extern void core_scsi3_free_pr_reg_from_nacl(struct se_device *,
struct se_node_acl *); struct se_node_acl *);
extern void core_scsi3_free_all_registrations(struct se_device *); extern void core_scsi3_free_all_registrations(struct se_device *);
......
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
#include <target/target_core_fabric.h> #include <target/target_core_fabric.h>
#include "target_core_internal.h" #include "target_core_internal.h"
#include "target_core_pr.h"
extern struct se_device *g_lun0_dev; extern struct se_device *g_lun0_dev;
...@@ -166,6 +167,13 @@ void core_tpg_add_node_to_devs( ...@@ -166,6 +167,13 @@ void core_tpg_add_node_to_devs(
core_enable_device_list_for_node(lun, NULL, lun->unpacked_lun, core_enable_device_list_for_node(lun, NULL, lun->unpacked_lun,
lun_access, acl, tpg); lun_access, acl, tpg);
/*
* Check to see if there are any existing persistent reservation
* APTPL pre-registrations that need to be enabled for this dynamic
* LUN ACL now..
*/
core_scsi3_check_aptpl_registration(dev, tpg, lun, acl,
lun->unpacked_lun);
spin_lock(&tpg->tpg_lun_lock); spin_lock(&tpg->tpg_lun_lock);
} }
spin_unlock(&tpg->tpg_lun_lock); spin_unlock(&tpg->tpg_lun_lock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment