diff options
Diffstat (limited to 'drivers/infiniband/ulp/iser/iser_initiator.c')
-rw-r--r-- | drivers/infiniband/ulp/iser/iser_initiator.c | 209 |
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 | */ |
69 | static int iser_prepare_read_cmd(struct iscsi_cmd_task *ctask, | 69 | static 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 | */ |
116 | static int | 116 | static int |
117 | iser_prepare_write_cmd(struct iscsi_cmd_task *ctask, | 117 | iser_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 | */ |
317 | int iser_send_command(struct iscsi_conn *conn, | 317 | int 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 | ||
387 | send_command_error: | 387 | send_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 | */ |
396 | int iser_send_data_out(struct iscsi_conn *conn, | 396 | int 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 | ||
470 | int iser_send_control(struct iscsi_conn *conn, | 470 | int 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: | |||
533 | void iser_rcv_completion(struct iser_desc *rx_desc, | 534 | void 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 | ||
628 | void iser_ctask_rdma_init(struct iscsi_iser_cmd_task *iser_ctask) | 627 | void 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 | ||
645 | void iser_ctask_rdma_finalize(struct iscsi_iser_cmd_task *iser_ctask) | 644 | void 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 | ||
686 | void iser_dto_buffs_release(struct iser_dto *dto) | 685 | void iser_dto_buffs_release(struct iser_dto *dto) |