diff options
author | Nicholas Bellinger <nab@linux-iscsi.org> | 2015-03-06 10:23:25 +0000 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2015-06-01 00:24:54 -0700 |
commit | 22793de590ca23a1e49b0ce5353911121fcc32be (patch) | |
tree | 173ccc678c6f936cae635bcf4c11a6886be10c8b | |
parent | 403edd78a2851ef95b24c0bf5151a4ab640898d7 (diff) | |
download | linux-stable-22793de590ca23a1e49b0ce5353911121fcc32be.tar.gz linux-stable-22793de590ca23a1e49b0ce5353911121fcc32be.tar.bz2 linux-stable-22793de590ca23a1e49b0ce5353911121fcc32be.zip |
target: Convert core_tpg_deregister to use list splice
This patch converts core_tpg_deregister() to perform a list splice
for any remaining dynamically generated se_node_acls attached to
se_tpg, before calling kfree(nacl) to free memory.
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Sagi Grimberg <sagig@mellanox.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
-rw-r--r-- | drivers/target/target_core_tpg.c | 12 |
1 files changed, 5 insertions, 7 deletions
diff --git a/drivers/target/target_core_tpg.c b/drivers/target/target_core_tpg.c index 229e8278f4fe..e7745d21075b 100644 --- a/drivers/target/target_core_tpg.c +++ b/drivers/target/target_core_tpg.c @@ -547,6 +547,7 @@ int core_tpg_deregister(struct se_portal_group *se_tpg) { const struct target_core_fabric_ops *tfo = se_tpg->se_tpg_tfo; struct se_node_acl *nacl, *nacl_tmp; + LIST_HEAD(node_list); pr_debug("TARGET_CORE[%s]: Deallocating portal_group for endpoint: %s, " "Proto: %d, Portal Tag: %u\n", tfo->get_fabric_name(), @@ -560,25 +561,22 @@ int core_tpg_deregister(struct se_portal_group *se_tpg) while (atomic_read(&se_tpg->tpg_pr_ref_count) != 0) cpu_relax(); + mutex_lock(&se_tpg->acl_node_mutex); + list_splice_init(&se_tpg->acl_node_list, &node_list); + mutex_unlock(&se_tpg->acl_node_mutex); /* * Release any remaining demo-mode generated se_node_acl that have * not been released because of TFO->tpg_check_demo_mode_cache() == 1 * in transport_deregister_session(). */ - mutex_lock(&se_tpg->acl_node_mutex); - list_for_each_entry_safe(nacl, nacl_tmp, &se_tpg->acl_node_list, - acl_list) { + list_for_each_entry_safe(nacl, nacl_tmp, &node_list, acl_list) { list_del(&nacl->acl_list); se_tpg->num_node_acls--; - mutex_unlock(&se_tpg->acl_node_mutex); core_tpg_wait_for_nacl_pr_ref(nacl); core_free_device_list_for_node(nacl, se_tpg); kfree(nacl); - - mutex_lock(&se_tpg->acl_node_mutex); } - mutex_unlock(&se_tpg->acl_node_mutex); if (se_tpg->proto_id >= 0) core_tpg_remove_lun(se_tpg, &se_tpg->tpg_virt_lun0); |