target: simplify the target template registration API
Instead of calling target_fabric_configfs_init() + target_fabric_configfs_register() / target_fabric_configfs_deregister() target_fabric_configfs_free() from every target driver, rewrite the API so that we have simple register/unregister functions that operate on a const operations vector. This patch also fixes a memory leak in several target drivers. Several target drivers namely called target_fabric_configfs_deregister() without calling target_fabric_configfs_free(). A large part of this patch is based on earlier changes from Bart Van Assche <bart.vanassche@sandisk.com>. (v2: Add a new TF_CIT_SETUP_DRV macro so that the core configfs code can declare attributes as either core only or for drivers) Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
This commit is contained in:

committed by
Nicholas Bellinger

parent
2c336e3a2e
commit
9ac8928e6a
@@ -33,7 +33,6 @@
|
||||
#include <target/iscsi/iscsi_target_core.h>
|
||||
#include "iscsi_target_parameters.h"
|
||||
#include "iscsi_target_seq_pdu_list.h"
|
||||
#include "iscsi_target_configfs.h"
|
||||
#include "iscsi_target_datain_values.h"
|
||||
#include "iscsi_target_erl0.h"
|
||||
#include "iscsi_target_erl1.h"
|
||||
@@ -551,8 +550,8 @@ static int __init iscsi_target_init_module(void)
|
||||
idr_init(&tiqn_idr);
|
||||
idr_init(&sess_idr);
|
||||
|
||||
ret = iscsi_target_register_configfs();
|
||||
if (ret < 0)
|
||||
ret = target_register_template(&iscsi_ops);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
size = BITS_TO_LONGS(ISCSIT_BITMAP_BITS) * sizeof(long);
|
||||
@@ -616,7 +615,10 @@ qr_out:
|
||||
bitmap_out:
|
||||
vfree(iscsit_global->ts_bitmap);
|
||||
configfs_out:
|
||||
iscsi_target_deregister_configfs();
|
||||
/* XXX: this probably wants it to be it's own unwind step.. */
|
||||
if (iscsit_global->discovery_tpg)
|
||||
iscsit_tpg_disable_portal_group(iscsit_global->discovery_tpg, 1);
|
||||
target_unregister_template(&iscsi_ops);
|
||||
out:
|
||||
kfree(iscsit_global);
|
||||
return -ENOMEM;
|
||||
@@ -631,7 +633,13 @@ static void __exit iscsi_target_cleanup_module(void)
|
||||
kmem_cache_destroy(lio_ooo_cache);
|
||||
kmem_cache_destroy(lio_r2t_cache);
|
||||
|
||||
iscsi_target_deregister_configfs();
|
||||
/*
|
||||
* Shutdown discovery sessions and disable discovery TPG
|
||||
*/
|
||||
if (iscsit_global->discovery_tpg)
|
||||
iscsit_tpg_disable_portal_group(iscsit_global->discovery_tpg, 1);
|
||||
|
||||
target_unregister_template(&iscsi_ops);
|
||||
|
||||
vfree(iscsit_global->ts_bitmap);
|
||||
kfree(iscsit_global);
|
||||
@@ -983,7 +991,7 @@ int iscsit_setup_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
|
||||
/*
|
||||
* Initialize struct se_cmd descriptor from target_core_mod infrastructure
|
||||
*/
|
||||
transport_init_se_cmd(&cmd->se_cmd, &lio_target_fabric_configfs->tf_ops,
|
||||
transport_init_se_cmd(&cmd->se_cmd, &iscsi_ops,
|
||||
conn->sess->se_sess, be32_to_cpu(hdr->data_length),
|
||||
cmd->data_direction, sam_task_attr,
|
||||
cmd->sense_buffer + 2);
|
||||
@@ -1798,8 +1806,7 @@ iscsit_handle_task_mgt_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
|
||||
u8 tcm_function;
|
||||
int ret;
|
||||
|
||||
transport_init_se_cmd(&cmd->se_cmd,
|
||||
&lio_target_fabric_configfs->tf_ops,
|
||||
transport_init_se_cmd(&cmd->se_cmd, &iscsi_ops,
|
||||
conn->sess->se_sess, 0, DMA_NONE,
|
||||
TCM_SIMPLE_TAG, cmd->sense_buffer + 2);
|
||||
|
||||
|
Reference in New Issue
Block a user