These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / infiniband / ulp / srpt / ib_srpt.c
index 9b84b4c..2e2fe81 100644 (file)
 #include <linux/string.h>
 #include <linux/delay.h>
 #include <linux/atomic.h>
+#include <scsi/scsi_proto.h>
 #include <scsi/scsi_tcq.h>
-#include <target/configfs_macros.h>
 #include <target/target_core_base.h>
-#include <target/target_core_fabric_configfs.h>
 #include <target/target_core_fabric.h>
-#include <target/target_core_configfs.h>
 #include "ib_srpt.h"
 
 /* Name of this kernel module. */
@@ -93,7 +91,6 @@ MODULE_PARM_DESC(srpt_service_guid,
                 " instead of using the node_guid of the first HCA.");
 
 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 int srpt_queue_status(struct se_cmd *cmd);
 
@@ -303,7 +300,7 @@ static void srpt_get_iou(struct ib_dm_mad *mad)
        int i;
 
        ioui = (struct ib_dm_iou_info *)mad->data;
-       ioui->change_id = __constant_cpu_to_be16(1);
+       ioui->change_id = cpu_to_be16(1);
        ioui->max_controllers = 16;
 
        /* set present for slot 1 and empty for the rest */
@@ -331,13 +328,13 @@ static void srpt_get_ioc(struct srpt_port *sport, u32 slot,
 
        if (!slot || slot > 16) {
                mad->mad_hdr.status
-                       = __constant_cpu_to_be16(DM_MAD_STATUS_INVALID_FIELD);
+                       = cpu_to_be16(DM_MAD_STATUS_INVALID_FIELD);
                return;
        }
 
        if (slot > 2) {
                mad->mad_hdr.status
-                       = __constant_cpu_to_be16(DM_MAD_STATUS_NO_IOC);
+                       = cpu_to_be16(DM_MAD_STATUS_NO_IOC);
                return;
        }
 
@@ -349,10 +346,10 @@ static void srpt_get_ioc(struct srpt_port *sport, u32 slot,
        iocp->device_version = cpu_to_be16(sdev->dev_attr.hw_ver);
        iocp->subsys_vendor_id = cpu_to_be32(sdev->dev_attr.vendor_id);
        iocp->subsys_device_id = 0x0;
-       iocp->io_class = __constant_cpu_to_be16(SRP_REV16A_IB_IO_CLASS);
-       iocp->io_subclass = __constant_cpu_to_be16(SRP_IO_SUBCLASS);
-       iocp->protocol = __constant_cpu_to_be16(SRP_PROTOCOL);
-       iocp->protocol_version = __constant_cpu_to_be16(SRP_PROTOCOL_VERSION);
+       iocp->io_class = cpu_to_be16(SRP_REV16A_IB_IO_CLASS);
+       iocp->io_subclass = cpu_to_be16(SRP_IO_SUBCLASS);
+       iocp->protocol = cpu_to_be16(SRP_PROTOCOL);
+       iocp->protocol_version = cpu_to_be16(SRP_PROTOCOL_VERSION);
        iocp->send_queue_depth = cpu_to_be16(sdev->srq_size);
        iocp->rdma_read_depth = 4;
        iocp->send_size = cpu_to_be32(srp_max_req_size);
@@ -380,13 +377,13 @@ static void srpt_get_svc_entries(u64 ioc_guid,
 
        if (!slot || slot > 16) {
                mad->mad_hdr.status
-                       = __constant_cpu_to_be16(DM_MAD_STATUS_INVALID_FIELD);
+                       = cpu_to_be16(DM_MAD_STATUS_INVALID_FIELD);
                return;
        }
 
        if (slot > 2 || lo > hi || hi > 1) {
                mad->mad_hdr.status
-                       = __constant_cpu_to_be16(DM_MAD_STATUS_NO_IOC);
+                       = cpu_to_be16(DM_MAD_STATUS_NO_IOC);
                return;
        }
 
@@ -437,7 +434,7 @@ static void srpt_mgmt_method_get(struct srpt_port *sp, struct ib_mad *rq_mad,
                break;
        default:
                rsp_mad->mad_hdr.status =
-                   __constant_cpu_to_be16(DM_MAD_STATUS_UNSUP_METHOD_ATTR);
+                   cpu_to_be16(DM_MAD_STATUS_UNSUP_METHOD_ATTR);
                break;
        }
 }
@@ -476,7 +473,8 @@ static void srpt_mad_recv_handler(struct ib_mad_agent *mad_agent,
        rsp = ib_create_send_mad(mad_agent, mad_wc->wc->src_qp,
                                 mad_wc->wc->pkey_index, 0,
                                 IB_MGMT_DEVICE_HDR, IB_MGMT_DEVICE_DATA,
-                                GFP_KERNEL);
+                                GFP_KERNEL,
+                                IB_MGMT_BASE_VERSION);
        if (IS_ERR(rsp))
                goto err_rsp;
 
@@ -493,11 +491,11 @@ static void srpt_mad_recv_handler(struct ib_mad_agent *mad_agent,
                break;
        case IB_MGMT_METHOD_SET:
                dm_mad->mad_hdr.status =
-                   __constant_cpu_to_be16(DM_MAD_STATUS_UNSUP_METHOD_ATTR);
+                   cpu_to_be16(DM_MAD_STATUS_UNSUP_METHOD_ATTR);
                break;
        default:
                dm_mad->mad_hdr.status =
-                   __constant_cpu_to_be16(DM_MAD_STATUS_UNSUP_METHOD);
+                   cpu_to_be16(DM_MAD_STATUS_UNSUP_METHOD);
                break;
        }
 
@@ -546,7 +544,8 @@ static int srpt_refresh_port(struct srpt_port *sport)
        sport->sm_lid = port_attr.sm_lid;
        sport->lid = port_attr.lid;
 
-       ret = ib_query_gid(sport->sdev->device, sport->port, 0, &sport->gid);
+       ret = ib_query_gid(sport->sdev->device, sport->port, 0, &sport->gid,
+                          NULL);
        if (ret)
                goto err_query_port;
 
@@ -783,7 +782,7 @@ static int srpt_post_recv(struct srpt_device *sdev,
 
        list.addr = ioctx->ioctx.dma;
        list.length = srp_max_req_size;
-       list.lkey = sdev->mr->lkey;
+       list.lkey = sdev->pd->local_dma_lkey;
 
        wr.next = NULL;
        wr.sg_list = &list;
@@ -818,7 +817,7 @@ static int srpt_post_send(struct srpt_rdma_ch *ch,
 
        list.addr = ioctx->ioctx.dma;
        list.length = len;
-       list.lkey = sdev->mr->lkey;
+       list.lkey = sdev->pd->local_dma_lkey;
 
        wr.next = NULL;
        wr.wr_id = encode_wr_id(SRPT_SEND, ioctx->ioctx.index);
@@ -1206,7 +1205,7 @@ static int srpt_map_sg_to_ib_sge(struct srpt_rdma_ch *ch,
 
                while (rsize > 0 && tsize > 0) {
                        sge->addr = dma_addr;
-                       sge->lkey = ch->sport->sdev->mr->lkey;
+                       sge->lkey = ch->sport->sdev->pd->local_dma_lkey;
 
                        if (rsize >= dma_len) {
                                sge->length =
@@ -1334,12 +1333,12 @@ static int srpt_abort_cmd(struct srpt_send_ioctx *ioctx)
 
                BUG_ON(ch->sess == NULL);
 
-               target_put_sess_cmd(ch->sess, &ioctx->cmd);
+               target_put_sess_cmd(&ioctx->cmd);
                goto out;
        }
 
        pr_debug("Aborting cmd with state %d and tag %lld\n", state,
-                ioctx->tag);
+                ioctx->cmd.tag);
 
        switch (state) {
        case SRPT_STATE_NEW:
@@ -1365,11 +1364,11 @@ static int srpt_abort_cmd(struct srpt_send_ioctx *ioctx)
                 * not been received in time.
                 */
                srpt_unmap_sg_to_ib_sge(ioctx->ch, ioctx);
-               target_put_sess_cmd(ioctx->ch->sess, &ioctx->cmd);
+               target_put_sess_cmd(&ioctx->cmd);
                break;
        case SRPT_STATE_MGMT_RSP_SENT:
                srpt_set_cmd_state(ioctx, SRPT_STATE_DONE);
-               target_put_sess_cmd(ioctx->ch->sess, &ioctx->cmd);
+               target_put_sess_cmd(&ioctx->cmd);
                break;
        default:
                WARN(1, "Unexpected command state (%d)", state);
@@ -1387,7 +1386,6 @@ static void srpt_handle_send_err_comp(struct srpt_rdma_ch *ch, u64 wr_id)
 {
        struct srpt_send_ioctx *ioctx;
        enum srpt_command_state state;
-       struct se_cmd *cmd;
        u32 index;
 
        atomic_inc(&ch->sq_wr_avail);
@@ -1395,7 +1393,6 @@ static void srpt_handle_send_err_comp(struct srpt_rdma_ch *ch, u64 wr_id)
        index = idx_from_wr_id(wr_id);
        ioctx = ch->ioctx_ring[index];
        state = srpt_get_cmd_state(ioctx);
-       cmd = &ioctx->cmd;
 
        WARN_ON(state != SRPT_STATE_CMD_RSP_SENT
                && state != SRPT_STATE_MGMT_RSP_SENT
@@ -1472,10 +1469,8 @@ static void srpt_handle_rdma_err_comp(struct srpt_rdma_ch *ch,
                                      struct srpt_send_ioctx *ioctx,
                                      enum srpt_opcode opcode)
 {
-       struct se_cmd *cmd;
        enum srpt_command_state state;
 
-       cmd = &ioctx->cmd;
        state = srpt_get_cmd_state(ioctx);
        switch (opcode) {
        case SRPT_RDMA_READ_LAST:
@@ -1539,7 +1534,7 @@ static int srpt_build_cmd_rsp(struct srpt_rdma_ch *ch,
        memset(srp_rsp, 0, sizeof *srp_rsp);
        srp_rsp->opcode = SRP_RSP;
        srp_rsp->req_lim_delta =
-               __constant_cpu_to_be32(1 + atomic_xchg(&ch->req_lim_delta, 0));
+               cpu_to_be32(1 + atomic_xchg(&ch->req_lim_delta, 0));
        srp_rsp->tag = tag;
        srp_rsp->status = status;
 
@@ -1589,8 +1584,8 @@ static int srpt_build_tskmgmt_rsp(struct srpt_rdma_ch *ch,
        memset(srp_rsp, 0, sizeof *srp_rsp);
 
        srp_rsp->opcode = SRP_RSP;
-       srp_rsp->req_lim_delta = __constant_cpu_to_be32(1
-                                   + atomic_xchg(&ch->req_lim_delta, 0));
+       srp_rsp->req_lim_delta =
+               cpu_to_be32(1 + atomic_xchg(&ch->req_lim_delta, 0));
        srp_rsp->tag = tag;
 
        srp_rsp->flags |= SRP_RSP_FLAG_RSPVALID;
@@ -1634,7 +1629,7 @@ static uint64_t srpt_unpack_lun(const uint8_t *lun, int len)
        switch (len) {
        case 8:
                if ((*((__be64 *)lun) &
-                    __constant_cpu_to_be64(0x0000FFFFFFFFFFFFLL)) != 0)
+                    cpu_to_be64(0x0000FFFFFFFFFFFFLL)) != 0)
                        goto out_err;
                break;
        case 4:
@@ -1679,7 +1674,7 @@ static int srpt_check_stop_free(struct se_cmd *cmd)
        struct srpt_send_ioctx *ioctx = container_of(cmd,
                                struct srpt_send_ioctx, cmd);
 
-       return target_put_sess_cmd(ioctx->ch->sess, &ioctx->cmd);
+       return target_put_sess_cmd(&ioctx->cmd);
 }
 
 /**
@@ -1701,7 +1696,7 @@ static int srpt_handle_cmd(struct srpt_rdma_ch *ch,
 
        srp_cmd = recv_ioctx->ioctx.buf;
        cmd = &send_ioctx->cmd;
-       send_ioctx->tag = srp_cmd->tag;
+       cmd->tag = srp_cmd->tag;
 
        switch (srp_cmd->task_attr) {
        case SRP_CMD_SIMPLE_Q:
@@ -1772,7 +1767,7 @@ static int srpt_rx_mgmt_fn_tag(struct srpt_send_ioctx *ioctx, u64 tag)
        for (i = 0; i < ch->rq_size; ++i) {
                target = ch->ioctx_ring[i];
                if (target->cmd.se_lun == ioctx->cmd.se_lun &&
-                   target->tag == tag &&
+                   target->cmd.tag == tag &&
                    srpt_get_cmd_state(target) != SRPT_STATE_DONE) {
                        ret = 0;
                        /* now let the target core abort &target->cmd; */
@@ -1831,7 +1826,7 @@ static void srpt_handle_tsk_mgmt(struct srpt_rdma_ch *ch,
                 srp_tsk->task_tag, srp_tsk->tag, ch->cm_id, ch->sess);
 
        srpt_set_cmd_state(send_ioctx, SRPT_STATE_MGMT);
-       send_ioctx->tag = srp_tsk->tag;
+       send_ioctx->cmd.tag = srp_tsk->tag;
        tcm_tmr = srp_tmr_to_tcm(srp_tsk->tsk_mgmt_func);
        if (tcm_tmr < 0) {
                send_ioctx->cmd.se_tmr_req->response =
@@ -2080,6 +2075,7 @@ static int srpt_create_ch_ib(struct srpt_rdma_ch *ch)
        struct srpt_port *sport = ch->sport;
        struct srpt_device *sdev = sport->sdev;
        u32 srp_sq_size = sport->port_attrib.srp_sq_size;
+       struct ib_cq_init_attr cq_attr = {};
        int ret;
 
        WARN_ON(ch->rq_size < 1);
@@ -2090,8 +2086,9 @@ static int srpt_create_ch_ib(struct srpt_rdma_ch *ch)
                goto out;
 
 retry:
+       cq_attr.cqe = ch->rq_size + srp_sq_size;
        ch->cq = ib_create_cq(sdev->device, srpt_completion, NULL, ch,
-                             ch->rq_size + srp_sq_size, 0);
+                             &cq_attr);
        if (IS_ERR(ch->cq)) {
                ret = PTR_ERR(ch->cq);
                pr_err("failed to create CQ cqe= %d ret= %d\n",
@@ -2176,12 +2173,9 @@ static void srpt_destroy_ch_ib(struct srpt_rdma_ch *ch)
  */
 static void __srpt_close_ch(struct srpt_rdma_ch *ch)
 {
-       struct srpt_device *sdev;
        enum rdma_ch_state prev_state;
        unsigned long flags;
 
-       sdev = ch->sport->sdev;
-
        spin_lock_irqsave(&ch->spinlock, flags);
        prev_state = ch->state;
        switch (prev_state) {
@@ -2454,8 +2448,8 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id,
        }
 
        if (it_iu_len > srp_max_req_size || it_iu_len < 64) {
-               rej->reason = __constant_cpu_to_be32(
-                               SRP_LOGIN_REJ_REQ_IT_IU_LENGTH_TOO_LARGE);
+               rej->reason = cpu_to_be32(
+                             SRP_LOGIN_REJ_REQ_IT_IU_LENGTH_TOO_LARGE);
                ret = -EINVAL;
                pr_err("rejected SRP_LOGIN_REQ because its"
                       " length (%d bytes) is out of range (%d .. %d)\n",
@@ -2464,8 +2458,8 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id,
        }
 
        if (!sport->enabled) {
-               rej->reason = __constant_cpu_to_be32(
-                            SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES);
+               rej->reason = cpu_to_be32(
+                             SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES);
                ret = -EINVAL;
                pr_err("rejected SRP_LOGIN_REQ because the target port"
                       " has not yet been enabled\n");
@@ -2510,8 +2504,8 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id,
        if (*(__be64 *)req->target_port_id != cpu_to_be64(srpt_service_guid)
            || *(__be64 *)(req->target_port_id + 8) !=
               cpu_to_be64(srpt_service_guid)) {
-               rej->reason = __constant_cpu_to_be32(
-                               SRP_LOGIN_REJ_UNABLE_ASSOCIATE_CHANNEL);
+               rej->reason = cpu_to_be32(
+                             SRP_LOGIN_REJ_UNABLE_ASSOCIATE_CHANNEL);
                ret = -ENOMEM;
                pr_err("rejected SRP_LOGIN_REQ because it"
                       " has an invalid target port identifier.\n");
@@ -2520,8 +2514,8 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id,
 
        ch = kzalloc(sizeof *ch, GFP_KERNEL);
        if (!ch) {
-               rej->reason = __constant_cpu_to_be32(
-                                       SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES);
+               rej->reason = cpu_to_be32(
+                             SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES);
                pr_err("rejected SRP_LOGIN_REQ because no memory.\n");
                ret = -ENOMEM;
                goto reject;
@@ -2557,8 +2551,8 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id,
 
        ret = srpt_create_ch_ib(ch);
        if (ret) {
-               rej->reason = __constant_cpu_to_be32(
-                               SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES);
+               rej->reason = cpu_to_be32(
+                             SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES);
                pr_err("rejected SRP_LOGIN_REQ because creating"
                       " a new RDMA channel failed.\n");
                goto free_ring;
@@ -2566,8 +2560,7 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id,
 
        ret = srpt_ch_qp_rtr(ch, ch->qp);
        if (ret) {
-               rej->reason = __constant_cpu_to_be32(
-                               SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES);
+               rej->reason = cpu_to_be32(SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES);
                pr_err("rejected SRP_LOGIN_REQ because enabling"
                       " RTR failed (error code = %d)\n", ret);
                goto destroy_ib;
@@ -2585,15 +2578,15 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id,
        if (!nacl) {
                pr_info("Rejected login because no ACL has been"
                        " configured yet for initiator %s.\n", ch->sess_name);
-               rej->reason = __constant_cpu_to_be32(
-                               SRP_LOGIN_REJ_CHANNEL_LIMIT_REACHED);
+               rej->reason = cpu_to_be32(
+                             SRP_LOGIN_REJ_CHANNEL_LIMIT_REACHED);
                goto destroy_ib;
        }
 
        ch->sess = transport_init_session(TARGET_PROT_NORMAL);
        if (IS_ERR(ch->sess)) {
-               rej->reason = __constant_cpu_to_be32(
-                               SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES);
+               rej->reason = cpu_to_be32(
+                             SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES);
                pr_debug("Failed to create session\n");
                goto deregister_session;
        }
@@ -2609,8 +2602,8 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id,
        rsp->max_it_iu_len = req->req_it_iu_len;
        rsp->max_ti_iu_len = req->req_it_iu_len;
        ch->max_ti_iu_len = it_iu_len;
-       rsp->buf_fmt = __constant_cpu_to_be16(SRP_BUF_FORMAT_DIRECT
-                                             | SRP_BUF_FORMAT_INDIRECT);
+       rsp->buf_fmt = cpu_to_be16(SRP_BUF_FORMAT_DIRECT
+                                  | SRP_BUF_FORMAT_INDIRECT);
        rsp->req_lim_delta = cpu_to_be32(ch->rq_size);
        atomic_set(&ch->req_lim, ch->rq_size);
        atomic_set(&ch->req_lim_delta, 0);
@@ -2660,8 +2653,8 @@ free_ch:
 reject:
        rej->opcode = SRP_LOGIN_REJ;
        rej->tag = req->tag;
-       rej->buf_fmt = __constant_cpu_to_be16(SRP_BUF_FORMAT_DIRECT
-                                             | SRP_BUF_FORMAT_INDIRECT);
+       rej->buf_fmt = cpu_to_be16(SRP_BUF_FORMAT_DIRECT
+                                  | SRP_BUF_FORMAT_INDIRECT);
 
        ib_send_cm_rej(cm_id, IB_CM_REJ_CONSUMER_DEFINED, NULL, 0,
                             (void *)rej, sizeof *rej);
@@ -2828,7 +2821,7 @@ static int srpt_cm_handler(struct ib_cm_id *cm_id, struct ib_cm_event *event)
 static int srpt_perform_rdmas(struct srpt_rdma_ch *ch,
                              struct srpt_send_ioctx *ioctx)
 {
-       struct ib_send_wr wr;
+       struct ib_rdma_wr wr;
        struct ib_send_wr *bad_wr;
        struct rdma_iu *riu;
        int i;
@@ -2856,29 +2849,29 @@ static int srpt_perform_rdmas(struct srpt_rdma_ch *ch,
 
        for (i = 0; i < n_rdma; ++i, ++riu) {
                if (dir == DMA_FROM_DEVICE) {
-                       wr.opcode = IB_WR_RDMA_WRITE;
-                       wr.wr_id = encode_wr_id(i == n_rdma - 1 ?
+                       wr.wr.opcode = IB_WR_RDMA_WRITE;
+                       wr.wr.wr_id = encode_wr_id(i == n_rdma - 1 ?
                                                SRPT_RDMA_WRITE_LAST :
                                                SRPT_RDMA_MID,
                                                ioctx->ioctx.index);
                } else {
-                       wr.opcode = IB_WR_RDMA_READ;
-                       wr.wr_id = encode_wr_id(i == n_rdma - 1 ?
+                       wr.wr.opcode = IB_WR_RDMA_READ;
+                       wr.wr.wr_id = encode_wr_id(i == n_rdma - 1 ?
                                                SRPT_RDMA_READ_LAST :
                                                SRPT_RDMA_MID,
                                                ioctx->ioctx.index);
                }
-               wr.next = NULL;
-               wr.wr.rdma.remote_addr = riu->raddr;
-               wr.wr.rdma.rkey = riu->rkey;
-               wr.num_sge = riu->sge_cnt;
-               wr.sg_list = riu->sge;
+               wr.wr.next = NULL;
+               wr.remote_addr = riu->raddr;
+               wr.rkey = riu->rkey;
+               wr.wr.num_sge = riu->sge_cnt;
+               wr.wr.sg_list = riu->sge;
 
                /* only get completion event for the last rdma write */
                if (i == (n_rdma - 1) && dir == DMA_TO_DEVICE)
-                       wr.send_flags = IB_SEND_SIGNALED;
+                       wr.wr.send_flags = IB_SEND_SIGNALED;
 
-               ret = ib_post_send(ch->qp, &wr, &bad_wr);
+               ret = ib_post_send(ch->qp, &wr.wr, &bad_wr);
                if (ret)
                        break;
        }
@@ -2887,11 +2880,11 @@ static int srpt_perform_rdmas(struct srpt_rdma_ch *ch,
                pr_err("%s[%d]: ib_post_send() returned %d for %d/%d\n",
                                 __func__, __LINE__, ret, i, n_rdma);
        if (ret && i > 0) {
-               wr.num_sge = 0;
-               wr.wr_id = encode_wr_id(SRPT_RDMA_ABORT, ioctx->ioctx.index);
-               wr.send_flags = IB_SEND_SIGNALED;
+               wr.wr.num_sge = 0;
+               wr.wr.wr_id = encode_wr_id(SRPT_RDMA_ABORT, ioctx->ioctx.index);
+               wr.wr.send_flags = IB_SEND_SIGNALED;
                while (ch->state == CH_LIVE &&
-                       ib_post_send(ch->qp, &wr, &bad_wr) != 0) {
+                       ib_post_send(ch->qp, &wr.wr, &bad_wr) != 0) {
                        pr_info("Trying to abort failed RDMA transfer [%d]\n",
                                ioctx->ioctx.index);
                        msleep(1000);
@@ -2979,7 +2972,7 @@ static int srpt_write_pending(struct se_cmd *se_cmd)
        case CH_DRAINING:
        case CH_RELEASING:
                pr_debug("cmd with tag %lld: channel disconnecting\n",
-                        ioctx->tag);
+                        ioctx->cmd.tag);
                srpt_set_cmd_state(ioctx, SRPT_STATE_DATA_IN);
                ret = -EINVAL;
                goto out;
@@ -3054,27 +3047,27 @@ static void srpt_queue_response(struct se_cmd *cmd)
                ret = srpt_xfer_data(ch, ioctx);
                if (ret) {
                        pr_err("xfer_data failed for tag %llu\n",
-                              ioctx->tag);
+                              ioctx->cmd.tag);
                        return;
                }
        }
 
        if (state != SRPT_STATE_MGMT)
-               resp_len = srpt_build_cmd_rsp(ch, ioctx, ioctx->tag,
+               resp_len = srpt_build_cmd_rsp(ch, ioctx, ioctx->cmd.tag,
                                              cmd->scsi_status);
        else {
                srp_tm_status
                        = tcm_to_srp_tsk_mgmt_status(cmd->se_tmr_req->response);
                resp_len = srpt_build_tskmgmt_rsp(ch, ioctx, srp_tm_status,
-                                                ioctx->tag);
+                                                ioctx->cmd.tag);
        }
        ret = srpt_post_send(ch, ioctx, resp_len);
        if (ret) {
                pr_err("sending cmd response failed for tag %llu\n",
-                      ioctx->tag);
+                      ioctx->cmd.tag);
                srpt_unmap_sg_to_ib_sge(ch, ioctx);
                srpt_set_cmd_state(ioctx, SRPT_STATE_DONE);
-               target_put_sess_cmd(ioctx->ch->sess, &ioctx->cmd);
+               target_put_sess_cmd(&ioctx->cmd);
        }
 }
 
@@ -3217,10 +3210,6 @@ static void srpt_add_one(struct ib_device *device)
        if (IS_ERR(sdev->pd))
                goto free_dev;
 
-       sdev->mr = ib_get_dma_mr(sdev->pd, IB_ACCESS_LOCAL_WRITE);
-       if (IS_ERR(sdev->mr))
-               goto err_pd;
-
        sdev->srq_size = min(srpt_srq_size, sdev->dev_attr.max_srq_wr);
 
        srq_attr.event_handler = srpt_srq_event;
@@ -3232,7 +3221,7 @@ static void srpt_add_one(struct ib_device *device)
 
        sdev->srq = ib_create_srq(sdev->pd, &srq_attr);
        if (IS_ERR(sdev->srq))
-               goto err_mr;
+               goto err_pd;
 
        pr_debug("%s: create SRQ #wr= %d max_allow=%d dev= %s\n",
                 __func__, sdev->srq_size, sdev->dev_attr.max_srq_wr,
@@ -3256,7 +3245,7 @@ static void srpt_add_one(struct ib_device *device)
         * in the system as service_id; therefore, the target_id will change
         * if this HCA is gone bad and replaced by different HCA
         */
-       if (ib_cm_listen(sdev->cm_id, cpu_to_be64(srpt_service_guid), 0, NULL))
+       if (ib_cm_listen(sdev->cm_id, cpu_to_be64(srpt_service_guid), 0))
                goto err_cm;
 
        INIT_IB_EVENT_HANDLER(&sdev->event_handler, sdev->device,
@@ -3317,8 +3306,6 @@ err_cm:
        ib_destroy_cm_id(sdev->cm_id);
 err_srq:
        ib_destroy_srq(sdev->srq);
-err_mr:
-       ib_dereg_mr(sdev->mr);
 err_pd:
        ib_dealloc_pd(sdev->pd);
 free_dev:
@@ -3332,12 +3319,11 @@ err:
 /**
  * srpt_remove_one() - InfiniBand device removal callback function.
  */
-static void srpt_remove_one(struct ib_device *device)
+static void srpt_remove_one(struct ib_device *device, void *client_data)
 {
-       struct srpt_device *sdev;
+       struct srpt_device *sdev = client_data;
        int i;
 
-       sdev = ib_get_client_data(device, &srpt_client);
        if (!sdev) {
                pr_info("%s(%s): nothing to do.\n", __func__, device->name);
                return;
@@ -3364,7 +3350,6 @@ static void srpt_remove_one(struct ib_device *device)
        srpt_release_sdev(sdev);
 
        ib_destroy_srq(sdev->srq);
-       ib_dereg_mr(sdev->mr);
        ib_dealloc_pd(sdev->pd);
 
        srpt_free_ioctx_ring((struct srpt_ioctx **)sdev->ioctx_ring, sdev,
@@ -3394,11 +3379,6 @@ static char *srpt_get_fabric_name(void)
        return "srpt";
 }
 
-static u8 srpt_get_fabric_proto_ident(struct se_portal_group *se_tpg)
-{
-       return SCSI_TRANSPORTID_PROTOCOLID_SRP;
-}
-
 static char *srpt_get_fabric_wwn(struct se_portal_group *tpg)
 {
        struct srpt_port *sport = container_of(tpg, struct srpt_port, port_tpg_1);
@@ -3411,69 +3391,6 @@ static u16 srpt_get_tag(struct se_portal_group *tpg)
        return 1;
 }
 
-static u32 srpt_get_default_depth(struct se_portal_group *se_tpg)
-{
-       return 1;
-}
-
-static u32 srpt_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 srpt_node_acl *nacl;
-       struct spc_rdma_transport_id *tr_id;
-
-       nacl = container_of(se_nacl, struct srpt_node_acl, nacl);
-       tr_id = (void *)buf;
-       tr_id->protocol_identifier = SCSI_TRANSPORTID_PROTOCOLID_SRP;
-       memcpy(tr_id->i_port_id, nacl->i_port_id, sizeof(tr_id->i_port_id));
-       return sizeof(*tr_id);
-}
-
-static u32 srpt_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)
-{
-       *format_code = 0;
-       return sizeof(struct spc_rdma_transport_id);
-}
-
-static char *srpt_parse_pr_out_transport_id(struct se_portal_group *se_tpg,
-                                           const char *buf, u32 *out_tid_len,
-                                           char **port_nexus_ptr)
-{
-       struct spc_rdma_transport_id *tr_id;
-
-       *port_nexus_ptr = NULL;
-       *out_tid_len = sizeof(struct spc_rdma_transport_id);
-       tr_id = (void *)buf;
-       return (char *)tr_id->i_port_id;
-}
-
-static struct se_node_acl *srpt_alloc_fabric_acl(struct se_portal_group *se_tpg)
-{
-       struct srpt_node_acl *nacl;
-
-       nacl = kzalloc(sizeof(struct srpt_node_acl), GFP_KERNEL);
-       if (!nacl) {
-               pr_err("Unable to allocate struct srpt_node_acl\n");
-               return NULL;
-       }
-
-       return &nacl->nacl;
-}
-
-static void srpt_release_fabric_acl(struct se_portal_group *se_tpg,
-                                   struct se_node_acl *se_nacl)
-{
-       struct srpt_node_acl *nacl;
-
-       nacl = container_of(se_nacl, struct srpt_node_acl, nacl);
-       kfree(nacl);
-}
-
 static u32 srpt_tpg_get_inst_index(struct se_portal_group *se_tpg)
 {
        return 1;
@@ -3547,14 +3464,6 @@ static void srpt_set_default_node_attrs(struct se_node_acl *nacl)
 {
 }
 
-static u32 srpt_get_task_tag(struct se_cmd *se_cmd)
-{
-       struct srpt_send_ioctx *ioctx;
-
-       ioctx = container_of(se_cmd, struct srpt_send_ioctx, cmd);
-       return ioctx->tag;
-}
-
 /* Note: only used from inside debug printk's by the TCM core. */
 static int srpt_get_tcm_cmd_state(struct se_cmd *se_cmd)
 {
@@ -3597,40 +3506,19 @@ out:
  * configfs callback function invoked for
  * mkdir /sys/kernel/config/target/$driver/$port/$tpg/acls/$i_port_id
  */
-static struct se_node_acl *srpt_make_nodeacl(struct se_portal_group *tpg,
-                                            struct config_group *group,
-                                            const char *name)
+static int srpt_init_nodeacl(struct se_node_acl *se_nacl, const char *name)
 {
-       struct srpt_port *sport = container_of(tpg, struct srpt_port, port_tpg_1);
-       struct se_node_acl *se_nacl, *se_nacl_new;
-       struct srpt_node_acl *nacl;
-       int ret = 0;
-       u32 nexus_depth = 1;
+       struct srpt_port *sport =
+               container_of(se_nacl->se_tpg, struct srpt_port, port_tpg_1);
+       struct srpt_node_acl *nacl =
+               container_of(se_nacl, struct srpt_node_acl, nacl);
        u8 i_port_id[16];
 
        if (srpt_parse_i_port_id(i_port_id, name) < 0) {
                pr_err("invalid initiator port ID %s\n", name);
-               ret = -EINVAL;
-               goto err;
+               return -EINVAL;
        }
 
-       se_nacl_new = srpt_alloc_fabric_acl(tpg);
-       if (!se_nacl_new) {
-               ret = -ENOMEM;
-               goto err;
-       }
-       /*
-        * nacl_new may be released by core_tpg_add_initiator_node_acl()
-        * when converting a node ACL from demo mode to explict
-        */
-       se_nacl = core_tpg_add_initiator_node_acl(tpg, se_nacl_new, name,
-                                                 nexus_depth);
-       if (IS_ERR(se_nacl)) {
-               ret = PTR_ERR(se_nacl);
-               goto err;
-       }
-       /* Locate our struct srpt_node_acl and set sdev and i_port_id. */
-       nacl = container_of(se_nacl, struct srpt_node_acl, nacl);
        memcpy(&nacl->i_port_id[0], &i_port_id[0], 16);
        nacl->sport = sport;
 
@@ -3638,45 +3526,37 @@ static struct se_node_acl *srpt_make_nodeacl(struct se_portal_group *tpg,
        list_add_tail(&nacl->list, &sport->port_acl_list);
        spin_unlock_irq(&sport->port_acl_lock);
 
-       return se_nacl;
-err:
-       return ERR_PTR(ret);
+       return 0;
 }
 
 /*
  * configfs callback function invoked for
  * rmdir /sys/kernel/config/target/$driver/$port/$tpg/acls/$i_port_id
  */
-static void srpt_drop_nodeacl(struct se_node_acl *se_nacl)
+static void srpt_cleanup_nodeacl(struct se_node_acl *se_nacl)
 {
-       struct srpt_node_acl *nacl;
-       struct srpt_device *sdev;
-       struct srpt_port *sport;
+       struct srpt_node_acl *nacl =
+               container_of(se_nacl, struct srpt_node_acl, nacl);
+       struct srpt_port *sport = nacl->sport;
 
-       nacl = container_of(se_nacl, struct srpt_node_acl, nacl);
-       sport = nacl->sport;
-       sdev = sport->sdev;
        spin_lock_irq(&sport->port_acl_lock);
        list_del(&nacl->list);
        spin_unlock_irq(&sport->port_acl_lock);
-       core_tpg_del_initiator_node_acl(&sport->port_tpg_1, se_nacl, 1);
-       srpt_release_fabric_acl(NULL, se_nacl);
 }
 
-static ssize_t srpt_tpg_attrib_show_srp_max_rdma_size(
-       struct se_portal_group *se_tpg,
-       char *page)
+static ssize_t srpt_tpg_attrib_srp_max_rdma_size_show(struct config_item *item,
+               char *page)
 {
+       struct se_portal_group *se_tpg = attrib_to_tpg(item);
        struct srpt_port *sport = container_of(se_tpg, struct srpt_port, port_tpg_1);
 
        return sprintf(page, "%u\n", sport->port_attrib.srp_max_rdma_size);
 }
 
-static ssize_t srpt_tpg_attrib_store_srp_max_rdma_size(
-       struct se_portal_group *se_tpg,
-       const char *page,
-       size_t count)
+static ssize_t srpt_tpg_attrib_srp_max_rdma_size_store(struct config_item *item,
+               const char *page, size_t count)
 {
+       struct se_portal_group *se_tpg = attrib_to_tpg(item);
        struct srpt_port *sport = container_of(se_tpg, struct srpt_port, port_tpg_1);
        unsigned long val;
        int ret;
@@ -3701,22 +3581,19 @@ static ssize_t srpt_tpg_attrib_store_srp_max_rdma_size(
        return count;
 }
 
-TF_TPG_ATTRIB_ATTR(srpt, srp_max_rdma_size, S_IRUGO | S_IWUSR);
-
-static ssize_t srpt_tpg_attrib_show_srp_max_rsp_size(
-       struct se_portal_group *se_tpg,
-       char *page)
+static ssize_t srpt_tpg_attrib_srp_max_rsp_size_show(struct config_item *item,
+               char *page)
 {
+       struct se_portal_group *se_tpg = attrib_to_tpg(item);
        struct srpt_port *sport = container_of(se_tpg, struct srpt_port, port_tpg_1);
 
        return sprintf(page, "%u\n", sport->port_attrib.srp_max_rsp_size);
 }
 
-static ssize_t srpt_tpg_attrib_store_srp_max_rsp_size(
-       struct se_portal_group *se_tpg,
-       const char *page,
-       size_t count)
+static ssize_t srpt_tpg_attrib_srp_max_rsp_size_store(struct config_item *item,
+               const char *page, size_t count)
 {
+       struct se_portal_group *se_tpg = attrib_to_tpg(item);
        struct srpt_port *sport = container_of(se_tpg, struct srpt_port, port_tpg_1);
        unsigned long val;
        int ret;
@@ -3741,22 +3618,19 @@ static ssize_t srpt_tpg_attrib_store_srp_max_rsp_size(
        return count;
 }
 
-TF_TPG_ATTRIB_ATTR(srpt, srp_max_rsp_size, S_IRUGO | S_IWUSR);
-
-static ssize_t srpt_tpg_attrib_show_srp_sq_size(
-       struct se_portal_group *se_tpg,
-       char *page)
+static ssize_t srpt_tpg_attrib_srp_sq_size_show(struct config_item *item,
+               char *page)
 {
+       struct se_portal_group *se_tpg = attrib_to_tpg(item);
        struct srpt_port *sport = container_of(se_tpg, struct srpt_port, port_tpg_1);
 
        return sprintf(page, "%u\n", sport->port_attrib.srp_sq_size);
 }
 
-static ssize_t srpt_tpg_attrib_store_srp_sq_size(
-       struct se_portal_group *se_tpg,
-       const char *page,
-       size_t count)
+static ssize_t srpt_tpg_attrib_srp_sq_size_store(struct config_item *item,
+               const char *page, size_t count)
 {
+       struct se_portal_group *se_tpg = attrib_to_tpg(item);
        struct srpt_port *sport = container_of(se_tpg, struct srpt_port, port_tpg_1);
        unsigned long val;
        int ret;
@@ -3781,29 +3655,29 @@ static ssize_t srpt_tpg_attrib_store_srp_sq_size(
        return count;
 }
 
-TF_TPG_ATTRIB_ATTR(srpt, srp_sq_size, S_IRUGO | S_IWUSR);
+CONFIGFS_ATTR(srpt_tpg_attrib_,  srp_max_rdma_size);
+CONFIGFS_ATTR(srpt_tpg_attrib_,  srp_max_rsp_size);
+CONFIGFS_ATTR(srpt_tpg_attrib_,  srp_sq_size);
 
 static struct configfs_attribute *srpt_tpg_attrib_attrs[] = {
-       &srpt_tpg_attrib_srp_max_rdma_size.attr,
-       &srpt_tpg_attrib_srp_max_rsp_size.attr,
-       &srpt_tpg_attrib_srp_sq_size.attr,
+       &srpt_tpg_attrib_attr_srp_max_rdma_size,
+       &srpt_tpg_attrib_attr_srp_max_rsp_size,
+       &srpt_tpg_attrib_attr_srp_sq_size,
        NULL,
 };
 
-static ssize_t srpt_tpg_show_enable(
-       struct se_portal_group *se_tpg,
-       char *page)
+static ssize_t srpt_tpg_enable_show(struct config_item *item, char *page)
 {
+       struct se_portal_group *se_tpg = to_tpg(item);
        struct srpt_port *sport = container_of(se_tpg, struct srpt_port, port_tpg_1);
 
        return snprintf(page, PAGE_SIZE, "%d\n", (sport->enabled) ? 1: 0);
 }
 
-static ssize_t srpt_tpg_store_enable(
-       struct se_portal_group *se_tpg,
-       const char *page,
-       size_t count)
+static ssize_t srpt_tpg_enable_store(struct config_item *item,
+               const char *page, size_t count)
 {
+       struct se_portal_group *se_tpg = to_tpg(item);
        struct srpt_port *sport = container_of(se_tpg, struct srpt_port, port_tpg_1);
        unsigned long tmp;
         int ret;
@@ -3826,10 +3700,10 @@ static ssize_t srpt_tpg_store_enable(
        return count;
 }
 
-TF_TPG_BASE_ATTR(srpt, enable, S_IRUGO | S_IWUSR);
+CONFIGFS_ATTR(srpt_tpg_, enable);
 
 static struct configfs_attribute *srpt_tpg_attrs[] = {
-       &srpt_tpg_enable.attr,
+       &srpt_tpg_attr_enable,
        NULL,
 };
 
@@ -3845,8 +3719,7 @@ static struct se_portal_group *srpt_make_tpg(struct se_wwn *wwn,
        int res;
 
        /* Initialize sport->port_wwn and sport->port_tpg_1 */
-       res = core_tpg_register(&srpt_template, &sport->port_wwn,
-                       &sport->port_tpg_1, sport, TRANSPORT_TPG_TYPE_NORMAL);
+       res = core_tpg_register(&sport->port_wwn, &sport->port_tpg_1, SCSI_PROTOCOL_SRP);
        if (res)
                return ERR_PTR(res);
 
@@ -3900,36 +3773,29 @@ static void srpt_drop_tport(struct se_wwn *wwn)
        pr_debug("drop_tport(%s\n", config_item_name(&sport->port_wwn.wwn_group.cg_item));
 }
 
-static ssize_t srpt_wwn_show_attr_version(struct target_fabric_configfs *tf,
-                                             char *buf)
+static ssize_t srpt_wwn_version_show(struct config_item *item, char *buf)
 {
        return scnprintf(buf, PAGE_SIZE, "%s\n", DRV_VERSION);
 }
 
-TF_WWN_ATTR_RO(srpt, version);
+CONFIGFS_ATTR_RO(srpt_wwn_, version);
 
 static struct configfs_attribute *srpt_wwn_attrs[] = {
-       &srpt_wwn_version.attr,
+       &srpt_wwn_attr_version,
        NULL,
 };
 
 static const struct target_core_fabric_ops srpt_template = {
        .module                         = THIS_MODULE,
        .name                           = "srpt",
+       .node_acl_size                  = sizeof(struct srpt_node_acl),
        .get_fabric_name                = srpt_get_fabric_name,
-       .get_fabric_proto_ident         = srpt_get_fabric_proto_ident,
        .tpg_get_wwn                    = srpt_get_fabric_wwn,
        .tpg_get_tag                    = srpt_get_tag,
-       .tpg_get_default_depth          = srpt_get_default_depth,
-       .tpg_get_pr_transport_id        = srpt_get_pr_transport_id,
-       .tpg_get_pr_transport_id_len    = srpt_get_pr_transport_id_len,
-       .tpg_parse_pr_out_transport_id  = srpt_parse_pr_out_transport_id,
        .tpg_check_demo_mode            = srpt_check_false,
        .tpg_check_demo_mode_cache      = srpt_check_true,
        .tpg_check_demo_mode_write_protect = srpt_check_true,
        .tpg_check_prod_mode_write_protect = srpt_check_false,
-       .tpg_alloc_fabric_acl           = srpt_alloc_fabric_acl,
-       .tpg_release_fabric_acl         = srpt_release_fabric_acl,
        .tpg_get_inst_index             = srpt_tpg_get_inst_index,
        .release_cmd                    = srpt_release_cmd,
        .check_stop_free                = srpt_check_stop_free,
@@ -3940,7 +3806,6 @@ static const struct target_core_fabric_ops srpt_template = {
        .write_pending                  = srpt_write_pending,
        .write_pending_status           = srpt_write_pending_status,
        .set_default_node_attributes    = srpt_set_default_node_attrs,
-       .get_task_tag                   = srpt_get_task_tag,
        .get_cmd_state                  = srpt_get_tcm_cmd_state,
        .queue_data_in                  = srpt_queue_data_in,
        .queue_status                   = srpt_queue_status,
@@ -3954,12 +3819,8 @@ static const struct target_core_fabric_ops srpt_template = {
        .fabric_drop_wwn                = srpt_drop_tport,
        .fabric_make_tpg                = srpt_make_tpg,
        .fabric_drop_tpg                = srpt_drop_tpg,
-       .fabric_post_link               = NULL,
-       .fabric_pre_unlink              = NULL,
-       .fabric_make_np                 = NULL,
-       .fabric_drop_np                 = NULL,
-       .fabric_make_nodeacl            = srpt_make_nodeacl,
-       .fabric_drop_nodeacl            = srpt_drop_nodeacl,
+       .fabric_init_nodeacl            = srpt_init_nodeacl,
+       .fabric_cleanup_nodeacl         = srpt_cleanup_nodeacl,
 
        .tfc_wwn_attrs                  = srpt_wwn_attrs,
        .tfc_tpg_base_attrs             = srpt_tpg_attrs,