scsi: target: replace fabric_ops.name with fabric_alias
iscsi_target_mod is the only LIO fabric where fabric_ops.name differs from the fabric_ops.fabric_name string. fabric_ops.name is used when matching target/$fabric ConfigFS create paths, so rename it .fabric_alias and fallback to target/$fabric vs .fabric_name comparison if .fabric_alias isn't initialised. iscsi_target_mod is the only fabric module to set .fabric_alias . All other fabric modules rely on .fabric_name matching and can drop the duplicate string. Signed-off-by: David Disseldorp <ddiss@suse.de> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
Родитель
30c7ca9350
Коммит
59a206b449
|
@ -3673,7 +3673,6 @@ static struct configfs_attribute *srpt_wwn_attrs[] = {
|
|||
|
||||
static const struct target_core_fabric_ops srpt_template = {
|
||||
.module = THIS_MODULE,
|
||||
.name = "srpt",
|
||||
.fabric_name = "srpt",
|
||||
.tpg_get_wwn = srpt_get_fabric_wwn,
|
||||
.tpg_get_tag = srpt_get_tag,
|
||||
|
|
|
@ -4039,7 +4039,6 @@ static struct configfs_attribute *ibmvscsis_tpg_attrs[] = {
|
|||
|
||||
static const struct target_core_fabric_ops ibmvscsis_ops = {
|
||||
.module = THIS_MODULE,
|
||||
.name = "ibmvscsis",
|
||||
.fabric_name = "ibmvscsis",
|
||||
.max_data_sg_nents = MAX_TXU / PAGE_SIZE,
|
||||
.tpg_get_wwn = ibmvscsis_get_fabric_wwn,
|
||||
|
|
|
@ -1910,7 +1910,6 @@ static struct configfs_attribute *tcm_qla2xxx_wwn_attrs[] = {
|
|||
|
||||
static const struct target_core_fabric_ops tcm_qla2xxx_ops = {
|
||||
.module = THIS_MODULE,
|
||||
.name = "qla2xxx",
|
||||
.fabric_name = "qla2xxx",
|
||||
.node_acl_size = sizeof(struct tcm_qla2xxx_nacl),
|
||||
/*
|
||||
|
@ -1959,7 +1958,6 @@ static const struct target_core_fabric_ops tcm_qla2xxx_ops = {
|
|||
|
||||
static const struct target_core_fabric_ops tcm_qla2xxx_npiv_ops = {
|
||||
.module = THIS_MODULE,
|
||||
.name = "qla2xxx_npiv",
|
||||
.fabric_name = "qla2xxx_npiv",
|
||||
.node_acl_size = sizeof(struct tcm_qla2xxx_nacl),
|
||||
.tpg_get_wwn = tcm_qla2xxx_get_fabric_wwn,
|
||||
|
|
|
@ -1544,7 +1544,7 @@ static void lio_release_cmd(struct se_cmd *se_cmd)
|
|||
|
||||
const struct target_core_fabric_ops iscsi_ops = {
|
||||
.module = THIS_MODULE,
|
||||
.name = "iscsi",
|
||||
.fabric_alias = "iscsi",
|
||||
.fabric_name = "iSCSI",
|
||||
.node_acl_size = sizeof(struct iscsi_node_acl),
|
||||
.tpg_get_wwn = lio_tpg_get_endpoint_wwn,
|
||||
|
|
|
@ -1144,7 +1144,6 @@ static struct configfs_attribute *tcm_loop_wwn_attrs[] = {
|
|||
|
||||
static const struct target_core_fabric_ops loop_ops = {
|
||||
.module = THIS_MODULE,
|
||||
.name = "loopback",
|
||||
.fabric_name = "loopback",
|
||||
.tpg_get_wwn = tcm_loop_get_endpoint_wwn,
|
||||
.tpg_get_tag = tcm_loop_get_tag,
|
||||
|
|
|
@ -2318,7 +2318,6 @@ static struct configfs_attribute *sbp_tpg_attrib_attrs[] = {
|
|||
|
||||
static const struct target_core_fabric_ops sbp_ops = {
|
||||
.module = THIS_MODULE,
|
||||
.name = "sbp",
|
||||
.fabric_name = "sbp",
|
||||
.tpg_get_wwn = sbp_get_fabric_wwn,
|
||||
.tpg_get_tag = sbp_get_tag,
|
||||
|
|
|
@ -172,7 +172,10 @@ static struct target_fabric_configfs *target_core_get_fabric(
|
|||
|
||||
mutex_lock(&g_tf_lock);
|
||||
list_for_each_entry(tf, &g_tf_list, tf_list) {
|
||||
if (!strcmp(tf->tf_ops->name, name)) {
|
||||
const char *cmp_name = tf->tf_ops->fabric_alias;
|
||||
if (!cmp_name)
|
||||
cmp_name = tf->tf_ops->fabric_name;
|
||||
if (!strcmp(cmp_name, name)) {
|
||||
atomic_inc(&tf->tf_access_cnt);
|
||||
mutex_unlock(&g_tf_lock);
|
||||
return tf;
|
||||
|
@ -249,7 +252,7 @@ static struct config_group *target_core_register_fabric(
|
|||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
pr_debug("Target_Core_ConfigFS: REGISTER -> Located fabric:"
|
||||
" %s\n", tf->tf_ops->name);
|
||||
" %s\n", tf->tf_ops->fabric_name);
|
||||
/*
|
||||
* On a successful target_core_get_fabric() look, the returned
|
||||
* struct target_fabric_configfs *tf will contain a usage reference.
|
||||
|
@ -282,7 +285,7 @@ static void target_core_deregister_fabric(
|
|||
" tf list\n", config_item_name(item));
|
||||
|
||||
pr_debug("Target_Core_ConfigFS: DEREGISTER -> located fabric:"
|
||||
" %s\n", tf->tf_ops->name);
|
||||
" %s\n", tf->tf_ops->fabric_name);
|
||||
atomic_dec(&tf->tf_access_cnt);
|
||||
|
||||
pr_debug("Target_Core_ConfigFS: DEREGISTER -> Releasing ci"
|
||||
|
@ -342,19 +345,22 @@ EXPORT_SYMBOL(target_undepend_item);
|
|||
|
||||
static int target_fabric_tf_ops_check(const struct target_core_fabric_ops *tfo)
|
||||
{
|
||||
if (!tfo->name) {
|
||||
pr_err("Missing tfo->name\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (strlen(tfo->name) >= TARGET_FABRIC_NAME_SIZE) {
|
||||
pr_err("Passed name: %s exceeds TARGET_FABRIC"
|
||||
"_NAME_SIZE\n", tfo->name);
|
||||
return -EINVAL;
|
||||
if (tfo->fabric_alias) {
|
||||
if (strlen(tfo->fabric_alias) >= TARGET_FABRIC_NAME_SIZE) {
|
||||
pr_err("Passed alias: %s exceeds "
|
||||
"TARGET_FABRIC_NAME_SIZE\n", tfo->fabric_alias);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
if (!tfo->fabric_name) {
|
||||
pr_err("Missing tfo->fabric_name\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (strlen(tfo->fabric_name) >= TARGET_FABRIC_NAME_SIZE) {
|
||||
pr_err("Passed name: %s exceeds "
|
||||
"TARGET_FABRIC_NAME_SIZE\n", tfo->fabric_name);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (!tfo->tpg_get_wwn) {
|
||||
pr_err("Missing tfo->tpg_get_wwn()\n");
|
||||
return -EINVAL;
|
||||
|
@ -486,7 +492,7 @@ void target_unregister_template(const struct target_core_fabric_ops *fo)
|
|||
|
||||
mutex_lock(&g_tf_lock);
|
||||
list_for_each_entry(t, &g_tf_list, tf_list) {
|
||||
if (!strcmp(t->tf_ops->name, fo->name)) {
|
||||
if (!strcmp(t->tf_ops->fabric_name, fo->fabric_name)) {
|
||||
BUG_ON(atomic_read(&t->tf_access_cnt));
|
||||
list_del(&t->tf_list);
|
||||
mutex_unlock(&g_tf_lock);
|
||||
|
|
|
@ -422,7 +422,6 @@ static u32 ft_tpg_get_inst_index(struct se_portal_group *se_tpg)
|
|||
|
||||
static const struct target_core_fabric_ops ft_fabric_ops = {
|
||||
.module = THIS_MODULE,
|
||||
.name = "fc",
|
||||
.fabric_name = "fc",
|
||||
.node_acl_size = sizeof(struct ft_node_acl),
|
||||
.tpg_get_wwn = ft_get_fabric_wwn,
|
||||
|
|
|
@ -1713,7 +1713,6 @@ static int usbg_check_stop_free(struct se_cmd *se_cmd)
|
|||
|
||||
static const struct target_core_fabric_ops usbg_ops = {
|
||||
.module = THIS_MODULE,
|
||||
.name = "usb_gadget",
|
||||
.fabric_name = "usb_gadget",
|
||||
.tpg_get_wwn = usbg_get_fabric_wwn,
|
||||
.tpg_get_tag = usbg_get_tag,
|
||||
|
|
|
@ -2284,7 +2284,6 @@ static struct configfs_attribute *vhost_scsi_wwn_attrs[] = {
|
|||
|
||||
static const struct target_core_fabric_ops vhost_scsi_ops = {
|
||||
.module = THIS_MODULE,
|
||||
.name = "vhost",
|
||||
.fabric_name = "vhost",
|
||||
.tpg_get_wwn = vhost_scsi_get_fabric_wwn,
|
||||
.tpg_get_tag = vhost_scsi_get_tpgt,
|
||||
|
|
|
@ -1805,7 +1805,6 @@ static int scsiback_check_false(struct se_portal_group *se_tpg)
|
|||
|
||||
static const struct target_core_fabric_ops scsiback_ops = {
|
||||
.module = THIS_MODULE,
|
||||
.name = "xen-pvscsi",
|
||||
.fabric_name = "xen-pvscsi",
|
||||
.tpg_get_wwn = scsiback_get_fabric_wwn,
|
||||
.tpg_get_tag = scsiback_get_tag,
|
||||
|
|
|
@ -8,10 +8,16 @@
|
|||
|
||||
struct target_core_fabric_ops {
|
||||
struct module *module;
|
||||
const char *name;
|
||||
/*
|
||||
* fabric_name is used for the ALUA state path and is stored on disk
|
||||
* with PR state.
|
||||
* XXX: Special case for iscsi/iSCSI...
|
||||
* If non-null, fabric_alias is used for matching target/$fabric
|
||||
* ConfigFS paths. If null, fabric_name is used for this (see below).
|
||||
*/
|
||||
const char *fabric_alias;
|
||||
/*
|
||||
* fabric_name is used for matching target/$fabric ConfigFS paths
|
||||
* without a fabric_alias (see above). It's also used for the ALUA state
|
||||
* path and is stored on disk with PR state.
|
||||
*/
|
||||
const char *fabric_name;
|
||||
size_t node_acl_size;
|
||||
|
|
Загрузка…
Ссылка в новой задаче