aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/ulp/iser/iser_initiator.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/infiniband/ulp/iser/iser_initiator.c')
-rw-r--r--drivers/infiniband/ulp/iser/iser_initiator.c209
1 files changed, 104 insertions, 105 deletions
diff --git a/drivers/infiniband/ulp/iser/iser_initiator.c b/drivers/infiniband/ulp/iser/iser_initiator.c
index 31ad498bdc51..cdd283189047 100644
--- a/drivers/infiniband/ulp/iser/iser_initiator.c
+++ b/drivers/infiniband/ulp/iser/iser_initiator.c
@@ -64,46 +64,46 @@ static void iser_dto_add_regd_buff(struct iser_dto *dto,
64 64
65/* Register user buffer memory and initialize passive rdma 65/* Register user buffer memory and initialize passive rdma
66 * dto descriptor. Total data size is stored in 66 * dto descriptor. Total data size is stored in
67 * iser_ctask->data[ISER_DIR_IN].data_len 67 * iser_task->data[ISER_DIR_IN].data_len
68 */ 68 */
69static int iser_prepare_read_cmd(struct iscsi_cmd_task *ctask, 69static int iser_prepare_read_cmd(struct iscsi_task *task,
70 unsigned int edtl) 70 unsigned int edtl)
71 71
72{ 72{
73 struct iscsi_iser_cmd_task *iser_ctask = ctask->dd_data; 73 struct iscsi_iser_task *iser_task = task->dd_data;
74 struct iser_regd_buf *regd_buf; 74 struct iser_regd_buf *regd_buf;
75 int err; 75 int err;
76 struct iser_hdr *hdr = &iser_ctask->desc.iser_header; 76 struct iser_hdr *hdr = &iser_task->desc.iser_header;
77 struct iser_data_buf *buf_in = &iser_ctask->data[ISER_DIR_IN]; 77 struct iser_data_buf *buf_in = &iser_task->data[ISER_DIR_IN];
78 78
79 err = iser_dma_map_task_data(iser_ctask, 79 err = iser_dma_map_task_data(iser_task,
80 buf_in, 80 buf_in,
81 ISER_DIR_IN, 81 ISER_DIR_IN,
82 DMA_FROM_DEVICE); 82 DMA_FROM_DEVICE);
83 if (err) 83 if (err)
84 return err; 84 return err;
85 85
86 if (edtl > iser_ctask->data[ISER_DIR_IN].data_len) { 86 if (edtl > iser_task->data[ISER_DIR_IN].data_len) {
87 iser_err("Total data length: %ld, less than EDTL: " 87 iser_err("Total data length: %ld, less than EDTL: "
88 "%d, in READ cmd BHS itt: %d, conn: 0x%p\n", 88 "%d, in READ cmd BHS itt: %d, conn: 0x%p\n",
89 iser_ctask->data[ISER_DIR_IN].data_len, edtl, 89 iser_task->data[ISER_DIR_IN].data_len, edtl,
90 ctask->itt, iser_ctask->iser_conn); 90 task->itt, iser_task->iser_conn);
91 return -EINVAL; 91 return -EINVAL;
92 } 92 }
93 93
94 err = iser_reg_rdma_mem(iser_ctask,ISER_DIR_IN); 94 err = iser_reg_rdma_mem(iser_task,ISER_DIR_IN);
95 if (err) { 95 if (err) {
96 iser_err("Failed to set up Data-IN RDMA\n"); 96 iser_err("Failed to set up Data-IN RDMA\n");
97 return err; 97 return err;
98 } 98 }
99 regd_buf = &iser_ctask->rdma_regd[ISER_DIR_IN]; 99 regd_buf = &iser_task->rdma_regd[ISER_DIR_IN];
100 100
101 hdr->flags |= ISER_RSV; 101 hdr->flags |= ISER_RSV;
102 hdr->read_stag = cpu_to_be32(regd_buf->reg.rkey); 102 hdr->read_stag = cpu_to_be32(regd_buf->reg.rkey);
103 hdr->read_va = cpu_to_be64(regd_buf->reg.va); 103 hdr->read_va = cpu_to_be64(regd_buf->reg.va);
104 104
105 iser_dbg("Cmd itt:%d READ tags RKEY:%#.4X VA:%#llX\n", 105 iser_dbg("Cmd itt:%d READ tags RKEY:%#.4X VA:%#llX\n",
106 ctask->itt, regd_buf->reg.rkey, 106 task->itt, regd_buf->reg.rkey,
107 (unsigned long long)regd_buf->reg.va); 107 (unsigned long long)regd_buf->reg.va);
108 108
109 return 0; 109 return 0;
@@ -111,43 +111,43 @@ static int iser_prepare_read_cmd(struct iscsi_cmd_task *ctask,
111 111
112/* Register user buffer memory and initialize passive rdma 112/* Register user buffer memory and initialize passive rdma
113 * dto descriptor. Total data size is stored in 113 * dto descriptor. Total data size is stored in
114 * ctask->data[ISER_DIR_OUT].data_len 114 * task->data[ISER_DIR_OUT].data_len
115 */ 115 */
116static int 116static int
117iser_prepare_write_cmd(struct iscsi_cmd_task *ctask, 117iser_prepare_write_cmd(struct iscsi_task *task,
118 unsigned int imm_sz, 118 unsigned int imm_sz,
119 unsigned int unsol_sz, 119 unsigned int unsol_sz,
120 unsigned int edtl) 120 unsigned int edtl)
121{ 121{
122 struct iscsi_iser_cmd_task *iser_ctask = ctask->dd_data; 122 struct iscsi_iser_task *iser_task = task->dd_data;
123 struct iser_regd_buf *regd_buf; 123 struct iser_regd_buf *regd_buf;
124 int err; 124 int err;
125 struct iser_dto *send_dto = &iser_ctask->desc.dto; 125 struct iser_dto *send_dto = &iser_task->desc.dto;
126 struct iser_hdr *hdr = &iser_ctask->desc.iser_header; 126 struct iser_hdr *hdr = &iser_task->desc.iser_header;
127 struct iser_data_buf *buf_out = &iser_ctask->data[ISER_DIR_OUT]; 127 struct iser_data_buf *buf_out = &iser_task->data[ISER_DIR_OUT];
128 128
129 err = iser_dma_map_task_data(iser_ctask, 129 err = iser_dma_map_task_data(iser_task,
130 buf_out, 130 buf_out,
131 ISER_DIR_OUT, 131 ISER_DIR_OUT,
132 DMA_TO_DEVICE); 132 DMA_TO_DEVICE);
133 if (err) 133 if (err)
134 return err; 134 return err;
135 135
136 if (edtl > iser_ctask->data[ISER_DIR_OUT].data_len) { 136 if (edtl > iser_task->data[ISER_DIR_OUT].data_len) {
137 iser_err("Total data length: %ld, less than EDTL: %d, " 137 iser_err("Total data length: %ld, less than EDTL: %d, "
138 "in WRITE cmd BHS itt: %d, conn: 0x%p\n", 138 "in WRITE cmd BHS itt: %d, conn: 0x%p\n",
139 iser_ctask->data[ISER_DIR_OUT].data_len, 139 iser_task->data[ISER_DIR_OUT].data_len,
140 edtl, ctask->itt, ctask->conn); 140 edtl, task->itt, task->conn);
141 return -EINVAL; 141 return -EINVAL;
142 } 142 }
143 143
144 err = iser_reg_rdma_mem(iser_ctask,ISER_DIR_OUT); 144 err = iser_reg_rdma_mem(iser_task,ISER_DIR_OUT);
145 if (err != 0) { 145 if (err != 0) {
146 iser_err("Failed to register write cmd RDMA mem\n"); 146 iser_err("Failed to register write cmd RDMA mem\n");
147 return err; 147 return err;
148 } 148 }
149 149
150 regd_buf = &iser_ctask->rdma_regd[ISER_DIR_OUT]; 150 regd_buf = &iser_task->rdma_regd[ISER_DIR_OUT];
151 151
152 if (unsol_sz < edtl) { 152 if (unsol_sz < edtl) {
153 hdr->flags |= ISER_WSV; 153 hdr->flags |= ISER_WSV;
@@ -156,13 +156,13 @@ iser_prepare_write_cmd(struct iscsi_cmd_task *ctask,
156 156
157 iser_dbg("Cmd itt:%d, WRITE tags, RKEY:%#.4X " 157 iser_dbg("Cmd itt:%d, WRITE tags, RKEY:%#.4X "
158 "VA:%#llX + unsol:%d\n", 158 "VA:%#llX + unsol:%d\n",
159 ctask->itt, regd_buf->reg.rkey, 159 task->itt, regd_buf->reg.rkey,
160 (unsigned long long)regd_buf->reg.va, unsol_sz); 160 (unsigned long long)regd_buf->reg.va, unsol_sz);
161 } 161 }
162 162
163 if (imm_sz > 0) { 163 if (imm_sz > 0) {
164 iser_dbg("Cmd itt:%d, WRITE, adding imm.data sz: %d\n", 164 iser_dbg("Cmd itt:%d, WRITE, adding imm.data sz: %d\n",
165 ctask->itt, imm_sz); 165 task->itt, imm_sz);
166 iser_dto_add_regd_buff(send_dto, 166 iser_dto_add_regd_buff(send_dto,
167 regd_buf, 167 regd_buf,
168 0, 168 0,
@@ -314,38 +314,38 @@ iser_check_xmit(struct iscsi_conn *conn, void *task)
314/** 314/**
315 * iser_send_command - send command PDU 315 * iser_send_command - send command PDU
316 */ 316 */
317int iser_send_command(struct iscsi_conn *conn, 317int iser_send_command(struct iscsi_conn *conn,
318 struct iscsi_cmd_task *ctask) 318 struct iscsi_task *task)
319{ 319{
320 struct iscsi_iser_conn *iser_conn = conn->dd_data; 320 struct iscsi_iser_conn *iser_conn = conn->dd_data;
321 struct iscsi_iser_cmd_task *iser_ctask = ctask->dd_data; 321 struct iscsi_iser_task *iser_task = task->dd_data;
322 struct iser_dto *send_dto = NULL; 322 struct iser_dto *send_dto = NULL;
323 unsigned long edtl; 323 unsigned long edtl;
324 int err = 0; 324 int err = 0;
325 struct iser_data_buf *data_buf; 325 struct iser_data_buf *data_buf;
326 326
327 struct iscsi_cmd *hdr = ctask->hdr; 327 struct iscsi_cmd *hdr = task->hdr;
328 struct scsi_cmnd *sc = ctask->sc; 328 struct scsi_cmnd *sc = task->sc;
329 329
330 if (!iser_conn_state_comp(iser_conn->ib_conn, ISER_CONN_UP)) { 330 if (!iser_conn_state_comp(iser_conn->ib_conn, ISER_CONN_UP)) {
331 iser_err("Failed to send, conn: 0x%p is not up\n", iser_conn->ib_conn); 331 iser_err("Failed to send, conn: 0x%p is not up\n", iser_conn->ib_conn);
332 return -EPERM; 332 return -EPERM;
333 } 333 }
334 if (iser_check_xmit(conn, ctask)) 334 if (iser_check_xmit(conn, task))
335 return -ENOBUFS; 335 return -ENOBUFS;
336 336
337 edtl = ntohl(hdr->data_length); 337 edtl = ntohl(hdr->data_length);
338 338
339 /* build the tx desc regd header and add it to the tx desc dto */ 339 /* build the tx desc regd header and add it to the tx desc dto */
340 iser_ctask->desc.type = ISCSI_TX_SCSI_COMMAND; 340 iser_task->desc.type = ISCSI_TX_SCSI_COMMAND;
341 send_dto = &iser_ctask->desc.dto; 341 send_dto = &iser_task->desc.dto;
342 send_dto->ctask = iser_ctask; 342 send_dto->task = iser_task;
343 iser_create_send_desc(iser_conn, &iser_ctask->desc); 343 iser_create_send_desc(iser_conn, &iser_task->desc);
344 344
345 if (hdr->flags & ISCSI_FLAG_CMD_READ) 345 if (hdr->flags & ISCSI_FLAG_CMD_READ)
346 data_buf = &iser_ctask->data[ISER_DIR_IN]; 346 data_buf = &iser_task->data[ISER_DIR_IN];
347 else 347 else
348 data_buf = &iser_ctask->data[ISER_DIR_OUT]; 348 data_buf = &iser_task->data[ISER_DIR_OUT];
349 349
350 if (scsi_sg_count(sc)) { /* using a scatter list */ 350 if (scsi_sg_count(sc)) { /* using a scatter list */
351 data_buf->buf = scsi_sglist(sc); 351 data_buf->buf = scsi_sglist(sc);
@@ -355,15 +355,15 @@ int iser_send_command(struct iscsi_conn *conn,
355 data_buf->data_len = scsi_bufflen(sc); 355 data_buf->data_len = scsi_bufflen(sc);
356 356
357 if (hdr->flags & ISCSI_FLAG_CMD_READ) { 357 if (hdr->flags & ISCSI_FLAG_CMD_READ) {
358 err = iser_prepare_read_cmd(ctask, edtl); 358 err = iser_prepare_read_cmd(task, edtl);
359 if (err) 359 if (err)
360 goto send_command_error; 360 goto send_command_error;
361 } 361 }
362 if (hdr->flags & ISCSI_FLAG_CMD_WRITE) { 362 if (hdr->flags & ISCSI_FLAG_CMD_WRITE) {
363 err = iser_prepare_write_cmd(ctask, 363 err = iser_prepare_write_cmd(task,
364 ctask->imm_count, 364 task->imm_count,
365 ctask->imm_count + 365 task->imm_count +
366 ctask->unsol_count, 366 task->unsol_count,
367 edtl); 367 edtl);
368 if (err) 368 if (err)
369 goto send_command_error; 369 goto send_command_error;
@@ -378,27 +378,27 @@ int iser_send_command(struct iscsi_conn *conn,
378 goto send_command_error; 378 goto send_command_error;
379 } 379 }
380 380
381 iser_ctask->status = ISER_TASK_STATUS_STARTED; 381 iser_task->status = ISER_TASK_STATUS_STARTED;
382 382
383 err = iser_post_send(&iser_ctask->desc); 383 err = iser_post_send(&iser_task->desc);
384 if (!err) 384 if (!err)
385 return 0; 385 return 0;
386 386
387send_command_error: 387send_command_error:
388 iser_dto_buffs_release(send_dto); 388 iser_dto_buffs_release(send_dto);
389 iser_err("conn %p failed ctask->itt %d err %d\n",conn, ctask->itt, err); 389 iser_err("conn %p failed task->itt %d err %d\n",conn, task->itt, err);
390 return err; 390 return err;
391} 391}
392 392
393/** 393/**
394 * iser_send_data_out - send data out PDU 394 * iser_send_data_out - send data out PDU
395 */ 395 */
396int iser_send_data_out(struct iscsi_conn *conn, 396int iser_send_data_out(struct iscsi_conn *conn,
397 struct iscsi_cmd_task *ctask, 397 struct iscsi_task *task,
398 struct iscsi_data *hdr) 398 struct iscsi_data *hdr)
399{ 399{
400 struct iscsi_iser_conn *iser_conn = conn->dd_data; 400 struct iscsi_iser_conn *iser_conn = conn->dd_data;
401 struct iscsi_iser_cmd_task *iser_ctask = ctask->dd_data; 401 struct iscsi_iser_task *iser_task = task->dd_data;
402 struct iser_desc *tx_desc = NULL; 402 struct iser_desc *tx_desc = NULL;
403 struct iser_dto *send_dto = NULL; 403 struct iser_dto *send_dto = NULL;
404 unsigned long buf_offset; 404 unsigned long buf_offset;
@@ -411,7 +411,7 @@ int iser_send_data_out(struct iscsi_conn *conn,
411 return -EPERM; 411 return -EPERM;
412 } 412 }
413 413
414 if (iser_check_xmit(conn, ctask)) 414 if (iser_check_xmit(conn, task))
415 return -ENOBUFS; 415 return -ENOBUFS;
416 416
417 itt = (__force uint32_t)hdr->itt; 417 itt = (__force uint32_t)hdr->itt;
@@ -432,7 +432,7 @@ int iser_send_data_out(struct iscsi_conn *conn,
432 432
433 /* build the tx desc regd header and add it to the tx desc dto */ 433 /* build the tx desc regd header and add it to the tx desc dto */
434 send_dto = &tx_desc->dto; 434 send_dto = &tx_desc->dto;
435 send_dto->ctask = iser_ctask; 435 send_dto->task = iser_task;
436 iser_create_send_desc(iser_conn, tx_desc); 436 iser_create_send_desc(iser_conn, tx_desc);
437 437
438 iser_reg_single(iser_conn->ib_conn->device, 438 iser_reg_single(iser_conn->ib_conn->device,
@@ -440,15 +440,15 @@ int iser_send_data_out(struct iscsi_conn *conn,
440 440
441 /* all data was registered for RDMA, we can use the lkey */ 441 /* all data was registered for RDMA, we can use the lkey */
442 iser_dto_add_regd_buff(send_dto, 442 iser_dto_add_regd_buff(send_dto,
443 &iser_ctask->rdma_regd[ISER_DIR_OUT], 443 &iser_task->rdma_regd[ISER_DIR_OUT],
444 buf_offset, 444 buf_offset,
445 data_seg_len); 445 data_seg_len);
446 446
447 if (buf_offset + data_seg_len > iser_ctask->data[ISER_DIR_OUT].data_len) { 447 if (buf_offset + data_seg_len > iser_task->data[ISER_DIR_OUT].data_len) {
448 iser_err("Offset:%ld & DSL:%ld in Data-Out " 448 iser_err("Offset:%ld & DSL:%ld in Data-Out "
449 "inconsistent with total len:%ld, itt:%d\n", 449 "inconsistent with total len:%ld, itt:%d\n",
450 buf_offset, data_seg_len, 450 buf_offset, data_seg_len,
451 iser_ctask->data[ISER_DIR_OUT].data_len, itt); 451 iser_task->data[ISER_DIR_OUT].data_len, itt);
452 err = -EINVAL; 452 err = -EINVAL;
453 goto send_data_out_error; 453 goto send_data_out_error;
454 } 454 }
@@ -468,10 +468,11 @@ send_data_out_error:
468} 468}
469 469
470int iser_send_control(struct iscsi_conn *conn, 470int iser_send_control(struct iscsi_conn *conn,
471 struct iscsi_mgmt_task *mtask) 471 struct iscsi_task *task)
472{ 472{
473 struct iscsi_iser_conn *iser_conn = conn->dd_data; 473 struct iscsi_iser_conn *iser_conn = conn->dd_data;
474 struct iser_desc *mdesc = mtask->dd_data; 474 struct iscsi_iser_task *iser_task = task->dd_data;
475 struct iser_desc *mdesc = &iser_task->desc;
475 struct iser_dto *send_dto = NULL; 476 struct iser_dto *send_dto = NULL;
476 unsigned long data_seg_len; 477 unsigned long data_seg_len;
477 int err = 0; 478 int err = 0;
@@ -483,27 +484,27 @@ int iser_send_control(struct iscsi_conn *conn,
483 return -EPERM; 484 return -EPERM;
484 } 485 }
485 486
486 if (iser_check_xmit(conn,mtask)) 487 if (iser_check_xmit(conn, task))
487 return -ENOBUFS; 488 return -ENOBUFS;
488 489
489 /* build the tx desc regd header and add it to the tx desc dto */ 490 /* build the tx desc regd header and add it to the tx desc dto */
490 mdesc->type = ISCSI_TX_CONTROL; 491 mdesc->type = ISCSI_TX_CONTROL;
491 send_dto = &mdesc->dto; 492 send_dto = &mdesc->dto;
492 send_dto->ctask = NULL; 493 send_dto->task = NULL;
493 iser_create_send_desc(iser_conn, mdesc); 494 iser_create_send_desc(iser_conn, mdesc);
494 495
495 device = iser_conn->ib_conn->device; 496 device = iser_conn->ib_conn->device;
496 497
497 iser_reg_single(device, send_dto->regd[0], DMA_TO_DEVICE); 498 iser_reg_single(device, send_dto->regd[0], DMA_TO_DEVICE);
498 499
499 data_seg_len = ntoh24(mtask->hdr->dlength); 500 data_seg_len = ntoh24(task->hdr->dlength);
500 501
501 if (data_seg_len > 0) { 502 if (data_seg_len > 0) {
502 regd_buf = &mdesc->data_regd_buf; 503 regd_buf = &mdesc->data_regd_buf;
503 memset(regd_buf, 0, sizeof(struct iser_regd_buf)); 504 memset(regd_buf, 0, sizeof(struct iser_regd_buf));
504 regd_buf->device = device; 505 regd_buf->device = device;
505 regd_buf->virt_addr = mtask->data; 506 regd_buf->virt_addr = task->data;
506 regd_buf->data_size = mtask->data_count; 507 regd_buf->data_size = task->data_count;
507 iser_reg_single(device, regd_buf, 508 iser_reg_single(device, regd_buf,
508 DMA_TO_DEVICE); 509 DMA_TO_DEVICE);
509 iser_dto_add_regd_buff(send_dto, regd_buf, 510 iser_dto_add_regd_buff(send_dto, regd_buf,
@@ -533,15 +534,13 @@ send_control_error:
533void iser_rcv_completion(struct iser_desc *rx_desc, 534void iser_rcv_completion(struct iser_desc *rx_desc,
534 unsigned long dto_xfer_len) 535 unsigned long dto_xfer_len)
535{ 536{
536 struct iser_dto *dto = &rx_desc->dto; 537 struct iser_dto *dto = &rx_desc->dto;
537 struct iscsi_iser_conn *conn = dto->ib_conn->iser_conn; 538 struct iscsi_iser_conn *conn = dto->ib_conn->iser_conn;
538 struct iscsi_session *session = conn->iscsi_conn->session; 539 struct iscsi_task *task;
539 struct iscsi_cmd_task *ctask; 540 struct iscsi_iser_task *iser_task;
540 struct iscsi_iser_cmd_task *iser_ctask;
541 struct iscsi_hdr *hdr; 541 struct iscsi_hdr *hdr;
542 char *rx_data = NULL; 542 char *rx_data = NULL;
543 int rx_data_len = 0; 543 int rx_data_len = 0;
544 unsigned int itt;
545 unsigned char opcode; 544 unsigned char opcode;
546 545
547 hdr = &rx_desc->iscsi_header; 546 hdr = &rx_desc->iscsi_header;
@@ -557,19 +556,24 @@ void iser_rcv_completion(struct iser_desc *rx_desc,
557 opcode = hdr->opcode & ISCSI_OPCODE_MASK; 556 opcode = hdr->opcode & ISCSI_OPCODE_MASK;
558 557
559 if (opcode == ISCSI_OP_SCSI_CMD_RSP) { 558 if (opcode == ISCSI_OP_SCSI_CMD_RSP) {
560 itt = get_itt(hdr->itt); /* mask out cid and age bits */ 559 spin_lock(&conn->iscsi_conn->session->lock);
561 if (!(itt < session->cmds_max)) 560 task = iscsi_itt_to_ctask(conn->iscsi_conn, hdr->itt);
561 if (task)
562 __iscsi_get_task(task);
563 spin_unlock(&conn->iscsi_conn->session->lock);
564
565 if (!task)
562 iser_err("itt can't be matched to task!!! " 566 iser_err("itt can't be matched to task!!! "
563 "conn %p opcode %d cmds_max %d itt %d\n", 567 "conn %p opcode %d itt %d\n",
564 conn->iscsi_conn,opcode,session->cmds_max,itt); 568 conn->iscsi_conn, opcode, hdr->itt);
565 /* use the mapping given with the cmds array indexed by itt */ 569 else {
566 ctask = (struct iscsi_cmd_task *)session->cmds[itt]; 570 iser_task = task->dd_data;
567 iser_ctask = ctask->dd_data; 571 iser_dbg("itt %d task %p\n",hdr->itt, task);
568 iser_dbg("itt %d ctask %p\n",itt,ctask); 572 iser_task->status = ISER_TASK_STATUS_COMPLETED;
569 iser_ctask->status = ISER_TASK_STATUS_COMPLETED; 573 iser_task_rdma_finalize(iser_task);
570 iser_ctask_rdma_finalize(iser_ctask); 574 iscsi_put_task(task);
575 }
571 } 576 }
572
573 iser_dto_buffs_release(dto); 577 iser_dto_buffs_release(dto);
574 578
575 iscsi_iser_recv(conn->iscsi_conn, hdr, rx_data, rx_data_len); 579 iscsi_iser_recv(conn->iscsi_conn, hdr, rx_data, rx_data_len);
@@ -590,7 +594,7 @@ void iser_snd_completion(struct iser_desc *tx_desc)
590 struct iser_conn *ib_conn = dto->ib_conn; 594 struct iser_conn *ib_conn = dto->ib_conn;
591 struct iscsi_iser_conn *iser_conn = ib_conn->iser_conn; 595 struct iscsi_iser_conn *iser_conn = ib_conn->iser_conn;
592 struct iscsi_conn *conn = iser_conn->iscsi_conn; 596 struct iscsi_conn *conn = iser_conn->iscsi_conn;
593 struct iscsi_mgmt_task *mtask; 597 struct iscsi_task *task;
594 int resume_tx = 0; 598 int resume_tx = 0;
595 599
596 iser_dbg("Initiator, Data sent dto=0x%p\n", dto); 600 iser_dbg("Initiator, Data sent dto=0x%p\n", dto);
@@ -613,36 +617,31 @@ void iser_snd_completion(struct iser_desc *tx_desc)
613 617
614 if (tx_desc->type == ISCSI_TX_CONTROL) { 618 if (tx_desc->type == ISCSI_TX_CONTROL) {
615 /* this arithmetic is legal by libiscsi dd_data allocation */ 619 /* this arithmetic is legal by libiscsi dd_data allocation */
616 mtask = (void *) ((long)(void *)tx_desc - 620 task = (void *) ((long)(void *)tx_desc -
617 sizeof(struct iscsi_mgmt_task)); 621 sizeof(struct iscsi_task));
618 if (mtask->hdr->itt == RESERVED_ITT) { 622 if (task->hdr->itt == RESERVED_ITT)
619 struct iscsi_session *session = conn->session; 623 iscsi_put_task(task);
620
621 spin_lock(&conn->session->lock);
622 iscsi_free_mgmt_task(conn, mtask);
623 spin_unlock(&session->lock);
624 }
625 } 624 }
626} 625}
627 626
628void iser_ctask_rdma_init(struct iscsi_iser_cmd_task *iser_ctask) 627void iser_task_rdma_init(struct iscsi_iser_task *iser_task)
629 628
630{ 629{
631 iser_ctask->status = ISER_TASK_STATUS_INIT; 630 iser_task->status = ISER_TASK_STATUS_INIT;
632 631
633 iser_ctask->dir[ISER_DIR_IN] = 0; 632 iser_task->dir[ISER_DIR_IN] = 0;
634 iser_ctask->dir[ISER_DIR_OUT] = 0; 633 iser_task->dir[ISER_DIR_OUT] = 0;
635 634
636 iser_ctask->data[ISER_DIR_IN].data_len = 0; 635 iser_task->data[ISER_DIR_IN].data_len = 0;
637 iser_ctask->data[ISER_DIR_OUT].data_len = 0; 636 iser_task->data[ISER_DIR_OUT].data_len = 0;
638 637
639 memset(&iser_ctask->rdma_regd[ISER_DIR_IN], 0, 638 memset(&iser_task->rdma_regd[ISER_DIR_IN], 0,
640 sizeof(struct iser_regd_buf)); 639 sizeof(struct iser_regd_buf));
641 memset(&iser_ctask->rdma_regd[ISER_DIR_OUT], 0, 640 memset(&iser_task->rdma_regd[ISER_DIR_OUT], 0,
642 sizeof(struct iser_regd_buf)); 641 sizeof(struct iser_regd_buf));
643} 642}
644 643
645void iser_ctask_rdma_finalize(struct iscsi_iser_cmd_task *iser_ctask) 644void iser_task_rdma_finalize(struct iscsi_iser_task *iser_task)
646{ 645{
647 int deferred; 646 int deferred;
648 int is_rdma_aligned = 1; 647 int is_rdma_aligned = 1;
@@ -651,17 +650,17 @@ void iser_ctask_rdma_finalize(struct iscsi_iser_cmd_task *iser_ctask)
651 /* if we were reading, copy back to unaligned sglist, 650 /* if we were reading, copy back to unaligned sglist,
652 * anyway dma_unmap and free the copy 651 * anyway dma_unmap and free the copy
653 */ 652 */
654 if (iser_ctask->data_copy[ISER_DIR_IN].copy_buf != NULL) { 653 if (iser_task->data_copy[ISER_DIR_IN].copy_buf != NULL) {
655 is_rdma_aligned = 0; 654 is_rdma_aligned = 0;
656 iser_finalize_rdma_unaligned_sg(iser_ctask, ISER_DIR_IN); 655 iser_finalize_rdma_unaligned_sg(iser_task, ISER_DIR_IN);
657 } 656 }
658 if (iser_ctask->data_copy[ISER_DIR_OUT].copy_buf != NULL) { 657 if (iser_task->data_copy[ISER_DIR_OUT].copy_buf != NULL) {
659 is_rdma_aligned = 0; 658 is_rdma_aligned = 0;
660 iser_finalize_rdma_unaligned_sg(iser_ctask, ISER_DIR_OUT); 659 iser_finalize_rdma_unaligned_sg(iser_task, ISER_DIR_OUT);
661 } 660 }
662 661
663 if (iser_ctask->dir[ISER_DIR_IN]) { 662 if (iser_task->dir[ISER_DIR_IN]) {
664 regd = &iser_ctask->rdma_regd[ISER_DIR_IN]; 663 regd = &iser_task->rdma_regd[ISER_DIR_IN];
665 deferred = iser_regd_buff_release(regd); 664 deferred = iser_regd_buff_release(regd);
666 if (deferred) { 665 if (deferred) {
667 iser_err("%d references remain for BUF-IN rdma reg\n", 666 iser_err("%d references remain for BUF-IN rdma reg\n",
@@ -669,8 +668,8 @@ void iser_ctask_rdma_finalize(struct iscsi_iser_cmd_task *iser_ctask)
669 } 668 }
670 } 669 }
671 670
672 if (iser_ctask->dir[ISER_DIR_OUT]) { 671 if (iser_task->dir[ISER_DIR_OUT]) {
673 regd = &iser_ctask->rdma_regd[ISER_DIR_OUT]; 672 regd = &iser_task->rdma_regd[ISER_DIR_OUT];
674 deferred = iser_regd_buff_release(regd); 673 deferred = iser_regd_buff_release(regd);
675 if (deferred) { 674 if (deferred) {
676 iser_err("%d references remain for BUF-OUT rdma reg\n", 675 iser_err("%d references remain for BUF-OUT rdma reg\n",
@@ -680,7 +679,7 @@ void iser_ctask_rdma_finalize(struct iscsi_iser_cmd_task *iser_ctask)
680 679
681 /* if the data was unaligned, it was already unmapped and then copied */ 680 /* if the data was unaligned, it was already unmapped and then copied */
682 if (is_rdma_aligned) 681 if (is_rdma_aligned)
683 iser_dma_unmap_task_data(iser_ctask); 682 iser_dma_unmap_task_data(iser_task);
684} 683}
685 684
686void iser_dto_buffs_release(struct iser_dto *dto) 685void iser_dto_buffs_release(struct iser_dto *dto)