target: Drop unnecessary core_tpg_register TFO parameter
[sfrench/cifs-2.6.git] / drivers / xen / xen-scsiback.c
index 07ef383252237a2a0fad0bda86994a12a941446e..25144a0ff07cbad45bd00828c419a4b9dd4f63cd 100644 (file)
@@ -56,7 +56,6 @@
 
 #include <target/target_core_base.h>
 #include <target/target_core_fabric.h>
-#include <target/target_core_configfs.h>
 #include <target/target_core_fabric_configfs.h>
 
 #include <asm/hypervisor.h>
@@ -204,9 +203,6 @@ static LIST_HEAD(scsiback_free_pages);
 static DEFINE_MUTEX(scsiback_mutex);
 static LIST_HEAD(scsiback_list);
 
-/* Local pointer to allocated TCM configfs fabric module */
-static struct target_fabric_configfs *scsiback_fabric_configfs;
-
 static void scsiback_get(struct vscsibk_info *info)
 {
        atomic_inc(&info->nr_unreplied_reqs);
@@ -401,6 +397,7 @@ static void scsiback_cmd_exec(struct vscsibk_pend *pending_req)
        memset(se_cmd, 0, sizeof(*se_cmd));
 
        scsiback_get(pending_req->info);
+       se_cmd->tag = pending_req->rqid;
        rc = target_submit_cmd_map_sgls(se_cmd, sess, pending_req->cmnd,
                        pending_req->sense_buffer, pending_req->v2p->lun,
                        pending_req->data_len, 0,
@@ -867,7 +864,8 @@ static int scsiback_add_translation_entry(struct vscsibk_info *info,
        struct list_head *head = &(info->v2p_entry_lists);
        unsigned long flags;
        char *lunp;
-       unsigned int lun;
+       unsigned int unpacked_lun;
+       struct se_lun *se_lun;
        struct scsiback_tpg *tpg_entry, *tpg = NULL;
        char *error = "doesn't exist";
 
@@ -878,7 +876,7 @@ static int scsiback_add_translation_entry(struct vscsibk_info *info,
        }
        *lunp = 0;
        lunp++;
-       if (kstrtouint(lunp, 10, &lun) || lun >= TRANSPORT_MAX_LUNS_PER_TPG) {
+       if (kstrtouint(lunp, 10, &unpacked_lun) || unpacked_lun >= TRANSPORT_MAX_LUNS_PER_TPG) {
                pr_err("lun number not valid: %s\n", lunp);
                return -EINVAL;
        }
@@ -887,15 +885,17 @@ static int scsiback_add_translation_entry(struct vscsibk_info *info,
        list_for_each_entry(tpg_entry, &scsiback_list, tv_tpg_list) {
                if (!strcmp(phy, tpg_entry->tport->tport_name) ||
                    !strcmp(phy, tpg_entry->param_alias)) {
-                       spin_lock(&tpg_entry->se_tpg.tpg_lun_lock);
-                       if (tpg_entry->se_tpg.tpg_lun_list[lun]->lun_status ==
-                           TRANSPORT_LUN_STATUS_ACTIVE) {
-                               if (!tpg_entry->tpg_nexus)
-                                       error = "nexus undefined";
-                               else
-                                       tpg = tpg_entry;
+                       mutex_lock(&tpg_entry->se_tpg.tpg_lun_mutex);
+                       hlist_for_each_entry(se_lun, &tpg_entry->se_tpg.tpg_lun_hlist, link) {
+                               if (se_lun->unpacked_lun == unpacked_lun) {
+                                       if (!tpg_entry->tpg_nexus)
+                                               error = "nexus undefined";
+                                       else
+                                               tpg = tpg_entry;
+                                       break;
+                               }
                        }
-                       spin_unlock(&tpg_entry->se_tpg.tpg_lun_lock);
+                       mutex_unlock(&tpg_entry->se_tpg.tpg_lun_mutex);
                        break;
                }
        }
@@ -907,7 +907,7 @@ static int scsiback_add_translation_entry(struct vscsibk_info *info,
        mutex_unlock(&scsiback_mutex);
 
        if (!tpg) {
-               pr_err("%s:%d %s\n", phy, lun, error);
+               pr_err("%s:%d %s\n", phy, unpacked_lun, error);
                return -ENODEV;
        }
 
@@ -935,7 +935,7 @@ static int scsiback_add_translation_entry(struct vscsibk_info *info,
        kref_init(&new->kref);
        new->v = *v;
        new->tpg = tpg;
-       new->lun = lun;
+       new->lun = unpacked_lun;
        list_add_tail(&new->l, head);
 
 out:
@@ -1255,28 +1255,6 @@ static char *scsiback_dump_proto_id(struct scsiback_tport *tport)
        return "Unknown";
 }
 
-static u8 scsiback_get_fabric_proto_ident(struct se_portal_group *se_tpg)
-{
-       struct scsiback_tpg *tpg = container_of(se_tpg,
-                               struct scsiback_tpg, se_tpg);
-       struct scsiback_tport *tport = tpg->tport;
-
-       switch (tport->tport_proto_id) {
-       case SCSI_PROTOCOL_SAS:
-               return sas_get_fabric_proto_ident(se_tpg);
-       case SCSI_PROTOCOL_FCP:
-               return fc_get_fabric_proto_ident(se_tpg);
-       case SCSI_PROTOCOL_ISCSI:
-               return iscsi_get_fabric_proto_ident(se_tpg);
-       default:
-               pr_err("Unknown tport_proto_id: 0x%02x, using SAS emulation\n",
-                       tport->tport_proto_id);
-               break;
-       }
-
-       return sas_get_fabric_proto_ident(se_tpg);
-}
-
 static char *scsiback_get_fabric_wwn(struct se_portal_group *se_tpg)
 {
        struct scsiback_tpg *tpg = container_of(se_tpg,
@@ -1293,102 +1271,6 @@ static u16 scsiback_get_tag(struct se_portal_group *se_tpg)
        return tpg->tport_tpgt;
 }
 
-static u32 scsiback_get_default_depth(struct se_portal_group *se_tpg)
-{
-       return 1;
-}
-
-static u32
-scsiback_get_pr_transport_id(struct se_portal_group *se_tpg,
-                             struct se_node_acl *se_nacl,
-                             struct t10_pr_registration *pr_reg,
-                             int *format_code,
-                             unsigned char *buf)
-{
-       struct scsiback_tpg *tpg = container_of(se_tpg,
-                               struct scsiback_tpg, se_tpg);
-       struct scsiback_tport *tport = tpg->tport;
-
-       switch (tport->tport_proto_id) {
-       case SCSI_PROTOCOL_SAS:
-               return sas_get_pr_transport_id(se_tpg, se_nacl, pr_reg,
-                                       format_code, buf);
-       case SCSI_PROTOCOL_FCP:
-               return fc_get_pr_transport_id(se_tpg, se_nacl, pr_reg,
-                                       format_code, buf);
-       case SCSI_PROTOCOL_ISCSI:
-               return iscsi_get_pr_transport_id(se_tpg, se_nacl, pr_reg,
-                                       format_code, buf);
-       default:
-               pr_err("Unknown tport_proto_id: 0x%02x, using SAS emulation\n",
-                       tport->tport_proto_id);
-               break;
-       }
-
-       return sas_get_pr_transport_id(se_tpg, se_nacl, pr_reg,
-                       format_code, buf);
-}
-
-static u32
-scsiback_get_pr_transport_id_len(struct se_portal_group *se_tpg,
-                                 struct se_node_acl *se_nacl,
-                                 struct t10_pr_registration *pr_reg,
-                                 int *format_code)
-{
-       struct scsiback_tpg *tpg = container_of(se_tpg,
-                               struct scsiback_tpg, se_tpg);
-       struct scsiback_tport *tport = tpg->tport;
-
-       switch (tport->tport_proto_id) {
-       case SCSI_PROTOCOL_SAS:
-               return sas_get_pr_transport_id_len(se_tpg, se_nacl, pr_reg,
-                                       format_code);
-       case SCSI_PROTOCOL_FCP:
-               return fc_get_pr_transport_id_len(se_tpg, se_nacl, pr_reg,
-                                       format_code);
-       case SCSI_PROTOCOL_ISCSI:
-               return iscsi_get_pr_transport_id_len(se_tpg, se_nacl, pr_reg,
-                                       format_code);
-       default:
-               pr_err("Unknown tport_proto_id: 0x%02x, using SAS emulation\n",
-                       tport->tport_proto_id);
-               break;
-       }
-
-       return sas_get_pr_transport_id_len(se_tpg, se_nacl, pr_reg,
-                       format_code);
-}
-
-static char *
-scsiback_parse_pr_out_transport_id(struct se_portal_group *se_tpg,
-                                   const char *buf,
-                                   u32 *out_tid_len,
-                                   char **port_nexus_ptr)
-{
-       struct scsiback_tpg *tpg = container_of(se_tpg,
-                               struct scsiback_tpg, se_tpg);
-       struct scsiback_tport *tport = tpg->tport;
-
-       switch (tport->tport_proto_id) {
-       case SCSI_PROTOCOL_SAS:
-               return sas_parse_pr_out_transport_id(se_tpg, buf, out_tid_len,
-                                       port_nexus_ptr);
-       case SCSI_PROTOCOL_FCP:
-               return fc_parse_pr_out_transport_id(se_tpg, buf, out_tid_len,
-                                       port_nexus_ptr);
-       case SCSI_PROTOCOL_ISCSI:
-               return iscsi_parse_pr_out_transport_id(se_tpg, buf, out_tid_len,
-                                       port_nexus_ptr);
-       default:
-               pr_err("Unknown tport_proto_id: 0x%02x, using SAS emulation\n",
-                       tport->tport_proto_id);
-               break;
-       }
-
-       return sas_parse_pr_out_transport_id(se_tpg, buf, out_tid_len,
-                       port_nexus_ptr);
-}
-
 static struct se_wwn *
 scsiback_make_tport(struct target_fabric_configfs *tf,
                     struct config_group *group,
@@ -1455,19 +1337,6 @@ static void scsiback_drop_tport(struct se_wwn *wwn)
        kfree(tport);
 }
 
-static struct se_node_acl *
-scsiback_alloc_fabric_acl(struct se_portal_group *se_tpg)
-{
-       return kzalloc(sizeof(struct se_node_acl), GFP_KERNEL);
-}
-
-static void
-scsiback_release_fabric_acl(struct se_portal_group *se_tpg,
-                            struct se_node_acl *se_nacl)
-{
-       kfree(se_nacl);
-}
-
 static u32 scsiback_tpg_get_inst_index(struct se_portal_group *se_tpg)
 {
        return 1;
@@ -1526,14 +1395,6 @@ static void scsiback_set_default_node_attrs(struct se_node_acl *nacl)
 {
 }
 
-static u32 scsiback_get_task_tag(struct se_cmd *se_cmd)
-{
-       struct vscsibk_pend *pending_req = container_of(se_cmd,
-                               struct vscsibk_pend, se_cmd);
-
-       return pending_req->rqid;
-}
-
 static int scsiback_get_cmd_state(struct se_cmd *se_cmd)
 {
        return 0;
@@ -1902,8 +1763,7 @@ scsiback_make_tpg(struct se_wwn *wwn,
        tpg->tport = tport;
        tpg->tport_tpgt = tpgt;
 
-       ret = core_tpg_register(&scsiback_fabric_configfs->tf_ops, wwn,
-                               &tpg->se_tpg, tpg, TRANSPORT_TPG_TYPE_NORMAL);
+       ret = core_tpg_register(wwn, &tpg->se_tpg, tport->tport_proto_id);
        if (ret < 0) {
                kfree(tpg);
                return NULL;
@@ -1944,25 +1804,19 @@ static int scsiback_check_false(struct se_portal_group *se_tpg)
        return 0;
 }
 
-static struct target_core_fabric_ops scsiback_ops = {
+static const struct target_core_fabric_ops scsiback_ops = {
+       .module                         = THIS_MODULE,
+       .name                           = "xen-pvscsi",
        .get_fabric_name                = scsiback_get_fabric_name,
-       .get_fabric_proto_ident         = scsiback_get_fabric_proto_ident,
        .tpg_get_wwn                    = scsiback_get_fabric_wwn,
        .tpg_get_tag                    = scsiback_get_tag,
-       .tpg_get_default_depth          = scsiback_get_default_depth,
-       .tpg_get_pr_transport_id        = scsiback_get_pr_transport_id,
-       .tpg_get_pr_transport_id_len    = scsiback_get_pr_transport_id_len,
-       .tpg_parse_pr_out_transport_id  = scsiback_parse_pr_out_transport_id,
        .tpg_check_demo_mode            = scsiback_check_true,
        .tpg_check_demo_mode_cache      = scsiback_check_true,
        .tpg_check_demo_mode_write_protect = scsiback_check_false,
        .tpg_check_prod_mode_write_protect = scsiback_check_false,
-       .tpg_alloc_fabric_acl           = scsiback_alloc_fabric_acl,
-       .tpg_release_fabric_acl         = scsiback_release_fabric_acl,
        .tpg_get_inst_index             = scsiback_tpg_get_inst_index,
        .check_stop_free                = scsiback_check_stop_free,
        .release_cmd                    = scsiback_release_cmd,
-       .put_session                    = NULL,
        .shutdown_session               = scsiback_shutdown_session,
        .close_session                  = scsiback_close_session,
        .sess_get_index                 = scsiback_sess_get_index,
@@ -1970,7 +1824,6 @@ static struct target_core_fabric_ops scsiback_ops = {
        .write_pending                  = scsiback_write_pending,
        .write_pending_status           = scsiback_write_pending_status,
        .set_default_node_attributes    = scsiback_set_default_node_attrs,
-       .get_task_tag                   = scsiback_get_task_tag,
        .get_cmd_state                  = scsiback_get_cmd_state,
        .queue_data_in                  = scsiback_queue_data_in,
        .queue_status                   = scsiback_queue_status,
@@ -1985,68 +1838,10 @@ static struct target_core_fabric_ops scsiback_ops = {
        .fabric_drop_tpg                = scsiback_drop_tpg,
        .fabric_post_link               = scsiback_port_link,
        .fabric_pre_unlink              = scsiback_port_unlink,
-       .fabric_make_np                 = NULL,
-       .fabric_drop_np                 = NULL,
-#if 0
-       .fabric_make_nodeacl            = scsiback_make_nodeacl,
-       .fabric_drop_nodeacl            = scsiback_drop_nodeacl,
-#endif
-};
 
-static int scsiback_register_configfs(void)
-{
-       struct target_fabric_configfs *fabric;
-       int ret;
-
-       pr_debug("fabric module %s on %s/%s on "UTS_RELEASE"\n",
-                VSCSI_VERSION, utsname()->sysname, utsname()->machine);
-       /*
-        * Register the top level struct config_item_type with TCM core
-        */
-       fabric = target_fabric_configfs_init(THIS_MODULE, "xen-pvscsi");
-       if (IS_ERR(fabric))
-               return PTR_ERR(fabric);
-
-       /*
-        * Setup fabric->tf_ops from our local scsiback_ops
-        */
-       fabric->tf_ops = scsiback_ops;
-       /*
-        * Setup default attribute lists for various fabric->tf_cit_tmpl
-        */
-       fabric->tf_cit_tmpl.tfc_wwn_cit.ct_attrs = scsiback_wwn_attrs;
-       fabric->tf_cit_tmpl.tfc_tpg_base_cit.ct_attrs = scsiback_tpg_attrs;
-       fabric->tf_cit_tmpl.tfc_tpg_attrib_cit.ct_attrs = NULL;
-       fabric->tf_cit_tmpl.tfc_tpg_param_cit.ct_attrs = scsiback_param_attrs;
-       fabric->tf_cit_tmpl.tfc_tpg_np_base_cit.ct_attrs = NULL;
-       fabric->tf_cit_tmpl.tfc_tpg_nacl_base_cit.ct_attrs = NULL;
-       fabric->tf_cit_tmpl.tfc_tpg_nacl_attrib_cit.ct_attrs = NULL;
-       fabric->tf_cit_tmpl.tfc_tpg_nacl_auth_cit.ct_attrs = NULL;
-       fabric->tf_cit_tmpl.tfc_tpg_nacl_param_cit.ct_attrs = NULL;
-       /*
-        * Register the fabric for use within TCM
-        */
-       ret = target_fabric_configfs_register(fabric);
-       if (ret < 0) {
-               target_fabric_configfs_free(fabric);
-               return ret;
-       }
-       /*
-        * Setup our local pointer to *fabric
-        */
-       scsiback_fabric_configfs = fabric;
-       pr_debug("Set fabric -> scsiback_fabric_configfs\n");
-       return 0;
-};
-
-static void scsiback_deregister_configfs(void)
-{
-       if (!scsiback_fabric_configfs)
-               return;
-
-       target_fabric_configfs_deregister(scsiback_fabric_configfs);
-       scsiback_fabric_configfs = NULL;
-       pr_debug("Cleared scsiback_fabric_configfs\n");
+       .tfc_wwn_attrs                  = scsiback_wwn_attrs,
+       .tfc_tpg_base_attrs             = scsiback_tpg_attrs,
+       .tfc_tpg_param_attrs            = scsiback_param_attrs,
 };
 
 static const struct xenbus_device_id scsiback_ids[] = {
@@ -2078,6 +1873,9 @@ static int __init scsiback_init(void)
        if (!xen_domain())
                return -ENODEV;
 
+       pr_debug("xen-pvscsi: fabric module %s on %s/%s on "UTS_RELEASE"\n",
+                VSCSI_VERSION, utsname()->sysname, utsname()->machine);
+
        scsiback_cachep = kmem_cache_create("vscsiif_cache",
                sizeof(struct vscsibk_pend), 0, 0, scsiback_init_pend);
        if (!scsiback_cachep)
@@ -2087,7 +1885,7 @@ static int __init scsiback_init(void)
        if (ret)
                goto out_cache_destroy;
 
-       ret = scsiback_register_configfs();
+       ret = target_register_template(&scsiback_ops);
        if (ret)
                goto out_unregister_xenbus;
 
@@ -2110,7 +1908,7 @@ static void __exit scsiback_exit(void)
                        BUG();
                gnttab_free_pages(1, &page);
        }
-       scsiback_deregister_configfs();
+       target_unregister_template(&scsiback_ops);
        xenbus_unregister_driver(&scsiback_driver);
        kmem_cache_destroy(scsiback_cachep);
 }