diff options
Diffstat (limited to 'drivers/scsi/libiscsi_tcp.c')
-rw-r--r-- | drivers/scsi/libiscsi_tcp.c | 39 |
1 files changed, 21 insertions, 18 deletions
diff --git a/drivers/scsi/libiscsi_tcp.c b/drivers/scsi/libiscsi_tcp.c index 2e0746d70303..5c92620292fb 100644 --- a/drivers/scsi/libiscsi_tcp.c +++ b/drivers/scsi/libiscsi_tcp.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <linux/types.h> | 29 | #include <linux/types.h> |
30 | #include <linux/list.h> | 30 | #include <linux/list.h> |
31 | #include <linux/inet.h> | 31 | #include <linux/inet.h> |
32 | #include <linux/slab.h> | ||
32 | #include <linux/file.h> | 33 | #include <linux/file.h> |
33 | #include <linux/blkdev.h> | 34 | #include <linux/blkdev.h> |
34 | #include <linux/crypto.h> | 35 | #include <linux/crypto.h> |
@@ -445,15 +446,15 @@ void iscsi_tcp_cleanup_task(struct iscsi_task *task) | |||
445 | return; | 446 | return; |
446 | 447 | ||
447 | /* flush task's r2t queues */ | 448 | /* flush task's r2t queues */ |
448 | while (__kfifo_get(tcp_task->r2tqueue, (void*)&r2t, sizeof(void*))) { | 449 | while (kfifo_out(&tcp_task->r2tqueue, (void*)&r2t, sizeof(void*))) { |
449 | __kfifo_put(tcp_task->r2tpool.queue, (void*)&r2t, | 450 | kfifo_in(&tcp_task->r2tpool.queue, (void*)&r2t, |
450 | sizeof(void*)); | 451 | sizeof(void*)); |
451 | ISCSI_DBG_TCP(task->conn, "pending r2t dropped\n"); | 452 | ISCSI_DBG_TCP(task->conn, "pending r2t dropped\n"); |
452 | } | 453 | } |
453 | 454 | ||
454 | r2t = tcp_task->r2t; | 455 | r2t = tcp_task->r2t; |
455 | if (r2t != NULL) { | 456 | if (r2t != NULL) { |
456 | __kfifo_put(tcp_task->r2tpool.queue, (void*)&r2t, | 457 | kfifo_in(&tcp_task->r2tpool.queue, (void*)&r2t, |
457 | sizeof(void*)); | 458 | sizeof(void*)); |
458 | tcp_task->r2t = NULL; | 459 | tcp_task->r2t = NULL; |
459 | } | 460 | } |
@@ -541,7 +542,7 @@ static int iscsi_tcp_r2t_rsp(struct iscsi_conn *conn, struct iscsi_task *task) | |||
541 | return 0; | 542 | return 0; |
542 | } | 543 | } |
543 | 544 | ||
544 | rc = __kfifo_get(tcp_task->r2tpool.queue, (void*)&r2t, sizeof(void*)); | 545 | rc = kfifo_out(&tcp_task->r2tpool.queue, (void*)&r2t, sizeof(void*)); |
545 | if (!rc) { | 546 | if (!rc) { |
546 | iscsi_conn_printk(KERN_ERR, conn, "Could not allocate R2T. " | 547 | iscsi_conn_printk(KERN_ERR, conn, "Could not allocate R2T. " |
547 | "Target has sent more R2Ts than it " | 548 | "Target has sent more R2Ts than it " |
@@ -554,7 +555,7 @@ static int iscsi_tcp_r2t_rsp(struct iscsi_conn *conn, struct iscsi_task *task) | |||
554 | if (r2t->data_length == 0) { | 555 | if (r2t->data_length == 0) { |
555 | iscsi_conn_printk(KERN_ERR, conn, | 556 | iscsi_conn_printk(KERN_ERR, conn, |
556 | "invalid R2T with zero data len\n"); | 557 | "invalid R2T with zero data len\n"); |
557 | __kfifo_put(tcp_task->r2tpool.queue, (void*)&r2t, | 558 | kfifo_in(&tcp_task->r2tpool.queue, (void*)&r2t, |
558 | sizeof(void*)); | 559 | sizeof(void*)); |
559 | return ISCSI_ERR_DATALEN; | 560 | return ISCSI_ERR_DATALEN; |
560 | } | 561 | } |
@@ -570,7 +571,7 @@ static int iscsi_tcp_r2t_rsp(struct iscsi_conn *conn, struct iscsi_task *task) | |||
570 | "invalid R2T with data len %u at offset %u " | 571 | "invalid R2T with data len %u at offset %u " |
571 | "and total length %d\n", r2t->data_length, | 572 | "and total length %d\n", r2t->data_length, |
572 | r2t->data_offset, scsi_out(task->sc)->length); | 573 | r2t->data_offset, scsi_out(task->sc)->length); |
573 | __kfifo_put(tcp_task->r2tpool.queue, (void*)&r2t, | 574 | kfifo_in(&tcp_task->r2tpool.queue, (void*)&r2t, |
574 | sizeof(void*)); | 575 | sizeof(void*)); |
575 | return ISCSI_ERR_DATALEN; | 576 | return ISCSI_ERR_DATALEN; |
576 | } | 577 | } |
@@ -580,7 +581,7 @@ static int iscsi_tcp_r2t_rsp(struct iscsi_conn *conn, struct iscsi_task *task) | |||
580 | r2t->sent = 0; | 581 | r2t->sent = 0; |
581 | 582 | ||
582 | tcp_task->exp_datasn = r2tsn + 1; | 583 | tcp_task->exp_datasn = r2tsn + 1; |
583 | __kfifo_put(tcp_task->r2tqueue, (void*)&r2t, sizeof(void*)); | 584 | kfifo_in(&tcp_task->r2tqueue, (void*)&r2t, sizeof(void*)); |
584 | conn->r2t_pdus_cnt++; | 585 | conn->r2t_pdus_cnt++; |
585 | 586 | ||
586 | iscsi_requeue_task(task); | 587 | iscsi_requeue_task(task); |
@@ -951,7 +952,7 @@ int iscsi_tcp_task_init(struct iscsi_task *task) | |||
951 | return conn->session->tt->init_pdu(task, 0, task->data_count); | 952 | return conn->session->tt->init_pdu(task, 0, task->data_count); |
952 | } | 953 | } |
953 | 954 | ||
954 | BUG_ON(__kfifo_len(tcp_task->r2tqueue)); | 955 | BUG_ON(kfifo_len(&tcp_task->r2tqueue)); |
955 | tcp_task->exp_datasn = 0; | 956 | tcp_task->exp_datasn = 0; |
956 | 957 | ||
957 | /* Prepare PDU, optionally w/ immediate data */ | 958 | /* Prepare PDU, optionally w/ immediate data */ |
@@ -982,7 +983,7 @@ static struct iscsi_r2t_info *iscsi_tcp_get_curr_r2t(struct iscsi_task *task) | |||
982 | if (r2t->data_length <= r2t->sent) { | 983 | if (r2t->data_length <= r2t->sent) { |
983 | ISCSI_DBG_TCP(task->conn, | 984 | ISCSI_DBG_TCP(task->conn, |
984 | " done with r2t %p\n", r2t); | 985 | " done with r2t %p\n", r2t); |
985 | __kfifo_put(tcp_task->r2tpool.queue, | 986 | kfifo_in(&tcp_task->r2tpool.queue, |
986 | (void *)&tcp_task->r2t, | 987 | (void *)&tcp_task->r2t, |
987 | sizeof(void *)); | 988 | sizeof(void *)); |
988 | tcp_task->r2t = r2t = NULL; | 989 | tcp_task->r2t = r2t = NULL; |
@@ -990,9 +991,12 @@ static struct iscsi_r2t_info *iscsi_tcp_get_curr_r2t(struct iscsi_task *task) | |||
990 | } | 991 | } |
991 | 992 | ||
992 | if (r2t == NULL) { | 993 | if (r2t == NULL) { |
993 | __kfifo_get(tcp_task->r2tqueue, | 994 | if (kfifo_out(&tcp_task->r2tqueue, |
994 | (void *)&tcp_task->r2t, sizeof(void *)); | 995 | (void *)&tcp_task->r2t, sizeof(void *)) != |
995 | r2t = tcp_task->r2t; | 996 | sizeof(void *)) |
997 | r2t = NULL; | ||
998 | else | ||
999 | r2t = tcp_task->r2t; | ||
996 | } | 1000 | } |
997 | spin_unlock_bh(&session->lock); | 1001 | spin_unlock_bh(&session->lock); |
998 | } | 1002 | } |
@@ -1004,7 +1008,7 @@ static struct iscsi_r2t_info *iscsi_tcp_get_curr_r2t(struct iscsi_task *task) | |||
1004 | * iscsi_tcp_task_xmit - xmit normal PDU task | 1008 | * iscsi_tcp_task_xmit - xmit normal PDU task |
1005 | * @task: iscsi command task | 1009 | * @task: iscsi command task |
1006 | * | 1010 | * |
1007 | * We're expected to return 0 when everything was transmitted succesfully, | 1011 | * We're expected to return 0 when everything was transmitted successfully, |
1008 | * -EAGAIN if there's still data in the queue, or != 0 for any other kind | 1012 | * -EAGAIN if there's still data in the queue, or != 0 for any other kind |
1009 | * of error. | 1013 | * of error. |
1010 | */ | 1014 | */ |
@@ -1127,9 +1131,8 @@ int iscsi_tcp_r2tpool_alloc(struct iscsi_session *session) | |||
1127 | } | 1131 | } |
1128 | 1132 | ||
1129 | /* R2T xmit queue */ | 1133 | /* R2T xmit queue */ |
1130 | tcp_task->r2tqueue = kfifo_alloc( | 1134 | if (kfifo_alloc(&tcp_task->r2tqueue, |
1131 | session->max_r2t * 4 * sizeof(void*), GFP_KERNEL, NULL); | 1135 | session->max_r2t * 4 * sizeof(void*), GFP_KERNEL)) { |
1132 | if (tcp_task->r2tqueue == ERR_PTR(-ENOMEM)) { | ||
1133 | iscsi_pool_free(&tcp_task->r2tpool); | 1136 | iscsi_pool_free(&tcp_task->r2tpool); |
1134 | goto r2t_alloc_fail; | 1137 | goto r2t_alloc_fail; |
1135 | } | 1138 | } |
@@ -1142,7 +1145,7 @@ r2t_alloc_fail: | |||
1142 | struct iscsi_task *task = session->cmds[i]; | 1145 | struct iscsi_task *task = session->cmds[i]; |
1143 | struct iscsi_tcp_task *tcp_task = task->dd_data; | 1146 | struct iscsi_tcp_task *tcp_task = task->dd_data; |
1144 | 1147 | ||
1145 | kfifo_free(tcp_task->r2tqueue); | 1148 | kfifo_free(&tcp_task->r2tqueue); |
1146 | iscsi_pool_free(&tcp_task->r2tpool); | 1149 | iscsi_pool_free(&tcp_task->r2tpool); |
1147 | } | 1150 | } |
1148 | return -ENOMEM; | 1151 | return -ENOMEM; |
@@ -1157,7 +1160,7 @@ void iscsi_tcp_r2tpool_free(struct iscsi_session *session) | |||
1157 | struct iscsi_task *task = session->cmds[i]; | 1160 | struct iscsi_task *task = session->cmds[i]; |
1158 | struct iscsi_tcp_task *tcp_task = task->dd_data; | 1161 | struct iscsi_tcp_task *tcp_task = task->dd_data; |
1159 | 1162 | ||
1160 | kfifo_free(tcp_task->r2tqueue); | 1163 | kfifo_free(&tcp_task->r2tqueue); |
1161 | iscsi_pool_free(&tcp_task->r2tpool); | 1164 | iscsi_pool_free(&tcp_task->r2tpool); |
1162 | } | 1165 | } |
1163 | } | 1166 | } |