Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target...
[cascardo/linux.git] / drivers / infiniband / ulp / isert / ib_isert.c
index da8ff12..3effa93 100644 (file)
@@ -2185,7 +2185,7 @@ isert_put_response(struct iscsi_conn *conn, struct iscsi_cmd *cmd)
                isert_cmd->tx_desc.num_sge = 2;
        }
 
-       isert_init_send_wr(isert_conn, isert_cmd, send_wr, true);
+       isert_init_send_wr(isert_conn, isert_cmd, send_wr, false);
 
        pr_debug("Posting SCSI Response IB_WR_SEND >>>>>>>>>>>>>>>>>>>>>>\n");
 
@@ -2609,58 +2609,45 @@ isert_fast_reg_mr(struct isert_conn *isert_conn,
        return ret;
 }
 
-static inline enum ib_t10_dif_type
-se2ib_prot_type(enum target_prot_type prot_type)
+static inline void
+isert_set_dif_domain(struct se_cmd *se_cmd, struct ib_sig_attrs *sig_attrs,
+                    struct ib_sig_domain *domain)
 {
-       switch (prot_type) {
-       case TARGET_DIF_TYPE0_PROT:
-               return IB_T10DIF_NONE;
-       case TARGET_DIF_TYPE1_PROT:
-               return IB_T10DIF_TYPE1;
-       case TARGET_DIF_TYPE2_PROT:
-               return IB_T10DIF_TYPE2;
-       case TARGET_DIF_TYPE3_PROT:
-               return IB_T10DIF_TYPE3;
-       default:
-               return IB_T10DIF_NONE;
-       }
-}
+       domain->sig_type = IB_SIG_TYPE_T10_DIF;
+       domain->sig.dif.bg_type = IB_T10DIF_CRC;
+       domain->sig.dif.pi_interval = se_cmd->se_dev->dev_attrib.block_size;
+       domain->sig.dif.ref_tag = se_cmd->reftag_seed;
+       /*
+        * At the moment we hard code those, but if in the future
+        * the target core would like to use it, we will take it
+        * from se_cmd.
+        */
+       domain->sig.dif.apptag_check_mask = 0xffff;
+       domain->sig.dif.app_escape = true;
+       domain->sig.dif.ref_escape = true;
+       if (se_cmd->prot_type == TARGET_DIF_TYPE1_PROT ||
+           se_cmd->prot_type == TARGET_DIF_TYPE2_PROT)
+               domain->sig.dif.ref_remap = true;
+};
 
 static int
 isert_set_sig_attrs(struct se_cmd *se_cmd, struct ib_sig_attrs *sig_attrs)
 {
-       enum ib_t10_dif_type ib_prot_type = se2ib_prot_type(se_cmd->prot_type);
-
-       sig_attrs->mem.sig_type = IB_SIG_TYPE_T10_DIF;
-       sig_attrs->wire.sig_type = IB_SIG_TYPE_T10_DIF;
-       sig_attrs->mem.sig.dif.pi_interval =
-                               se_cmd->se_dev->dev_attrib.block_size;
-       sig_attrs->wire.sig.dif.pi_interval =
-                               se_cmd->se_dev->dev_attrib.block_size;
-
        switch (se_cmd->prot_op) {
        case TARGET_PROT_DIN_INSERT:
        case TARGET_PROT_DOUT_STRIP:
-               sig_attrs->mem.sig.dif.type = IB_T10DIF_NONE;
-               sig_attrs->wire.sig.dif.type = ib_prot_type;
-               sig_attrs->wire.sig.dif.bg_type = IB_T10DIF_CRC;
-               sig_attrs->wire.sig.dif.ref_tag = se_cmd->reftag_seed;
+               sig_attrs->mem.sig_type = IB_SIG_TYPE_NONE;
+               isert_set_dif_domain(se_cmd, sig_attrs, &sig_attrs->wire);
                break;
        case TARGET_PROT_DOUT_INSERT:
        case TARGET_PROT_DIN_STRIP:
-               sig_attrs->mem.sig.dif.type = ib_prot_type;
-               sig_attrs->mem.sig.dif.bg_type = IB_T10DIF_CRC;
-               sig_attrs->mem.sig.dif.ref_tag = se_cmd->reftag_seed;
-               sig_attrs->wire.sig.dif.type = IB_T10DIF_NONE;
+               sig_attrs->wire.sig_type = IB_SIG_TYPE_NONE;
+               isert_set_dif_domain(se_cmd, sig_attrs, &sig_attrs->mem);
                break;
        case TARGET_PROT_DIN_PASS:
        case TARGET_PROT_DOUT_PASS:
-               sig_attrs->mem.sig.dif.type = ib_prot_type;
-               sig_attrs->mem.sig.dif.bg_type = IB_T10DIF_CRC;
-               sig_attrs->mem.sig.dif.ref_tag = se_cmd->reftag_seed;
-               sig_attrs->wire.sig.dif.type = ib_prot_type;
-               sig_attrs->wire.sig.dif.bg_type = IB_T10DIF_CRC;
-               sig_attrs->wire.sig.dif.ref_tag = se_cmd->reftag_seed;
+               isert_set_dif_domain(se_cmd, sig_attrs, &sig_attrs->wire);
+               isert_set_dif_domain(se_cmd, sig_attrs, &sig_attrs->mem);
                break;
        default:
                pr_err("Unsupported PI operation %d\n", se_cmd->prot_op);
@@ -2884,7 +2871,7 @@ isert_put_datain(struct iscsi_conn *conn, struct iscsi_cmd *cmd)
                                     &isert_cmd->tx_desc.iscsi_header);
                isert_init_tx_hdrs(isert_conn, &isert_cmd->tx_desc);
                isert_init_send_wr(isert_conn, isert_cmd,
-                                  &isert_cmd->tx_desc.send_wr, true);
+                                  &isert_cmd->tx_desc.send_wr, false);
                isert_cmd->rdma_wr.s_send_wr.next = &isert_cmd->tx_desc.send_wr;
                wr->send_wr_num += 1;
        }
@@ -3153,7 +3140,7 @@ isert_accept_np(struct iscsi_np *np, struct iscsi_conn *conn)
 
 accept_wait:
        ret = down_interruptible(&isert_np->np_sem);
-       if (max_accept > 5)
+       if (ret || max_accept > 5)
                return -ENODEV;
 
        spin_lock_bh(&np->np_thread_lock);