Commit e80ac6c4 authored by Andy Grover's avatar Andy Grover Committed by Nicholas Bellinger

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: default avatarAndy Grover <agrover@redhat.com>
Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
parent cdf88a2f
...@@ -300,8 +300,8 @@ int core_free_device_list_for_node( ...@@ -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,44 +342,25 @@ void core_update_device_list_access( ...@@ -342,44 +342,25 @@ 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 * Check if the call is handling demo mode -> explict LUN ACL
* transition. This transition must be for the same struct se_lun * transition. This transition must be for the same struct se_lun
...@@ -401,13 +382,23 @@ int core_update_device_list_for_node( ...@@ -401,13 +382,23 @@ int core_update_device_list_for_node(
return -EINVAL; return -EINVAL;
} }
deve->se_lun_acl = lun_acl; deve->se_lun_acl = lun_acl;
trans = 1;
if (lun_access & TRANSPORT_LUNFLAGS_READ_WRITE) {
deve->lun_flags &= ~TRANSPORT_LUNFLAGS_READ_ONLY;
deve->lun_flags |= TRANSPORT_LUNFLAGS_READ_WRITE;
} else { } else {
deve->lun_flags &= ~TRANSPORT_LUNFLAGS_READ_WRITE;
deve->lun_flags |= TRANSPORT_LUNFLAGS_READ_ONLY;
}
spin_unlock_irq(&nacl->device_list_lock);
return 0;
}
deve->se_lun = lun; deve->se_lun = lun;
deve->se_lun_acl = lun_acl; deve->se_lun_acl = lun_acl;
deve->mapped_lun = mapped_lun; deve->mapped_lun = mapped_lun;
deve->lun_flags |= TRANSPORT_LUNFLAGS_INITIATOR_ACCESS; deve->lun_flags |= TRANSPORT_LUNFLAGS_INITIATOR_ACCESS;
}
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,10 +408,6 @@ int core_update_device_list_for_node( ...@@ -417,10 +408,6 @@ 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->creation_time = get_jiffies_64();
deve->attach_count++; deve->attach_count++;
spin_unlock_irq(&nacl->device_list_lock); spin_unlock_irq(&nacl->device_list_lock);
...@@ -430,7 +417,44 @@ int core_update_device_list_for_node( ...@@ -430,7 +417,44 @@ int core_update_device_list_for_node(
spin_unlock_bh(&port->sep_alua_lock); spin_unlock_bh(&port->sep_alua_lock);
return 0; 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) ...@@ -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( ...@@ -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( ...@@ -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 *, ...@@ -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( ...@@ -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( ...@@ -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);
......
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