target: refactor core_update_device_list_for_node()
Code was almost entirely divided based on value of bool param "enable". Split it into two functions. Signed-off-by: Andy Grover <agrover@redhat.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
This commit is contained in:
parent
cdf88a2fe3
commit
e80ac6c4cc
@ -300,8 +300,8 @@ int core_free_device_list_for_node(
|
|||||||
lun = deve->se_lun;
|
lun = deve->se_lun;
|
||||||
|
|
||||||
spin_unlock_irq(&nacl->device_list_lock);
|
spin_unlock_irq(&nacl->device_list_lock);
|
||||||
core_update_device_list_for_node(lun, NULL, deve->mapped_lun,
|
core_disable_device_list_for_node(lun, NULL, deve->mapped_lun,
|
||||||
TRANSPORT_LUNFLAGS_NO_ACCESS, nacl, tpg, 0);
|
TRANSPORT_LUNFLAGS_NO_ACCESS, nacl, tpg);
|
||||||
spin_lock_irq(&nacl->device_list_lock);
|
spin_lock_irq(&nacl->device_list_lock);
|
||||||
}
|
}
|
||||||
spin_unlock_irq(&nacl->device_list_lock);
|
spin_unlock_irq(&nacl->device_list_lock);
|
||||||
@ -342,72 +342,46 @@ void core_update_device_list_access(
|
|||||||
spin_unlock_irq(&nacl->device_list_lock);
|
spin_unlock_irq(&nacl->device_list_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* core_update_device_list_for_node():
|
/* core_enable_device_list_for_node():
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
int core_update_device_list_for_node(
|
int core_enable_device_list_for_node(
|
||||||
struct se_lun *lun,
|
struct se_lun *lun,
|
||||||
struct se_lun_acl *lun_acl,
|
struct se_lun_acl *lun_acl,
|
||||||
u32 mapped_lun,
|
u32 mapped_lun,
|
||||||
u32 lun_access,
|
u32 lun_access,
|
||||||
struct se_node_acl *nacl,
|
struct se_node_acl *nacl,
|
||||||
struct se_portal_group *tpg,
|
struct se_portal_group *tpg)
|
||||||
int enable)
|
|
||||||
{
|
{
|
||||||
struct se_port *port = lun->lun_sep;
|
struct se_port *port = lun->lun_sep;
|
||||||
struct se_dev_entry *deve = nacl->device_list[mapped_lun];
|
struct se_dev_entry *deve;
|
||||||
int trans = 0;
|
|
||||||
/*
|
|
||||||
* If the MappedLUN entry is being disabled, the entry in
|
|
||||||
* port->sep_alua_list must be removed now before clearing the
|
|
||||||
* struct se_dev_entry pointers below as logic in
|
|
||||||
* core_alua_do_transition_tg_pt() depends on these being present.
|
|
||||||
*/
|
|
||||||
if (!enable) {
|
|
||||||
/*
|
|
||||||
* deve->se_lun_acl will be NULL for demo-mode created LUNs
|
|
||||||
* that have not been explicitly concerted to MappedLUNs ->
|
|
||||||
* struct se_lun_acl, but we remove deve->alua_port_list from
|
|
||||||
* port->sep_alua_list. This also means that active UAs and
|
|
||||||
* NodeACL context specific PR metadata for demo-mode
|
|
||||||
* MappedLUN *deve will be released below..
|
|
||||||
*/
|
|
||||||
spin_lock_bh(&port->sep_alua_lock);
|
|
||||||
list_del(&deve->alua_port_list);
|
|
||||||
spin_unlock_bh(&port->sep_alua_lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
spin_lock_irq(&nacl->device_list_lock);
|
spin_lock_irq(&nacl->device_list_lock);
|
||||||
if (enable) {
|
|
||||||
/*
|
deve = nacl->device_list[mapped_lun];
|
||||||
* Check if the call is handling demo mode -> explict LUN ACL
|
|
||||||
* transition. This transition must be for the same struct se_lun
|
/*
|
||||||
* + mapped_lun that was setup in demo mode..
|
* Check if the call is handling demo mode -> explict LUN ACL
|
||||||
*/
|
* transition. This transition must be for the same struct se_lun
|
||||||
if (deve->lun_flags & TRANSPORT_LUNFLAGS_INITIATOR_ACCESS) {
|
* + mapped_lun that was setup in demo mode..
|
||||||
if (deve->se_lun_acl != NULL) {
|
*/
|
||||||
pr_err("struct se_dev_entry->se_lun_acl"
|
if (deve->lun_flags & TRANSPORT_LUNFLAGS_INITIATOR_ACCESS) {
|
||||||
" already set for demo mode -> explict"
|
if (deve->se_lun_acl != NULL) {
|
||||||
" LUN ACL transition\n");
|
pr_err("struct se_dev_entry->se_lun_acl"
|
||||||
spin_unlock_irq(&nacl->device_list_lock);
|
" already set for demo mode -> explict"
|
||||||
return -EINVAL;
|
" LUN ACL transition\n");
|
||||||
}
|
spin_unlock_irq(&nacl->device_list_lock);
|
||||||
if (deve->se_lun != lun) {
|
return -EINVAL;
|
||||||
pr_err("struct se_dev_entry->se_lun does"
|
|
||||||
" match passed struct se_lun for demo mode"
|
|
||||||
" -> explict LUN ACL transition\n");
|
|
||||||
spin_unlock_irq(&nacl->device_list_lock);
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
deve->se_lun_acl = lun_acl;
|
|
||||||
trans = 1;
|
|
||||||
} else {
|
|
||||||
deve->se_lun = lun;
|
|
||||||
deve->se_lun_acl = lun_acl;
|
|
||||||
deve->mapped_lun = mapped_lun;
|
|
||||||
deve->lun_flags |= TRANSPORT_LUNFLAGS_INITIATOR_ACCESS;
|
|
||||||
}
|
}
|
||||||
|
if (deve->se_lun != lun) {
|
||||||
|
pr_err("struct se_dev_entry->se_lun does"
|
||||||
|
" match passed struct se_lun for demo mode"
|
||||||
|
" -> explict LUN ACL transition\n");
|
||||||
|
spin_unlock_irq(&nacl->device_list_lock);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
deve->se_lun_acl = lun_acl;
|
||||||
|
|
||||||
if (lun_access & TRANSPORT_LUNFLAGS_READ_WRITE) {
|
if (lun_access & TRANSPORT_LUNFLAGS_READ_WRITE) {
|
||||||
deve->lun_flags &= ~TRANSPORT_LUNFLAGS_READ_ONLY;
|
deve->lun_flags &= ~TRANSPORT_LUNFLAGS_READ_ONLY;
|
||||||
@ -417,20 +391,70 @@ int core_update_device_list_for_node(
|
|||||||
deve->lun_flags |= TRANSPORT_LUNFLAGS_READ_ONLY;
|
deve->lun_flags |= TRANSPORT_LUNFLAGS_READ_ONLY;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (trans) {
|
|
||||||
spin_unlock_irq(&nacl->device_list_lock);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
deve->creation_time = get_jiffies_64();
|
|
||||||
deve->attach_count++;
|
|
||||||
spin_unlock_irq(&nacl->device_list_lock);
|
spin_unlock_irq(&nacl->device_list_lock);
|
||||||
|
|
||||||
spin_lock_bh(&port->sep_alua_lock);
|
|
||||||
list_add_tail(&deve->alua_port_list, &port->sep_alua_list);
|
|
||||||
spin_unlock_bh(&port->sep_alua_lock);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
deve->se_lun = lun;
|
||||||
|
deve->se_lun_acl = lun_acl;
|
||||||
|
deve->mapped_lun = mapped_lun;
|
||||||
|
deve->lun_flags |= TRANSPORT_LUNFLAGS_INITIATOR_ACCESS;
|
||||||
|
|
||||||
|
if (lun_access & TRANSPORT_LUNFLAGS_READ_WRITE) {
|
||||||
|
deve->lun_flags &= ~TRANSPORT_LUNFLAGS_READ_ONLY;
|
||||||
|
deve->lun_flags |= TRANSPORT_LUNFLAGS_READ_WRITE;
|
||||||
|
} else {
|
||||||
|
deve->lun_flags &= ~TRANSPORT_LUNFLAGS_READ_WRITE;
|
||||||
|
deve->lun_flags |= TRANSPORT_LUNFLAGS_READ_ONLY;
|
||||||
|
}
|
||||||
|
|
||||||
|
deve->creation_time = get_jiffies_64();
|
||||||
|
deve->attach_count++;
|
||||||
|
spin_unlock_irq(&nacl->device_list_lock);
|
||||||
|
|
||||||
|
spin_lock_bh(&port->sep_alua_lock);
|
||||||
|
list_add_tail(&deve->alua_port_list, &port->sep_alua_list);
|
||||||
|
spin_unlock_bh(&port->sep_alua_lock);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* core_disable_device_list_for_node():
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
int core_disable_device_list_for_node(
|
||||||
|
struct se_lun *lun,
|
||||||
|
struct se_lun_acl *lun_acl,
|
||||||
|
u32 mapped_lun,
|
||||||
|
u32 lun_access,
|
||||||
|
struct se_node_acl *nacl,
|
||||||
|
struct se_portal_group *tpg)
|
||||||
|
{
|
||||||
|
struct se_port *port = lun->lun_sep;
|
||||||
|
struct se_dev_entry *deve;
|
||||||
|
|
||||||
|
spin_lock_irq(&nacl->device_list_lock);
|
||||||
|
|
||||||
|
deve = nacl->device_list[mapped_lun];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If the MappedLUN entry is being disabled, the entry in
|
||||||
|
* port->sep_alua_list must be removed now before clearing the
|
||||||
|
* struct se_dev_entry pointers below as logic in
|
||||||
|
* core_alua_do_transition_tg_pt() depends on these being present.
|
||||||
|
*
|
||||||
|
* deve->se_lun_acl will be NULL for demo-mode created LUNs
|
||||||
|
* that have not been explicitly converted to MappedLUNs ->
|
||||||
|
* struct se_lun_acl, but we remove deve->alua_port_list from
|
||||||
|
* port->sep_alua_list. This also means that active UAs and
|
||||||
|
* NodeACL context specific PR metadata for demo-mode
|
||||||
|
* MappedLUN *deve will be released below..
|
||||||
|
*/
|
||||||
|
spin_lock_bh(&port->sep_alua_lock);
|
||||||
|
list_del(&deve->alua_port_list);
|
||||||
|
spin_unlock_bh(&port->sep_alua_lock);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Wait for any in process SPEC_I_PT=1 or REGISTER_AND_MOVE
|
* Wait for any in process SPEC_I_PT=1 or REGISTER_AND_MOVE
|
||||||
* PR operation to complete.
|
* PR operation to complete.
|
||||||
@ -475,9 +499,9 @@ void core_clear_lun_from_tpg(struct se_lun *lun, struct se_portal_group *tpg)
|
|||||||
continue;
|
continue;
|
||||||
spin_unlock_irq(&nacl->device_list_lock);
|
spin_unlock_irq(&nacl->device_list_lock);
|
||||||
|
|
||||||
core_update_device_list_for_node(lun, NULL,
|
core_disable_device_list_for_node(lun, NULL,
|
||||||
deve->mapped_lun, TRANSPORT_LUNFLAGS_NO_ACCESS,
|
deve->mapped_lun, TRANSPORT_LUNFLAGS_NO_ACCESS,
|
||||||
nacl, tpg, 0);
|
nacl, tpg);
|
||||||
|
|
||||||
spin_lock_irq(&nacl->device_list_lock);
|
spin_lock_irq(&nacl->device_list_lock);
|
||||||
}
|
}
|
||||||
@ -1469,8 +1493,8 @@ int core_dev_add_initiator_node_lun_acl(
|
|||||||
|
|
||||||
lacl->se_lun = lun;
|
lacl->se_lun = lun;
|
||||||
|
|
||||||
if (core_update_device_list_for_node(lun, lacl, lacl->mapped_lun,
|
if (core_enable_device_list_for_node(lun, lacl, lacl->mapped_lun,
|
||||||
lun_access, nacl, tpg, 1) < 0)
|
lun_access, nacl, tpg) < 0)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
spin_lock(&lun->lun_acl_lock);
|
spin_lock(&lun->lun_acl_lock);
|
||||||
@ -1513,8 +1537,8 @@ int core_dev_del_initiator_node_lun_acl(
|
|||||||
smp_mb__after_atomic_dec();
|
smp_mb__after_atomic_dec();
|
||||||
spin_unlock(&lun->lun_acl_lock);
|
spin_unlock(&lun->lun_acl_lock);
|
||||||
|
|
||||||
core_update_device_list_for_node(lun, NULL, lacl->mapped_lun,
|
core_disable_device_list_for_node(lun, NULL, lacl->mapped_lun,
|
||||||
TRANSPORT_LUNFLAGS_NO_ACCESS, nacl, tpg, 0);
|
TRANSPORT_LUNFLAGS_NO_ACCESS, nacl, tpg);
|
||||||
|
|
||||||
lacl->se_lun = NULL;
|
lacl->se_lun = NULL;
|
||||||
|
|
||||||
|
@ -10,8 +10,10 @@ int core_free_device_list_for_node(struct se_node_acl *,
|
|||||||
struct se_portal_group *);
|
struct se_portal_group *);
|
||||||
void core_dec_lacl_count(struct se_node_acl *, struct se_cmd *);
|
void core_dec_lacl_count(struct se_node_acl *, struct se_cmd *);
|
||||||
void core_update_device_list_access(u32, u32, struct se_node_acl *);
|
void core_update_device_list_access(u32, u32, struct se_node_acl *);
|
||||||
int core_update_device_list_for_node(struct se_lun *, struct se_lun_acl *,
|
int core_enable_device_list_for_node(struct se_lun *, struct se_lun_acl *,
|
||||||
u32, u32, struct se_node_acl *, struct se_portal_group *, int);
|
u32, u32, struct se_node_acl *, struct se_portal_group *);
|
||||||
|
int core_disable_device_list_for_node(struct se_lun *, struct se_lun_acl *,
|
||||||
|
u32, u32, struct se_node_acl *, struct se_portal_group *);
|
||||||
void core_clear_lun_from_tpg(struct se_lun *, struct se_portal_group *);
|
void core_clear_lun_from_tpg(struct se_lun *, struct se_portal_group *);
|
||||||
int core_dev_export(struct se_device *, struct se_portal_group *,
|
int core_dev_export(struct se_device *, struct se_portal_group *,
|
||||||
struct se_lun *);
|
struct se_lun *);
|
||||||
|
@ -77,8 +77,8 @@ static void core_clear_initiator_node_from_tpg(
|
|||||||
|
|
||||||
lun = deve->se_lun;
|
lun = deve->se_lun;
|
||||||
spin_unlock_irq(&nacl->device_list_lock);
|
spin_unlock_irq(&nacl->device_list_lock);
|
||||||
core_update_device_list_for_node(lun, NULL, deve->mapped_lun,
|
core_disable_device_list_for_node(lun, NULL, deve->mapped_lun,
|
||||||
TRANSPORT_LUNFLAGS_NO_ACCESS, nacl, tpg, 0);
|
TRANSPORT_LUNFLAGS_NO_ACCESS, nacl, tpg);
|
||||||
|
|
||||||
spin_lock_irq(&nacl->device_list_lock);
|
spin_lock_irq(&nacl->device_list_lock);
|
||||||
}
|
}
|
||||||
@ -172,8 +172,8 @@ void core_tpg_add_node_to_devs(
|
|||||||
(lun_access == TRANSPORT_LUNFLAGS_READ_WRITE) ?
|
(lun_access == TRANSPORT_LUNFLAGS_READ_WRITE) ?
|
||||||
"READ-WRITE" : "READ-ONLY");
|
"READ-WRITE" : "READ-ONLY");
|
||||||
|
|
||||||
core_update_device_list_for_node(lun, NULL, lun->unpacked_lun,
|
core_enable_device_list_for_node(lun, NULL, lun->unpacked_lun,
|
||||||
lun_access, acl, tpg, 1);
|
lun_access, acl, tpg);
|
||||||
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…
Reference in New Issue
Block a user