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: Nicholas Bellinger <nab@linux-iscsi.org>
This commit is contained in:
parent
f4c24db1b7
commit
e24805637d
4 changed files with 14 additions and 5 deletions
|
@ -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(
|
||||||
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(
|
||||||
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 @@
|
||||||
#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(
|
||||||
|
|
||||||
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);
|
||||||
|
|
Loading…
Add table
Reference in a new issue