target: Drop unnecessary core_tpg_register TFO parameter
This patch drops unnecessary target_core_fabric_ops parameter usage for core_tpg_register() during fabric driver TFO->fabric_make_tpg() se_portal_group creation callback execution. Instead, use the existing se_wwn->wwn_tf->tf_ops pointer to ensure fabric driver is really using the same TFO provided at module_init time. Also go ahead and drop the forward TFO declarations tree-wide, and handling the special case for iscsi-target discovery TPG. Cc: Christoph Hellwig <hch@lst.de> Reviewed-by: Hannes Reinecke <hare@suse.de> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
This commit is contained in:
parent
9e37d042cf
commit
bc0c94b140
@ -92,7 +92,6 @@ MODULE_PARM_DESC(srpt_service_guid,
|
|||||||
" instead of using the node_guid of the first HCA.");
|
" instead of using the node_guid of the first HCA.");
|
||||||
|
|
||||||
static struct ib_client srpt_client;
|
static struct ib_client srpt_client;
|
||||||
static const struct target_core_fabric_ops srpt_template;
|
|
||||||
static void srpt_release_channel(struct srpt_rdma_ch *ch);
|
static void srpt_release_channel(struct srpt_rdma_ch *ch);
|
||||||
static int srpt_queue_status(struct se_cmd *cmd);
|
static int srpt_queue_status(struct se_cmd *cmd);
|
||||||
|
|
||||||
@ -3733,8 +3732,7 @@ static struct se_portal_group *srpt_make_tpg(struct se_wwn *wwn,
|
|||||||
int res;
|
int res;
|
||||||
|
|
||||||
/* Initialize sport->port_wwn and sport->port_tpg_1 */
|
/* Initialize sport->port_wwn and sport->port_tpg_1 */
|
||||||
res = core_tpg_register(&srpt_template, &sport->port_wwn,
|
res = core_tpg_register(&sport->port_wwn, &sport->port_tpg_1, SCSI_PROTOCOL_SRP);
|
||||||
&sport->port_tpg_1, SCSI_PROTOCOL_SRP);
|
|
||||||
if (res)
|
if (res)
|
||||||
return ERR_PTR(res);
|
return ERR_PTR(res);
|
||||||
|
|
||||||
|
@ -52,9 +52,6 @@
|
|||||||
static struct workqueue_struct *tcm_qla2xxx_free_wq;
|
static struct workqueue_struct *tcm_qla2xxx_free_wq;
|
||||||
static struct workqueue_struct *tcm_qla2xxx_cmd_wq;
|
static struct workqueue_struct *tcm_qla2xxx_cmd_wq;
|
||||||
|
|
||||||
static const struct target_core_fabric_ops tcm_qla2xxx_ops;
|
|
||||||
static const struct target_core_fabric_ops tcm_qla2xxx_npiv_ops;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Parse WWN.
|
* Parse WWN.
|
||||||
* If strict, we require lower-case hex and colon separators to be sure
|
* If strict, we require lower-case hex and colon separators to be sure
|
||||||
@ -1004,8 +1001,7 @@ static struct se_portal_group *tcm_qla2xxx_make_tpg(
|
|||||||
tpg->tpg_attrib.cache_dynamic_acls = 1;
|
tpg->tpg_attrib.cache_dynamic_acls = 1;
|
||||||
tpg->tpg_attrib.demo_mode_login_only = 1;
|
tpg->tpg_attrib.demo_mode_login_only = 1;
|
||||||
|
|
||||||
ret = core_tpg_register(&tcm_qla2xxx_ops, wwn, &tpg->se_tpg,
|
ret = core_tpg_register(wwn, &tpg->se_tpg, SCSI_PROTOCOL_FCP);
|
||||||
SCSI_PROTOCOL_FCP);
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
kfree(tpg);
|
kfree(tpg);
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -1124,8 +1120,7 @@ static struct se_portal_group *tcm_qla2xxx_npiv_make_tpg(
|
|||||||
tpg->tpg_attrib.cache_dynamic_acls = 1;
|
tpg->tpg_attrib.cache_dynamic_acls = 1;
|
||||||
tpg->tpg_attrib.demo_mode_login_only = 1;
|
tpg->tpg_attrib.demo_mode_login_only = 1;
|
||||||
|
|
||||||
ret = core_tpg_register(&tcm_qla2xxx_npiv_ops, wwn, &tpg->se_tpg,
|
ret = core_tpg_register(wwn, &tpg->se_tpg, SCSI_PROTOCOL_FCP);
|
||||||
SCSI_PROTOCOL_FCP);
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
kfree(tpg);
|
kfree(tpg);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -1419,8 +1419,7 @@ static struct se_portal_group *lio_target_tiqn_addtpg(
|
|||||||
if (!tpg)
|
if (!tpg)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
ret = core_tpg_register(&iscsi_ops, wwn, &tpg->tpg_se_tpg,
|
ret = core_tpg_register(wwn, &tpg->tpg_se_tpg, SCSI_PROTOCOL_ISCSI);
|
||||||
SCSI_PROTOCOL_ISCSI);
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
@ -66,8 +66,12 @@ int iscsit_load_discovery_tpg(void)
|
|||||||
pr_err("Unable to allocate struct iscsi_portal_group\n");
|
pr_err("Unable to allocate struct iscsi_portal_group\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
ret = core_tpg_register(&iscsi_ops, NULL, &tpg->tpg_se_tpg, -1);
|
* Save iscsi_ops pointer for special case discovery TPG that
|
||||||
|
* doesn't exist as se_wwn->wwn_group within configfs.
|
||||||
|
*/
|
||||||
|
tpg->tpg_se_tpg.se_tpg_tfo = &iscsi_ops;
|
||||||
|
ret = core_tpg_register(NULL, &tpg->tpg_se_tpg, -1);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
kfree(tpg);
|
kfree(tpg);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -40,8 +40,6 @@
|
|||||||
|
|
||||||
#define to_tcm_loop_hba(hba) container_of(hba, struct tcm_loop_hba, dev)
|
#define to_tcm_loop_hba(hba) container_of(hba, struct tcm_loop_hba, dev)
|
||||||
|
|
||||||
static const struct target_core_fabric_ops loop_ops;
|
|
||||||
|
|
||||||
static struct workqueue_struct *tcm_loop_workqueue;
|
static struct workqueue_struct *tcm_loop_workqueue;
|
||||||
static struct kmem_cache *tcm_loop_cmd_cache;
|
static struct kmem_cache *tcm_loop_cmd_cache;
|
||||||
|
|
||||||
@ -1081,8 +1079,7 @@ static struct se_portal_group *tcm_loop_make_naa_tpg(
|
|||||||
/*
|
/*
|
||||||
* Register the tl_tpg as a emulated SAS TCM Target Endpoint
|
* Register the tl_tpg as a emulated SAS TCM Target Endpoint
|
||||||
*/
|
*/
|
||||||
ret = core_tpg_register(&loop_ops, wwn, &tl_tpg->tl_se_tpg,
|
ret = core_tpg_register(wwn, &tl_tpg->tl_se_tpg, tl_hba->tl_proto_id);
|
||||||
tl_hba->tl_proto_id);
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ERR_PTR(-ENOMEM);
|
return ERR_PTR(-ENOMEM);
|
||||||
|
|
||||||
|
@ -2055,7 +2055,7 @@ static struct se_portal_group *sbp_make_tpg(
|
|||||||
goto out_free_tpg;
|
goto out_free_tpg;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = core_tpg_register(&sbp_ops, wwn, &tpg->se_tpg, SCSI_PROTOCOL_SBP);
|
ret = core_tpg_register(wwn, &tpg->se_tpg, SCSI_PROTOCOL_SBP);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto out_unreg_mgt_agt;
|
goto out_unreg_mgt_agt;
|
||||||
|
|
||||||
|
@ -37,6 +37,7 @@
|
|||||||
|
|
||||||
#include <target/target_core_base.h>
|
#include <target/target_core_base.h>
|
||||||
#include <target/target_core_backend.h>
|
#include <target/target_core_backend.h>
|
||||||
|
#include <target/target_core_configfs.h>
|
||||||
#include <target/target_core_fabric.h>
|
#include <target/target_core_fabric.h>
|
||||||
|
|
||||||
#include "target_core_internal.h"
|
#include "target_core_internal.h"
|
||||||
@ -487,16 +488,34 @@ static void core_tpg_lun_ref_release(struct percpu_ref *ref)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int core_tpg_register(
|
int core_tpg_register(
|
||||||
const struct target_core_fabric_ops *tfo,
|
|
||||||
struct se_wwn *se_wwn,
|
struct se_wwn *se_wwn,
|
||||||
struct se_portal_group *se_tpg,
|
struct se_portal_group *se_tpg,
|
||||||
int proto_id)
|
int proto_id)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
if (!se_tpg)
|
||||||
|
return -EINVAL;
|
||||||
|
/*
|
||||||
|
* For the typical case where core_tpg_register() is called by a
|
||||||
|
* fabric driver from target_core_fabric_ops->fabric_make_tpg()
|
||||||
|
* configfs context, use the original tf_ops pointer already saved
|
||||||
|
* by target-core in target_fabric_make_wwn().
|
||||||
|
*
|
||||||
|
* Otherwise, for special cases like iscsi-target discovery TPGs
|
||||||
|
* the caller is responsible for setting ->se_tpg_tfo ahead of
|
||||||
|
* calling core_tpg_register().
|
||||||
|
*/
|
||||||
|
if (se_wwn)
|
||||||
|
se_tpg->se_tpg_tfo = se_wwn->wwn_tf->tf_ops;
|
||||||
|
|
||||||
|
if (!se_tpg->se_tpg_tfo) {
|
||||||
|
pr_err("Unable to locate se_tpg->se_tpg_tfo pointer\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
INIT_HLIST_HEAD(&se_tpg->tpg_lun_hlist);
|
INIT_HLIST_HEAD(&se_tpg->tpg_lun_hlist);
|
||||||
se_tpg->proto_id = proto_id;
|
se_tpg->proto_id = proto_id;
|
||||||
se_tpg->se_tpg_tfo = tfo;
|
|
||||||
se_tpg->se_tpg_wwn = se_wwn;
|
se_tpg->se_tpg_wwn = se_wwn;
|
||||||
atomic_set(&se_tpg->tpg_pr_ref_count, 0);
|
atomic_set(&se_tpg->tpg_pr_ref_count, 0);
|
||||||
INIT_LIST_HEAD(&se_tpg->acl_node_list);
|
INIT_LIST_HEAD(&se_tpg->acl_node_list);
|
||||||
@ -524,9 +543,10 @@ int core_tpg_register(
|
|||||||
spin_unlock_bh(&tpg_lock);
|
spin_unlock_bh(&tpg_lock);
|
||||||
|
|
||||||
pr_debug("TARGET_CORE[%s]: Allocated portal_group for endpoint: %s, "
|
pr_debug("TARGET_CORE[%s]: Allocated portal_group for endpoint: %s, "
|
||||||
"Proto: %d, Portal Tag: %u\n", tfo->get_fabric_name(),
|
"Proto: %d, Portal Tag: %u\n", se_tpg->se_tpg_tfo->get_fabric_name(),
|
||||||
tfo->tpg_get_wwn(se_tpg) ? tfo->tpg_get_wwn(se_tpg) : NULL,
|
se_tpg->se_tpg_tfo->tpg_get_wwn(se_tpg) ?
|
||||||
se_tpg->proto_id, tfo->tpg_get_tag(se_tpg));
|
se_tpg->se_tpg_tfo->tpg_get_wwn(se_tpg) : NULL,
|
||||||
|
se_tpg->proto_id, se_tpg->se_tpg_tfo->tpg_get_tag(se_tpg));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -47,8 +47,6 @@
|
|||||||
|
|
||||||
#include "tcm_fc.h"
|
#include "tcm_fc.h"
|
||||||
|
|
||||||
static const struct target_core_fabric_ops ft_fabric_ops;
|
|
||||||
|
|
||||||
static LIST_HEAD(ft_wwn_list);
|
static LIST_HEAD(ft_wwn_list);
|
||||||
DEFINE_MUTEX(ft_lport_lock);
|
DEFINE_MUTEX(ft_lport_lock);
|
||||||
|
|
||||||
@ -282,8 +280,7 @@ static struct se_portal_group *ft_add_tpg(
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = core_tpg_register(&ft_fabric_ops, wwn, &tpg->se_tpg,
|
ret = core_tpg_register(wwn, &tpg->se_tpg, SCSI_PROTOCOL_FCP);
|
||||||
SCSI_PROTOCOL_FCP);
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
destroy_workqueue(wq);
|
destroy_workqueue(wq);
|
||||||
kfree(tpg);
|
kfree(tpg);
|
||||||
|
@ -28,8 +28,6 @@
|
|||||||
|
|
||||||
USB_GADGET_COMPOSITE_OPTIONS();
|
USB_GADGET_COMPOSITE_OPTIONS();
|
||||||
|
|
||||||
static const struct target_core_fabric_ops usbg_ops;
|
|
||||||
|
|
||||||
static inline struct f_uas *to_f_uas(struct usb_function *f)
|
static inline struct f_uas *to_f_uas(struct usb_function *f)
|
||||||
{
|
{
|
||||||
return container_of(f, struct f_uas, function);
|
return container_of(f, struct f_uas, function);
|
||||||
@ -1418,8 +1416,7 @@ static struct se_portal_group *usbg_make_tpg(
|
|||||||
* SPC doesn't assign a protocol identifier for USB-SCSI, so we
|
* SPC doesn't assign a protocol identifier for USB-SCSI, so we
|
||||||
* pretend to be SAS..
|
* pretend to be SAS..
|
||||||
*/
|
*/
|
||||||
ret = core_tpg_register(&usbg_ops, wwn, &tpg->se_tpg,
|
ret = core_tpg_register(wwn, &tpg->se_tpg, SCSI_PROTOCOL_SAS);
|
||||||
SCSI_PROTOCOL_SAS);
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
destroy_workqueue(tpg->workqueue);
|
destroy_workqueue(tpg->workqueue);
|
||||||
kfree(tpg);
|
kfree(tpg);
|
||||||
|
@ -206,7 +206,6 @@ struct vhost_scsi {
|
|||||||
int vs_events_nr; /* num of pending events, protected by vq->mutex */
|
int vs_events_nr; /* num of pending events, protected by vq->mutex */
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct target_core_fabric_ops vhost_scsi_ops;
|
|
||||||
static struct workqueue_struct *vhost_scsi_workqueue;
|
static struct workqueue_struct *vhost_scsi_workqueue;
|
||||||
|
|
||||||
/* Global spinlock to protect vhost_scsi TPG list for vhost IOCTL access */
|
/* Global spinlock to protect vhost_scsi TPG list for vhost IOCTL access */
|
||||||
@ -2001,8 +2000,7 @@ vhost_scsi_make_tpg(struct se_wwn *wwn,
|
|||||||
tpg->tport = tport;
|
tpg->tport = tport;
|
||||||
tpg->tport_tpgt = tpgt;
|
tpg->tport_tpgt = tpgt;
|
||||||
|
|
||||||
ret = core_tpg_register(&vhost_scsi_ops, wwn, &tpg->se_tpg,
|
ret = core_tpg_register(wwn, &tpg->se_tpg, tport->tport_proto_id);
|
||||||
tport->tport_proto_id);
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
kfree(tpg);
|
kfree(tpg);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -203,8 +203,6 @@ static LIST_HEAD(scsiback_free_pages);
|
|||||||
static DEFINE_MUTEX(scsiback_mutex);
|
static DEFINE_MUTEX(scsiback_mutex);
|
||||||
static LIST_HEAD(scsiback_list);
|
static LIST_HEAD(scsiback_list);
|
||||||
|
|
||||||
static const struct target_core_fabric_ops scsiback_ops;
|
|
||||||
|
|
||||||
static void scsiback_get(struct vscsibk_info *info)
|
static void scsiback_get(struct vscsibk_info *info)
|
||||||
{
|
{
|
||||||
atomic_inc(&info->nr_unreplied_reqs);
|
atomic_inc(&info->nr_unreplied_reqs);
|
||||||
@ -1765,8 +1763,7 @@ scsiback_make_tpg(struct se_wwn *wwn,
|
|||||||
tpg->tport = tport;
|
tpg->tport = tport;
|
||||||
tpg->tport_tpgt = tpgt;
|
tpg->tport_tpgt = tpgt;
|
||||||
|
|
||||||
ret = core_tpg_register(&scsiback_ops, wwn, &tpg->se_tpg,
|
ret = core_tpg_register(wwn, &tpg->se_tpg, tport->tport_proto_id);
|
||||||
tport->tport_proto_id);
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
kfree(tpg);
|
kfree(tpg);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -161,8 +161,7 @@ int core_tpg_set_initiator_node_queue_depth(struct se_portal_group *,
|
|||||||
unsigned char *, u32, int);
|
unsigned char *, u32, int);
|
||||||
int core_tpg_set_initiator_node_tag(struct se_portal_group *,
|
int core_tpg_set_initiator_node_tag(struct se_portal_group *,
|
||||||
struct se_node_acl *, const char *);
|
struct se_node_acl *, const char *);
|
||||||
int core_tpg_register(const struct target_core_fabric_ops *,
|
int core_tpg_register(struct se_wwn *, struct se_portal_group *, int);
|
||||||
struct se_wwn *, struct se_portal_group *, int);
|
|
||||||
int core_tpg_deregister(struct se_portal_group *);
|
int core_tpg_deregister(struct se_portal_group *);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user