aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSagi Grimberg <sagig@mellanox.com>2014-12-02 09:57:34 -0500
committerNicholas Bellinger <nab@linux-iscsi.org>2014-12-13 02:32:26 -0500
commit302cc7c3ca14d21ccdffdebdb61c4fe028f2d5ad (patch)
treed4e02ded6d721757cc233bdd7659124f43171e91
parent570db170f37715b7df23c95868169f3d9affa48c (diff)
iser-target: Fix NULL dereference in SW mode DIF
Fallback to software mode DIF if HCA does not support PI (without crashing obviously). It is still possible to run with backend protection and an unprotected frontend, so looking at the command prot_op is not enough. Check device PI capability on a per-IO basis (isert_prot_cmd inline static) to determine if we need to handle protection information. Trace: BUG: unable to handle kernel NULL pointer dereference at 0000000000000010 IP: [<ffffffffa037f8b1>] isert_reg_sig_mr+0x351/0x3b0 [ib_isert] Call Trace: [<ffffffff812b003a>] ? swiotlb_map_sg_attrs+0x7a/0x130 [<ffffffffa038184d>] isert_reg_rdma+0x2fd/0x370 [ib_isert] [<ffffffff8108f2ec>] ? idle_balance+0x6c/0x2c0 [<ffffffffa0382b68>] isert_put_datain+0x68/0x210 [ib_isert] [<ffffffffa02acf5b>] lio_queue_data_in+0x2b/0x30 [iscsi_target_mod] [<ffffffffa02306eb>] target_complete_ok_work+0x21b/0x310 [target_core_mod] [<ffffffff8106ece2>] process_one_work+0x182/0x3b0 [<ffffffff8106fda0>] worker_thread+0x120/0x3c0 [<ffffffff8106fc80>] ? maybe_create_worker+0x190/0x190 [<ffffffff8107594e>] kthread+0xce/0xf0 [<ffffffff81075880>] ? kthread_freezable_should_stop+0x70/0x70 [<ffffffff8159a22c>] ret_from_fork+0x7c/0xb0 [<ffffffff81075880>] ? kthread_freezable_should_stop+0x70/0x70 Reported-by: Slava Shwartsman <valyushash@gmail.com> Signed-off-by: Sagi Grimberg <sagig@mellanox.com> Cc: <stable@vger.kernel.org> # v3.14+ Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
-rw-r--r--drivers/infiniband/ulp/isert/ib_isert.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c
index b0e58f196d90..618c81576b05 100644
--- a/drivers/infiniband/ulp/isert/ib_isert.c
+++ b/drivers/infiniband/ulp/isert/ib_isert.c
@@ -61,6 +61,14 @@ static int
61isert_rdma_accept(struct isert_conn *isert_conn); 61isert_rdma_accept(struct isert_conn *isert_conn);
62struct rdma_cm_id *isert_setup_id(struct isert_np *isert_np); 62struct rdma_cm_id *isert_setup_id(struct isert_np *isert_np);
63 63
64static inline bool
65isert_prot_cmd(struct isert_conn *conn, struct se_cmd *cmd)
66{
67 return (conn->conn_device->pi_capable &&
68 cmd->prot_op != TARGET_PROT_NORMAL);
69}
70
71
64static void 72static void
65isert_qp_event_callback(struct ib_event *e, void *context) 73isert_qp_event_callback(struct ib_event *e, void *context)
66{ 74{
@@ -2919,8 +2927,7 @@ isert_reg_rdma(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
2919 if (ret) 2927 if (ret)
2920 return ret; 2928 return ret;
2921 2929
2922 if (wr->data.dma_nents != 1 || 2930 if (wr->data.dma_nents != 1 || isert_prot_cmd(isert_conn, se_cmd)) {
2923 se_cmd->prot_op != TARGET_PROT_NORMAL) {
2924 spin_lock_irqsave(&isert_conn->conn_lock, flags); 2931 spin_lock_irqsave(&isert_conn->conn_lock, flags);
2925 fr_desc = list_first_entry(&isert_conn->conn_fr_pool, 2932 fr_desc = list_first_entry(&isert_conn->conn_fr_pool,
2926 struct fast_reg_descriptor, list); 2933 struct fast_reg_descriptor, list);
@@ -2934,7 +2941,7 @@ isert_reg_rdma(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
2934 if (ret) 2941 if (ret)
2935 goto unmap_cmd; 2942 goto unmap_cmd;
2936 2943
2937 if (se_cmd->prot_op != TARGET_PROT_NORMAL) { 2944 if (isert_prot_cmd(isert_conn, se_cmd)) {
2938 ret = isert_handle_prot_cmd(isert_conn, isert_cmd, wr); 2945 ret = isert_handle_prot_cmd(isert_conn, isert_cmd, wr);
2939 if (ret) 2946 if (ret)
2940 goto unmap_cmd; 2947 goto unmap_cmd;
@@ -2959,7 +2966,7 @@ isert_reg_rdma(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
2959 send_wr->opcode = IB_WR_RDMA_WRITE; 2966 send_wr->opcode = IB_WR_RDMA_WRITE;
2960 send_wr->wr.rdma.remote_addr = isert_cmd->read_va; 2967 send_wr->wr.rdma.remote_addr = isert_cmd->read_va;
2961 send_wr->wr.rdma.rkey = isert_cmd->read_stag; 2968 send_wr->wr.rdma.rkey = isert_cmd->read_stag;
2962 send_wr->send_flags = se_cmd->prot_op == TARGET_PROT_NORMAL ? 2969 send_wr->send_flags = !isert_prot_cmd(isert_conn, se_cmd) ?
2963 0 : IB_SEND_SIGNALED; 2970 0 : IB_SEND_SIGNALED;
2964 } else { 2971 } else {
2965 send_wr->opcode = IB_WR_RDMA_READ; 2972 send_wr->opcode = IB_WR_RDMA_READ;
@@ -3001,7 +3008,7 @@ isert_put_datain(struct iscsi_conn *conn, struct iscsi_cmd *cmd)
3001 return rc; 3008 return rc;
3002 } 3009 }
3003 3010
3004 if (se_cmd->prot_op == TARGET_PROT_NORMAL) { 3011 if (!isert_prot_cmd(isert_conn, se_cmd)) {
3005 /* 3012 /*
3006 * Build isert_conn->tx_desc for iSCSI response PDU and attach 3013 * Build isert_conn->tx_desc for iSCSI response PDU and attach
3007 */ 3014 */
@@ -3024,7 +3031,7 @@ isert_put_datain(struct iscsi_conn *conn, struct iscsi_cmd *cmd)
3024 atomic_sub(wr->send_wr_num, &isert_conn->post_send_buf_count); 3031 atomic_sub(wr->send_wr_num, &isert_conn->post_send_buf_count);
3025 } 3032 }
3026 3033
3027 if (se_cmd->prot_op == TARGET_PROT_NORMAL) 3034 if (!isert_prot_cmd(isert_conn, se_cmd))
3028 pr_debug("Cmd: %p posted RDMA_WRITE + Response for iSER Data " 3035 pr_debug("Cmd: %p posted RDMA_WRITE + Response for iSER Data "
3029 "READ\n", isert_cmd); 3036 "READ\n", isert_cmd);
3030 else 3037 else