target: Fix lookup of dynamic NodeACLs during cached demo-mode operation
This patch fixes a bug in core_tpg_check_initiator_node_acl() -> core_tpg_get_initiator_node_acl() where a dynamically created se_node_acl generated during session login would be skipped during subsequent lookup due to the '!acl->dynamic_node_acl' check, causing a new se_node_acl to be created with a duplicate ->initiatorname. This would occur when a fabric endpoint was configured with TFO->tpg_check_demo_mode()=1 + TPF->tpg_check_demo_mode_cache()=1 preventing the release of an existing se_node_acl during se_session shutdown. Also, drop the unnecessary usage of core_tpg_get_initiator_node_acl() within core_dev_init_initiator_node_lun_acl() that originally required the extra '!acl->dynamic_node_acl' check, and just pass the configfs provided se_node_acl pointer instead. Cc: <stable@vger.kernel.org> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
This commit is contained in:
@@ -1226,24 +1226,18 @@ static struct se_lun *core_dev_get_lun(struct se_portal_group *tpg, u32 unpacked
|
|||||||
|
|
||||||
struct se_lun_acl *core_dev_init_initiator_node_lun_acl(
|
struct se_lun_acl *core_dev_init_initiator_node_lun_acl(
|
||||||
struct se_portal_group *tpg,
|
struct se_portal_group *tpg,
|
||||||
|
struct se_node_acl *nacl,
|
||||||
u32 mapped_lun,
|
u32 mapped_lun,
|
||||||
char *initiatorname,
|
|
||||||
int *ret)
|
int *ret)
|
||||||
{
|
{
|
||||||
struct se_lun_acl *lacl;
|
struct se_lun_acl *lacl;
|
||||||
struct se_node_acl *nacl;
|
|
||||||
|
|
||||||
if (strlen(initiatorname) >= TRANSPORT_IQN_LEN) {
|
if (strlen(nacl->initiatorname) >= TRANSPORT_IQN_LEN) {
|
||||||
pr_err("%s InitiatorName exceeds maximum size.\n",
|
pr_err("%s InitiatorName exceeds maximum size.\n",
|
||||||
tpg->se_tpg_tfo->get_fabric_name());
|
tpg->se_tpg_tfo->get_fabric_name());
|
||||||
*ret = -EOVERFLOW;
|
*ret = -EOVERFLOW;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
nacl = core_tpg_get_initiator_node_acl(tpg, initiatorname);
|
|
||||||
if (!nacl) {
|
|
||||||
*ret = -EINVAL;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
lacl = kzalloc(sizeof(struct se_lun_acl), GFP_KERNEL);
|
lacl = kzalloc(sizeof(struct se_lun_acl), GFP_KERNEL);
|
||||||
if (!lacl) {
|
if (!lacl) {
|
||||||
pr_err("Unable to allocate memory for struct se_lun_acl.\n");
|
pr_err("Unable to allocate memory for struct se_lun_acl.\n");
|
||||||
@@ -1254,7 +1248,8 @@ struct se_lun_acl *core_dev_init_initiator_node_lun_acl(
|
|||||||
INIT_LIST_HEAD(&lacl->lacl_list);
|
INIT_LIST_HEAD(&lacl->lacl_list);
|
||||||
lacl->mapped_lun = mapped_lun;
|
lacl->mapped_lun = mapped_lun;
|
||||||
lacl->se_lun_nacl = nacl;
|
lacl->se_lun_nacl = nacl;
|
||||||
snprintf(lacl->initiatorname, TRANSPORT_IQN_LEN, "%s", initiatorname);
|
snprintf(lacl->initiatorname, TRANSPORT_IQN_LEN, "%s",
|
||||||
|
nacl->initiatorname);
|
||||||
|
|
||||||
return lacl;
|
return lacl;
|
||||||
}
|
}
|
||||||
|
@@ -355,8 +355,8 @@ static struct config_group *target_fabric_make_mappedlun(
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
lacl = core_dev_init_initiator_node_lun_acl(se_tpg, mapped_lun,
|
lacl = core_dev_init_initiator_node_lun_acl(se_tpg, se_nacl,
|
||||||
config_item_name(acl_ci), &ret);
|
mapped_lun, &ret);
|
||||||
if (!lacl) {
|
if (!lacl) {
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto out;
|
goto out;
|
||||||
|
@@ -46,7 +46,7 @@ struct se_lun *core_dev_add_lun(struct se_portal_group *, struct se_device *, u3
|
|||||||
int core_dev_del_lun(struct se_portal_group *, u32);
|
int core_dev_del_lun(struct se_portal_group *, u32);
|
||||||
struct se_lun *core_get_lun_from_tpg(struct se_portal_group *, u32);
|
struct se_lun *core_get_lun_from_tpg(struct se_portal_group *, u32);
|
||||||
struct se_lun_acl *core_dev_init_initiator_node_lun_acl(struct se_portal_group *,
|
struct se_lun_acl *core_dev_init_initiator_node_lun_acl(struct se_portal_group *,
|
||||||
u32, char *, int *);
|
struct se_node_acl *, u32, int *);
|
||||||
int core_dev_add_initiator_node_lun_acl(struct se_portal_group *,
|
int core_dev_add_initiator_node_lun_acl(struct se_portal_group *,
|
||||||
struct se_lun_acl *, u32, u32);
|
struct se_lun_acl *, u32, u32);
|
||||||
int core_dev_del_initiator_node_lun_acl(struct se_portal_group *,
|
int core_dev_del_initiator_node_lun_acl(struct se_portal_group *,
|
||||||
|
@@ -111,16 +111,10 @@ struct se_node_acl *core_tpg_get_initiator_node_acl(
|
|||||||
struct se_node_acl *acl;
|
struct se_node_acl *acl;
|
||||||
|
|
||||||
spin_lock_irq(&tpg->acl_node_lock);
|
spin_lock_irq(&tpg->acl_node_lock);
|
||||||
list_for_each_entry(acl, &tpg->acl_node_list, acl_list) {
|
acl = __core_tpg_get_initiator_node_acl(tpg, initiatorname);
|
||||||
if (!strcmp(acl->initiatorname, initiatorname) &&
|
|
||||||
!acl->dynamic_node_acl) {
|
|
||||||
spin_unlock_irq(&tpg->acl_node_lock);
|
|
||||||
return acl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
spin_unlock_irq(&tpg->acl_node_lock);
|
spin_unlock_irq(&tpg->acl_node_lock);
|
||||||
|
|
||||||
return NULL;
|
return acl;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* core_tpg_add_node_to_devs():
|
/* core_tpg_add_node_to_devs():
|
||||||
|
Reference in New Issue
Block a user