These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / xen / xen-scsiback.c
index b7f5150..51387d7 100644 (file)
 
 #include <generated/utsrelease.h>
 
-#include <scsi/scsi.h>
-#include <scsi/scsi_dbg.h>
-#include <scsi/scsi_eh.h>
-#include <scsi/scsi_tcq.h>
+#include <scsi/scsi_host.h> /* SG_ALL */
 
 #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,8 +199,6 @@ static LIST_HEAD(scsiback_free_pages);
 static DEFINE_MUTEX(scsiback_mutex);
 static LIST_HEAD(scsiback_list);
 
-static const struct target_core_fabric_ops scsiback_ops;
-
 static void scsiback_get(struct vscsibk_info *info)
 {
        atomic_inc(&info->nr_unreplied_reqs);
@@ -400,6 +393,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,
@@ -732,7 +726,7 @@ static int scsiback_do_cmd_fn(struct vscsibk_info *info)
                if (!pending_req)
                        return 1;
 
-               ring_req = *RING_GET_REQUEST(ring, rc);
+               RING_COPY_REQUEST(ring, rc, &ring_req);
                ring->req_cons = ++rc;
 
                err = prepare_pending_reqs(info, &ring_req, pending_req);
@@ -866,7 +860,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 long long unpacked_lun;
+       struct se_lun *se_lun;
        struct scsiback_tpg *tpg_entry, *tpg = NULL;
        char *error = "doesn't exist";
 
@@ -877,24 +872,27 @@ static int scsiback_add_translation_entry(struct vscsibk_info *info,
        }
        *lunp = 0;
        lunp++;
-       if (kstrtouint(lunp, 10, &lun) || lun >= TRANSPORT_MAX_LUNS_PER_TPG) {
+       err = kstrtoull(lunp, 10, &unpacked_lun);
+       if (err < 0) {
                pr_err("lun number not valid: %s\n", lunp);
-               return -EINVAL;
+               return err;
        }
 
        mutex_lock(&scsiback_mutex);
        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;
                }
        }
@@ -906,7 +904,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:%llu %s\n", phy, unpacked_lun, error);
                return -ENODEV;
        }
 
@@ -934,19 +932,19 @@ 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:
        spin_unlock_irqrestore(&info->v2p_lock, flags);
 
 out_free:
-       mutex_lock(&tpg->tv_tpg_mutex);
-       tpg->tv_tpg_fe_count--;
-       mutex_unlock(&tpg->tv_tpg_mutex);
-
-       if (err)
+       if (err) {
+               mutex_lock(&tpg->tv_tpg_mutex);
+               tpg->tv_tpg_fe_count--;
+               mutex_unlock(&tpg->tv_tpg_mutex);
                kfree(new);
+       }
 
        return err;
 }
@@ -1254,28 +1252,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,
@@ -1292,102 +1268,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,
@@ -1454,19 +1334,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;
@@ -1525,14 +1392,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;
@@ -1578,9 +1437,10 @@ static void scsiback_aborted_task(struct se_cmd *se_cmd)
 {
 }
 
-static ssize_t scsiback_tpg_param_show_alias(struct se_portal_group *se_tpg,
+static ssize_t scsiback_tpg_param_alias_show(struct config_item *item,
                                             char *page)
 {
+       struct se_portal_group *se_tpg = param_to_tpg(item);
        struct scsiback_tpg *tpg = container_of(se_tpg, struct scsiback_tpg,
                                                se_tpg);
        ssize_t rb;
@@ -1592,9 +1452,10 @@ static ssize_t scsiback_tpg_param_show_alias(struct se_portal_group *se_tpg,
        return rb;
 }
 
-static ssize_t scsiback_tpg_param_store_alias(struct se_portal_group *se_tpg,
+static ssize_t scsiback_tpg_param_alias_store(struct config_item *item,
                                              const char *page, size_t count)
 {
+       struct se_portal_group *se_tpg = param_to_tpg(item);
        struct scsiback_tpg *tpg = container_of(se_tpg, struct scsiback_tpg,
                                                se_tpg);
        int len;
@@ -1614,10 +1475,10 @@ static ssize_t scsiback_tpg_param_store_alias(struct se_portal_group *se_tpg,
        return count;
 }
 
-TF_TPG_PARAM_ATTR(scsiback, alias, S_IRUGO | S_IWUSR);
+CONFIGFS_ATTR(scsiback_tpg_param_, alias);
 
 static struct configfs_attribute *scsiback_param_attrs[] = {
-       &scsiback_tpg_param_alias.attr,
+       &scsiback_tpg_param_attr_alias,
        NULL,
 };
 
@@ -1725,9 +1586,9 @@ static int scsiback_drop_nexus(struct scsiback_tpg *tpg)
        return 0;
 }
 
-static ssize_t scsiback_tpg_show_nexus(struct se_portal_group *se_tpg,
-                                       char *page)
+static ssize_t scsiback_tpg_nexus_show(struct config_item *item, char *page)
 {
+       struct se_portal_group *se_tpg = to_tpg(item);
        struct scsiback_tpg *tpg = container_of(se_tpg,
                                struct scsiback_tpg, se_tpg);
        struct scsiback_nexus *tv_nexus;
@@ -1746,10 +1607,10 @@ static ssize_t scsiback_tpg_show_nexus(struct se_portal_group *se_tpg,
        return ret;
 }
 
-static ssize_t scsiback_tpg_store_nexus(struct se_portal_group *se_tpg,
-                                        const char *page,
-                                        size_t count)
+static ssize_t scsiback_tpg_nexus_store(struct config_item *item,
+               const char *page, size_t count)
 {
+       struct se_portal_group *se_tpg = to_tpg(item);
        struct scsiback_tpg *tpg = container_of(se_tpg,
                                struct scsiback_tpg, se_tpg);
        struct scsiback_tport *tport_wwn = tpg->tport;
@@ -1821,26 +1682,25 @@ check_newline:
        return count;
 }
 
-TF_TPG_BASE_ATTR(scsiback, nexus, S_IRUGO | S_IWUSR);
+CONFIGFS_ATTR(scsiback_tpg_, nexus);
 
 static struct configfs_attribute *scsiback_tpg_attrs[] = {
-       &scsiback_tpg_nexus.attr,
+       &scsiback_tpg_attr_nexus,
        NULL,
 };
 
 static ssize_t
-scsiback_wwn_show_attr_version(struct target_fabric_configfs *tf,
-                               char *page)
+scsiback_wwn_version_show(struct config_item *item, char *page)
 {
        return sprintf(page, "xen-pvscsi fabric module %s on %s/%s on "
                UTS_RELEASE"\n",
                VSCSI_VERSION, utsname()->sysname, utsname()->machine);
 }
 
-TF_WWN_ATTR_RO(scsiback, version);
+CONFIGFS_ATTR_RO(scsiback_wwn_, version);
 
 static struct configfs_attribute *scsiback_wwn_attrs[] = {
-       &scsiback_wwn_version.attr,
+       &scsiback_wwn_attr_version,
        NULL,
 };
 
@@ -1901,8 +1761,7 @@ scsiback_make_tpg(struct se_wwn *wwn,
        tpg->tport = tport;
        tpg->tport_tpgt = tpgt;
 
-       ret = core_tpg_register(&scsiback_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;
@@ -1947,23 +1806,15 @@ 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,
@@ -1971,7 +1822,6 @@ static const 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,
@@ -1986,12 +1836,6 @@ static const 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
 
        .tfc_wwn_attrs                  = scsiback_wwn_attrs,
        .tfc_tpg_base_attrs             = scsiback_tpg_attrs,