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,
 
 
 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,
 
 
 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),
        /*
 
 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,
 
 
 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,
 
 
 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,
 
 
 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,
 
 
        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;
                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.
                " 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"
 
 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;
 
        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);
 
 
 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,
 
 
 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,
 
 
 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,
 
 
 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,
 
 
 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;