1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * iSCSI Initiator over TCP/IP Data-Path
5 * Copyright (C) 2004 Dmitry Yusupov
6 * Copyright (C) 2004 Alex Aizman
7 * Copyright (C) 2005 - 2006 Mike Christie
8 * Copyright (C) 2006 Red Hat, Inc. All rights reserved.
9 * maintained by open-iscsi@googlegroups.com
11 * See the file COPYING included with this distribution for more details.
20 #include <crypto/hash.h>
21 #include <linux/types.h>
22 #include <linux/inet.h>
23 #include <linux/slab.h>
24 #include <linux/sched/mm.h>
25 #include <linux/file.h>
26 #include <linux/blkdev.h>
27 #include <linux/delay.h>
28 #include <linux/kfifo.h>
29 #include <linux/scatterlist.h>
30 #include <linux/module.h>
31 #include <linux/backing-dev.h>
33 #include <scsi/scsi_cmnd.h>
34 #include <scsi/scsi_device.h>
35 #include <scsi/scsi_host.h>
36 #include <scsi/scsi.h>
37 #include <scsi/scsi_transport_iscsi.h>
38 #include <trace/events/iscsi.h>
39 #include <trace/events/sock.h>
41 #include "iscsi_tcp.h"
43 MODULE_AUTHOR("Mike Christie <michaelc@cs.wisc.edu>, "
44 "Dmitry Yusupov <dmitry_yus@yahoo.com>, "
45 "Alex Aizman <itn780@yahoo.com>");
46 MODULE_DESCRIPTION("iSCSI/TCP data-path");
47 MODULE_LICENSE("GPL");
49 static struct scsi_transport_template
*iscsi_sw_tcp_scsi_transport
;
50 static const struct scsi_host_template iscsi_sw_tcp_sht
;
51 static struct iscsi_transport iscsi_sw_tcp_transport
;
53 static unsigned int iscsi_max_lun
= ~0;
54 module_param_named(max_lun
, iscsi_max_lun
, uint
, S_IRUGO
);
56 static bool iscsi_recv_from_iscsi_q
;
57 module_param_named(recv_from_iscsi_q
, iscsi_recv_from_iscsi_q
, bool, 0644);
58 MODULE_PARM_DESC(recv_from_iscsi_q
, "Set to true to read iSCSI data/headers from the iscsi_q workqueue. The default is false which will perform reads from the network softirq context.");
60 static int iscsi_sw_tcp_dbg
;
61 module_param_named(debug_iscsi_tcp
, iscsi_sw_tcp_dbg
, int,
63 MODULE_PARM_DESC(debug_iscsi_tcp
, "Turn on debugging for iscsi_tcp module "
64 "Set to 1 to turn on, and zero to turn off. Default is off.");
66 #define ISCSI_SW_TCP_DBG(_conn, dbg_fmt, arg...) \
68 if (iscsi_sw_tcp_dbg) \
69 iscsi_conn_printk(KERN_INFO, _conn, \
72 iscsi_dbg_trace(trace_iscsi_dbg_sw_tcp, \
73 &(_conn)->cls_conn->dev, \
74 "%s " dbg_fmt, __func__, ##arg);\
79 * iscsi_sw_tcp_recv - TCP receive in sendfile fashion
80 * @rd_desc: read descriptor
82 * @offset: offset in skb
83 * @len: skb->len - offset
85 static int iscsi_sw_tcp_recv(read_descriptor_t
*rd_desc
, struct sk_buff
*skb
,
86 unsigned int offset
, size_t len
)
88 struct iscsi_conn
*conn
= rd_desc
->arg
.data
;
89 unsigned int consumed
, total_consumed
= 0;
92 ISCSI_SW_TCP_DBG(conn
, "in %d bytes\n", skb
->len
- offset
);
96 consumed
= iscsi_tcp_recv_skb(conn
, skb
, offset
, 0, &status
);
98 total_consumed
+= consumed
;
99 } while (consumed
!= 0 && status
!= ISCSI_TCP_SKB_DONE
);
101 ISCSI_SW_TCP_DBG(conn
, "read %d bytes status %d\n",
102 skb
->len
- offset
, status
);
103 return total_consumed
;
107 * iscsi_sw_sk_state_check - check socket state
110 * If the socket is in CLOSE or CLOSE_WAIT we should
111 * not close the connection if there is still some
114 * Must be called with sk_callback_lock.
116 static inline int iscsi_sw_sk_state_check(struct sock
*sk
)
118 struct iscsi_conn
*conn
= sk
->sk_user_data
;
120 if ((sk
->sk_state
== TCP_CLOSE_WAIT
|| sk
->sk_state
== TCP_CLOSE
) &&
121 (conn
->session
->state
!= ISCSI_STATE_LOGGING_OUT
) &&
122 !atomic_read(&sk
->sk_rmem_alloc
)) {
123 ISCSI_SW_TCP_DBG(conn
, "TCP_CLOSE|TCP_CLOSE_WAIT\n");
124 iscsi_conn_failure(conn
, ISCSI_ERR_TCP_CONN_CLOSE
);
130 static void iscsi_sw_tcp_recv_data(struct iscsi_conn
*conn
)
132 struct iscsi_tcp_conn
*tcp_conn
= conn
->dd_data
;
133 struct iscsi_sw_tcp_conn
*tcp_sw_conn
= tcp_conn
->dd_data
;
134 struct sock
*sk
= tcp_sw_conn
->sock
->sk
;
135 read_descriptor_t rd_desc
;
138 * Use rd_desc to pass 'conn' to iscsi_tcp_recv.
139 * We set count to 1 because we want the network layer to
140 * hand us all the skbs that are available. iscsi_tcp_recv
141 * handled pdus that cross buffers or pdus that still need data.
143 rd_desc
.arg
.data
= conn
;
146 tcp_read_sock(sk
, &rd_desc
, iscsi_sw_tcp_recv
);
148 /* If we had to (atomically) map a highmem page,
150 iscsi_tcp_segment_unmap(&tcp_conn
->in
.segment
);
152 iscsi_sw_sk_state_check(sk
);
155 static void iscsi_sw_tcp_recv_data_work(struct work_struct
*work
)
157 struct iscsi_conn
*conn
= container_of(work
, struct iscsi_conn
,
159 struct iscsi_tcp_conn
*tcp_conn
= conn
->dd_data
;
160 struct iscsi_sw_tcp_conn
*tcp_sw_conn
= tcp_conn
->dd_data
;
161 struct sock
*sk
= tcp_sw_conn
->sock
->sk
;
164 iscsi_sw_tcp_recv_data(conn
);
168 static void iscsi_sw_tcp_data_ready(struct sock
*sk
)
170 struct iscsi_sw_tcp_conn
*tcp_sw_conn
;
171 struct iscsi_tcp_conn
*tcp_conn
;
172 struct iscsi_conn
*conn
;
174 trace_sk_data_ready(sk
);
176 read_lock_bh(&sk
->sk_callback_lock
);
177 conn
= sk
->sk_user_data
;
179 read_unlock_bh(&sk
->sk_callback_lock
);
182 tcp_conn
= conn
->dd_data
;
183 tcp_sw_conn
= tcp_conn
->dd_data
;
185 if (tcp_sw_conn
->queue_recv
)
186 iscsi_conn_queue_recv(conn
);
188 iscsi_sw_tcp_recv_data(conn
);
189 read_unlock_bh(&sk
->sk_callback_lock
);
192 static void iscsi_sw_tcp_state_change(struct sock
*sk
)
194 struct iscsi_tcp_conn
*tcp_conn
;
195 struct iscsi_sw_tcp_conn
*tcp_sw_conn
;
196 struct iscsi_conn
*conn
;
197 void (*old_state_change
)(struct sock
*);
199 read_lock_bh(&sk
->sk_callback_lock
);
200 conn
= sk
->sk_user_data
;
202 read_unlock_bh(&sk
->sk_callback_lock
);
206 iscsi_sw_sk_state_check(sk
);
208 tcp_conn
= conn
->dd_data
;
209 tcp_sw_conn
= tcp_conn
->dd_data
;
210 old_state_change
= tcp_sw_conn
->old_state_change
;
212 read_unlock_bh(&sk
->sk_callback_lock
);
214 old_state_change(sk
);
218 * iscsi_sw_tcp_write_space - Called when more output buffer space is available
219 * @sk: socket space is available for
221 static void iscsi_sw_tcp_write_space(struct sock
*sk
)
223 struct iscsi_conn
*conn
;
224 struct iscsi_tcp_conn
*tcp_conn
;
225 struct iscsi_sw_tcp_conn
*tcp_sw_conn
;
226 void (*old_write_space
)(struct sock
*);
228 read_lock_bh(&sk
->sk_callback_lock
);
229 conn
= sk
->sk_user_data
;
231 read_unlock_bh(&sk
->sk_callback_lock
);
235 tcp_conn
= conn
->dd_data
;
236 tcp_sw_conn
= tcp_conn
->dd_data
;
237 old_write_space
= tcp_sw_conn
->old_write_space
;
238 read_unlock_bh(&sk
->sk_callback_lock
);
242 ISCSI_SW_TCP_DBG(conn
, "iscsi_write_space\n");
243 iscsi_conn_queue_xmit(conn
);
246 static void iscsi_sw_tcp_conn_set_callbacks(struct iscsi_conn
*conn
)
248 struct iscsi_tcp_conn
*tcp_conn
= conn
->dd_data
;
249 struct iscsi_sw_tcp_conn
*tcp_sw_conn
= tcp_conn
->dd_data
;
250 struct sock
*sk
= tcp_sw_conn
->sock
->sk
;
252 /* assign new callbacks */
253 write_lock_bh(&sk
->sk_callback_lock
);
254 sk
->sk_user_data
= conn
;
255 tcp_sw_conn
->old_data_ready
= sk
->sk_data_ready
;
256 tcp_sw_conn
->old_state_change
= sk
->sk_state_change
;
257 tcp_sw_conn
->old_write_space
= sk
->sk_write_space
;
258 sk
->sk_data_ready
= iscsi_sw_tcp_data_ready
;
259 sk
->sk_state_change
= iscsi_sw_tcp_state_change
;
260 sk
->sk_write_space
= iscsi_sw_tcp_write_space
;
261 write_unlock_bh(&sk
->sk_callback_lock
);
265 iscsi_sw_tcp_conn_restore_callbacks(struct iscsi_conn
*conn
)
267 struct iscsi_tcp_conn
*tcp_conn
= conn
->dd_data
;
268 struct iscsi_sw_tcp_conn
*tcp_sw_conn
= tcp_conn
->dd_data
;
269 struct sock
*sk
= tcp_sw_conn
->sock
->sk
;
271 /* restore socket callbacks, see also: iscsi_conn_set_callbacks() */
272 write_lock_bh(&sk
->sk_callback_lock
);
273 sk
->sk_user_data
= NULL
;
274 sk
->sk_data_ready
= tcp_sw_conn
->old_data_ready
;
275 sk
->sk_state_change
= tcp_sw_conn
->old_state_change
;
276 sk
->sk_write_space
= tcp_sw_conn
->old_write_space
;
277 sk
->sk_no_check_tx
= 0;
278 write_unlock_bh(&sk
->sk_callback_lock
);
282 * iscsi_sw_tcp_xmit_segment - transmit segment
283 * @tcp_conn: the iSCSI TCP connection
284 * @segment: the buffer to transmnit
286 * This function transmits as much of the buffer as
287 * the network layer will accept, and returns the number of
290 * If CRC hashing is enabled, the function will compute the
291 * hash as it goes. When the entire segment has been transmitted,
292 * it will retrieve the hash value and send it as well.
294 static int iscsi_sw_tcp_xmit_segment(struct iscsi_tcp_conn
*tcp_conn
,
295 struct iscsi_segment
*segment
)
297 struct iscsi_sw_tcp_conn
*tcp_sw_conn
= tcp_conn
->dd_data
;
298 struct socket
*sk
= tcp_sw_conn
->sock
;
299 unsigned int copied
= 0;
302 while (!iscsi_tcp_segment_done(tcp_conn
, segment
, 0, r
)) {
303 struct scatterlist
*sg
;
304 struct msghdr msg
= {};
306 unsigned int offset
, copy
;
309 offset
= segment
->copied
;
310 copy
= segment
->size
- offset
;
312 if (segment
->total_copied
+ segment
->size
< segment
->total_size
)
313 msg
.msg_flags
|= MSG_MORE
;
315 if (tcp_sw_conn
->queue_recv
)
316 msg
.msg_flags
|= MSG_DONTWAIT
;
318 if (!segment
->data
) {
319 if (!tcp_conn
->iscsi_conn
->datadgst_en
)
320 msg
.msg_flags
|= MSG_SPLICE_PAGES
;
322 offset
+= segment
->sg_offset
+ sg
->offset
;
323 bvec_set_page(&bv
, sg_page(sg
), copy
, offset
);
325 bvec_set_virt(&bv
, segment
->data
+ offset
, copy
);
327 iov_iter_bvec(&msg
.msg_iter
, ITER_SOURCE
, &bv
, 1, copy
);
329 r
= sock_sendmsg(sk
, &msg
);
331 iscsi_tcp_segment_unmap(segment
);
340 * iscsi_sw_tcp_xmit - TCP transmit
341 * @conn: iscsi connection
343 static int iscsi_sw_tcp_xmit(struct iscsi_conn
*conn
)
345 struct iscsi_tcp_conn
*tcp_conn
= conn
->dd_data
;
346 struct iscsi_sw_tcp_conn
*tcp_sw_conn
= tcp_conn
->dd_data
;
347 struct iscsi_segment
*segment
= &tcp_sw_conn
->out
.segment
;
348 unsigned int consumed
= 0;
352 rc
= iscsi_sw_tcp_xmit_segment(tcp_conn
, segment
);
354 * We may not have been able to send data because the conn
355 * is getting stopped. libiscsi will know so propagate err
356 * for it to do the right thing.
361 rc
= ISCSI_ERR_XMIT_FAILED
;
368 if (segment
->total_copied
>= segment
->total_size
) {
369 if (segment
->done
!= NULL
) {
370 rc
= segment
->done(tcp_conn
, segment
);
377 ISCSI_SW_TCP_DBG(conn
, "xmit %d bytes\n", consumed
);
379 conn
->txdata_octets
+= consumed
;
383 /* Transmit error. We could initiate error recovery
385 ISCSI_SW_TCP_DBG(conn
, "Error sending PDU, errno=%d\n", rc
);
386 iscsi_conn_failure(conn
, rc
);
391 * iscsi_sw_tcp_xmit_qlen - return the number of bytes queued for xmit
392 * @conn: iscsi connection
394 static inline int iscsi_sw_tcp_xmit_qlen(struct iscsi_conn
*conn
)
396 struct iscsi_tcp_conn
*tcp_conn
= conn
->dd_data
;
397 struct iscsi_sw_tcp_conn
*tcp_sw_conn
= tcp_conn
->dd_data
;
398 struct iscsi_segment
*segment
= &tcp_sw_conn
->out
.segment
;
400 return segment
->total_copied
- segment
->total_size
;
403 static int iscsi_sw_tcp_pdu_xmit(struct iscsi_task
*task
)
405 struct iscsi_conn
*conn
= task
->conn
;
406 unsigned int noreclaim_flag
;
407 struct iscsi_tcp_conn
*tcp_conn
= conn
->dd_data
;
408 struct iscsi_sw_tcp_conn
*tcp_sw_conn
= tcp_conn
->dd_data
;
411 if (!tcp_sw_conn
->sock
) {
412 iscsi_conn_printk(KERN_ERR
, conn
,
413 "Transport not bound to socket!\n");
417 noreclaim_flag
= memalloc_noreclaim_save();
419 while (iscsi_sw_tcp_xmit_qlen(conn
)) {
420 rc
= iscsi_sw_tcp_xmit(conn
);
430 memalloc_noreclaim_restore(noreclaim_flag
);
435 * This is called when we're done sending the header.
436 * Simply copy the data_segment to the send segment, and return.
438 static int iscsi_sw_tcp_send_hdr_done(struct iscsi_tcp_conn
*tcp_conn
,
439 struct iscsi_segment
*segment
)
441 struct iscsi_sw_tcp_conn
*tcp_sw_conn
= tcp_conn
->dd_data
;
443 tcp_sw_conn
->out
.segment
= tcp_sw_conn
->out
.data_segment
;
444 ISCSI_SW_TCP_DBG(tcp_conn
->iscsi_conn
,
445 "Header done. Next segment size %u total_size %u\n",
446 tcp_sw_conn
->out
.segment
.size
,
447 tcp_sw_conn
->out
.segment
.total_size
);
451 static void iscsi_sw_tcp_send_hdr_prep(struct iscsi_conn
*conn
, void *hdr
,
454 struct iscsi_tcp_conn
*tcp_conn
= conn
->dd_data
;
455 struct iscsi_sw_tcp_conn
*tcp_sw_conn
= tcp_conn
->dd_data
;
457 ISCSI_SW_TCP_DBG(conn
, "%s\n", conn
->hdrdgst_en
?
458 "digest enabled" : "digest disabled");
460 /* Clear the data segment - needs to be filled in by the
461 * caller using iscsi_tcp_send_data_prep() */
462 memset(&tcp_sw_conn
->out
.data_segment
, 0,
463 sizeof(struct iscsi_segment
));
465 /* If header digest is enabled, compute the CRC and
466 * place the digest into the same buffer. We make
467 * sure that both iscsi_tcp_task and mtask have
470 if (conn
->hdrdgst_en
) {
471 iscsi_tcp_dgst_header(tcp_sw_conn
->tx_hash
, hdr
, hdrlen
,
473 hdrlen
+= ISCSI_DIGEST_SIZE
;
476 /* Remember header pointer for later, when we need
477 * to decide whether there's a payload to go along
478 * with the header. */
479 tcp_sw_conn
->out
.hdr
= hdr
;
481 iscsi_segment_init_linear(&tcp_sw_conn
->out
.segment
, hdr
, hdrlen
,
482 iscsi_sw_tcp_send_hdr_done
, NULL
);
486 * Prepare the send buffer for the payload data.
487 * Padding and checksumming will all be taken care
488 * of by the iscsi_segment routines.
491 iscsi_sw_tcp_send_data_prep(struct iscsi_conn
*conn
, struct scatterlist
*sg
,
492 unsigned int count
, unsigned int offset
,
495 struct iscsi_tcp_conn
*tcp_conn
= conn
->dd_data
;
496 struct iscsi_sw_tcp_conn
*tcp_sw_conn
= tcp_conn
->dd_data
;
497 struct ahash_request
*tx_hash
= NULL
;
498 unsigned int hdr_spec_len
;
500 ISCSI_SW_TCP_DBG(conn
, "offset=%d, datalen=%d %s\n", offset
, len
,
502 "digest enabled" : "digest disabled");
504 /* Make sure the datalen matches what the caller
505 said he would send. */
506 hdr_spec_len
= ntoh24(tcp_sw_conn
->out
.hdr
->dlength
);
507 WARN_ON(iscsi_padded(len
) != iscsi_padded(hdr_spec_len
));
509 if (conn
->datadgst_en
)
510 tx_hash
= tcp_sw_conn
->tx_hash
;
512 return iscsi_segment_seek_sg(&tcp_sw_conn
->out
.data_segment
,
513 sg
, count
, offset
, len
,
518 iscsi_sw_tcp_send_linear_data_prep(struct iscsi_conn
*conn
, void *data
,
521 struct iscsi_tcp_conn
*tcp_conn
= conn
->dd_data
;
522 struct iscsi_sw_tcp_conn
*tcp_sw_conn
= tcp_conn
->dd_data
;
523 struct ahash_request
*tx_hash
= NULL
;
524 unsigned int hdr_spec_len
;
526 ISCSI_SW_TCP_DBG(conn
, "datalen=%zd %s\n", len
, conn
->datadgst_en
?
527 "digest enabled" : "digest disabled");
529 /* Make sure the datalen matches what the caller
530 said he would send. */
531 hdr_spec_len
= ntoh24(tcp_sw_conn
->out
.hdr
->dlength
);
532 WARN_ON(iscsi_padded(len
) != iscsi_padded(hdr_spec_len
));
534 if (conn
->datadgst_en
)
535 tx_hash
= tcp_sw_conn
->tx_hash
;
537 iscsi_segment_init_linear(&tcp_sw_conn
->out
.data_segment
,
538 data
, len
, NULL
, tx_hash
);
541 static int iscsi_sw_tcp_pdu_init(struct iscsi_task
*task
,
542 unsigned int offset
, unsigned int count
)
544 struct iscsi_conn
*conn
= task
->conn
;
547 iscsi_sw_tcp_send_hdr_prep(conn
, task
->hdr
, task
->hdr_len
);
553 iscsi_sw_tcp_send_linear_data_prep(conn
, task
->data
, count
);
555 struct scsi_data_buffer
*sdb
= &task
->sc
->sdb
;
557 err
= iscsi_sw_tcp_send_data_prep(conn
, sdb
->table
.sgl
,
558 sdb
->table
.nents
, offset
,
563 /* got invalid offset/len */
569 static int iscsi_sw_tcp_pdu_alloc(struct iscsi_task
*task
, uint8_t opcode
)
571 struct iscsi_tcp_task
*tcp_task
= task
->dd_data
;
573 task
->hdr
= task
->dd_data
+ sizeof(*tcp_task
);
574 task
->hdr_max
= sizeof(struct iscsi_sw_tcp_hdrbuf
) - ISCSI_DIGEST_SIZE
;
578 static struct iscsi_cls_conn
*
579 iscsi_sw_tcp_conn_create(struct iscsi_cls_session
*cls_session
,
582 struct iscsi_conn
*conn
;
583 struct iscsi_cls_conn
*cls_conn
;
584 struct iscsi_tcp_conn
*tcp_conn
;
585 struct iscsi_sw_tcp_conn
*tcp_sw_conn
;
586 struct crypto_ahash
*tfm
;
588 cls_conn
= iscsi_tcp_conn_setup(cls_session
, sizeof(*tcp_sw_conn
),
592 conn
= cls_conn
->dd_data
;
593 tcp_conn
= conn
->dd_data
;
594 tcp_sw_conn
= tcp_conn
->dd_data
;
595 INIT_WORK(&conn
->recvwork
, iscsi_sw_tcp_recv_data_work
);
596 tcp_sw_conn
->queue_recv
= iscsi_recv_from_iscsi_q
;
598 mutex_init(&tcp_sw_conn
->sock_lock
);
600 tfm
= crypto_alloc_ahash("crc32c", 0, CRYPTO_ALG_ASYNC
);
604 tcp_sw_conn
->tx_hash
= ahash_request_alloc(tfm
, GFP_KERNEL
);
605 if (!tcp_sw_conn
->tx_hash
)
607 ahash_request_set_callback(tcp_sw_conn
->tx_hash
, 0, NULL
, NULL
);
609 tcp_sw_conn
->rx_hash
= ahash_request_alloc(tfm
, GFP_KERNEL
);
610 if (!tcp_sw_conn
->rx_hash
)
612 ahash_request_set_callback(tcp_sw_conn
->rx_hash
, 0, NULL
, NULL
);
614 tcp_conn
->rx_hash
= tcp_sw_conn
->rx_hash
;
619 ahash_request_free(tcp_sw_conn
->tx_hash
);
621 crypto_free_ahash(tfm
);
623 iscsi_conn_printk(KERN_ERR
, conn
,
624 "Could not create connection due to crc32c "
625 "loading error. Make sure the crc32c "
626 "module is built as a module or into the "
628 iscsi_tcp_conn_teardown(cls_conn
);
632 static void iscsi_sw_tcp_release_conn(struct iscsi_conn
*conn
)
634 struct iscsi_tcp_conn
*tcp_conn
= conn
->dd_data
;
635 struct iscsi_sw_tcp_conn
*tcp_sw_conn
= tcp_conn
->dd_data
;
636 struct socket
*sock
= tcp_sw_conn
->sock
;
639 * The iscsi transport class will make sure we are not called in
640 * parallel with start, stop, bind and destroys. However, this can be
641 * called twice if userspace does a stop then a destroy.
647 * Make sure we start socket shutdown now in case userspace is up
648 * but delayed in releasing the socket.
650 kernel_sock_shutdown(sock
, SHUT_RDWR
);
653 iscsi_sw_tcp_conn_restore_callbacks(conn
);
656 iscsi_suspend_rx(conn
);
658 mutex_lock(&tcp_sw_conn
->sock_lock
);
659 tcp_sw_conn
->sock
= NULL
;
660 mutex_unlock(&tcp_sw_conn
->sock_lock
);
664 static void iscsi_sw_tcp_conn_destroy(struct iscsi_cls_conn
*cls_conn
)
666 struct iscsi_conn
*conn
= cls_conn
->dd_data
;
667 struct iscsi_tcp_conn
*tcp_conn
= conn
->dd_data
;
668 struct iscsi_sw_tcp_conn
*tcp_sw_conn
= tcp_conn
->dd_data
;
670 iscsi_sw_tcp_release_conn(conn
);
672 ahash_request_free(tcp_sw_conn
->rx_hash
);
673 if (tcp_sw_conn
->tx_hash
) {
674 struct crypto_ahash
*tfm
;
676 tfm
= crypto_ahash_reqtfm(tcp_sw_conn
->tx_hash
);
677 ahash_request_free(tcp_sw_conn
->tx_hash
);
678 crypto_free_ahash(tfm
);
681 iscsi_tcp_conn_teardown(cls_conn
);
684 static void iscsi_sw_tcp_conn_stop(struct iscsi_cls_conn
*cls_conn
, int flag
)
686 struct iscsi_conn
*conn
= cls_conn
->dd_data
;
687 struct iscsi_tcp_conn
*tcp_conn
= conn
->dd_data
;
688 struct iscsi_sw_tcp_conn
*tcp_sw_conn
= tcp_conn
->dd_data
;
689 struct socket
*sock
= tcp_sw_conn
->sock
;
691 /* userspace may have goofed up and not bound us */
695 sock
->sk
->sk_err
= EIO
;
696 wake_up_interruptible(sk_sleep(sock
->sk
));
699 iscsi_suspend_tx(conn
);
701 /* stop recv side and release socket */
702 iscsi_sw_tcp_release_conn(conn
);
704 iscsi_conn_stop(cls_conn
, flag
);
708 iscsi_sw_tcp_conn_bind(struct iscsi_cls_session
*cls_session
,
709 struct iscsi_cls_conn
*cls_conn
, uint64_t transport_eph
,
712 struct iscsi_conn
*conn
= cls_conn
->dd_data
;
713 struct iscsi_tcp_conn
*tcp_conn
= conn
->dd_data
;
714 struct iscsi_sw_tcp_conn
*tcp_sw_conn
= tcp_conn
->dd_data
;
719 /* lookup for existing socket */
720 sock
= sockfd_lookup((int)transport_eph
, &err
);
722 iscsi_conn_printk(KERN_ERR
, conn
,
723 "sockfd_lookup failed %d\n", err
);
728 if (!sk_is_tcp(sock
->sk
))
731 err
= iscsi_conn_bind(cls_session
, cls_conn
, is_leading
);
735 mutex_lock(&tcp_sw_conn
->sock_lock
);
736 /* bind iSCSI connection and socket */
737 tcp_sw_conn
->sock
= sock
;
738 mutex_unlock(&tcp_sw_conn
->sock_lock
);
740 /* setup Socket parameters */
742 sk
->sk_reuse
= SK_CAN_REUSE
;
743 sk
->sk_sndtimeo
= 15 * HZ
; /* FIXME: make it configurable */
744 sk
->sk_allocation
= GFP_ATOMIC
;
745 sk
->sk_use_task_frag
= false;
749 iscsi_sw_tcp_conn_set_callbacks(conn
);
751 * set receive state machine into initial state
753 iscsi_tcp_hdr_recv_prep(tcp_conn
);
761 static int iscsi_sw_tcp_conn_set_param(struct iscsi_cls_conn
*cls_conn
,
762 enum iscsi_param param
, char *buf
,
765 struct iscsi_conn
*conn
= cls_conn
->dd_data
;
766 struct iscsi_tcp_conn
*tcp_conn
= conn
->dd_data
;
767 struct iscsi_sw_tcp_conn
*tcp_sw_conn
= tcp_conn
->dd_data
;
770 case ISCSI_PARAM_HDRDGST_EN
:
771 iscsi_set_param(cls_conn
, param
, buf
, buflen
);
773 case ISCSI_PARAM_DATADGST_EN
:
774 mutex_lock(&tcp_sw_conn
->sock_lock
);
775 if (!tcp_sw_conn
->sock
) {
776 mutex_unlock(&tcp_sw_conn
->sock_lock
);
779 iscsi_set_param(cls_conn
, param
, buf
, buflen
);
780 mutex_unlock(&tcp_sw_conn
->sock_lock
);
782 case ISCSI_PARAM_MAX_R2T
:
783 return iscsi_tcp_set_max_r2t(conn
, buf
);
785 return iscsi_set_param(cls_conn
, param
, buf
, buflen
);
791 static int iscsi_sw_tcp_conn_get_param(struct iscsi_cls_conn
*cls_conn
,
792 enum iscsi_param param
, char *buf
)
794 struct iscsi_conn
*conn
= cls_conn
->dd_data
;
795 struct iscsi_sw_tcp_conn
*tcp_sw_conn
;
796 struct iscsi_tcp_conn
*tcp_conn
;
797 struct sockaddr_in6 addr
;
802 case ISCSI_PARAM_CONN_PORT
:
803 case ISCSI_PARAM_CONN_ADDRESS
:
804 case ISCSI_PARAM_LOCAL_PORT
:
805 spin_lock_bh(&conn
->session
->frwd_lock
);
806 if (!conn
->session
->leadconn
) {
807 spin_unlock_bh(&conn
->session
->frwd_lock
);
811 * The conn has been setup and bound, so just grab a ref
812 * incase a destroy runs while we are in the net layer.
814 iscsi_get_conn(conn
->cls_conn
);
815 spin_unlock_bh(&conn
->session
->frwd_lock
);
817 tcp_conn
= conn
->dd_data
;
818 tcp_sw_conn
= tcp_conn
->dd_data
;
820 mutex_lock(&tcp_sw_conn
->sock_lock
);
821 sock
= tcp_sw_conn
->sock
;
827 if (param
== ISCSI_PARAM_LOCAL_PORT
)
828 rc
= kernel_getsockname(sock
,
829 (struct sockaddr
*)&addr
);
831 rc
= kernel_getpeername(sock
,
832 (struct sockaddr
*)&addr
);
834 mutex_unlock(&tcp_sw_conn
->sock_lock
);
835 iscsi_put_conn(conn
->cls_conn
);
839 return iscsi_conn_get_addr_param((struct sockaddr_storage
*)
842 return iscsi_conn_get_param(cls_conn
, param
, buf
);
848 static int iscsi_sw_tcp_host_get_param(struct Scsi_Host
*shost
,
849 enum iscsi_host_param param
, char *buf
)
851 struct iscsi_sw_tcp_host
*tcp_sw_host
= iscsi_host_priv(shost
);
852 struct iscsi_session
*session
;
853 struct iscsi_conn
*conn
;
854 struct iscsi_tcp_conn
*tcp_conn
;
855 struct iscsi_sw_tcp_conn
*tcp_sw_conn
;
856 struct sockaddr_in6 addr
;
861 case ISCSI_HOST_PARAM_IPADDRESS
:
862 session
= tcp_sw_host
->session
;
866 spin_lock_bh(&session
->frwd_lock
);
867 conn
= session
->leadconn
;
869 spin_unlock_bh(&session
->frwd_lock
);
872 tcp_conn
= conn
->dd_data
;
873 tcp_sw_conn
= tcp_conn
->dd_data
;
875 * The conn has been setup and bound, so just grab a ref
876 * incase a destroy runs while we are in the net layer.
878 iscsi_get_conn(conn
->cls_conn
);
879 spin_unlock_bh(&session
->frwd_lock
);
881 mutex_lock(&tcp_sw_conn
->sock_lock
);
882 sock
= tcp_sw_conn
->sock
;
886 rc
= kernel_getsockname(sock
, (struct sockaddr
*)&addr
);
887 mutex_unlock(&tcp_sw_conn
->sock_lock
);
888 iscsi_put_conn(conn
->cls_conn
);
892 return iscsi_conn_get_addr_param((struct sockaddr_storage
*)
894 (enum iscsi_param
)param
, buf
);
896 return iscsi_host_get_param(shost
, param
, buf
);
903 iscsi_sw_tcp_conn_get_stats(struct iscsi_cls_conn
*cls_conn
,
904 struct iscsi_stats
*stats
)
906 struct iscsi_conn
*conn
= cls_conn
->dd_data
;
907 struct iscsi_tcp_conn
*tcp_conn
= conn
->dd_data
;
908 struct iscsi_sw_tcp_conn
*tcp_sw_conn
= tcp_conn
->dd_data
;
910 stats
->custom_length
= 3;
911 strcpy(stats
->custom
[0].desc
, "tx_sendpage_failures");
912 stats
->custom
[0].value
= tcp_sw_conn
->sendpage_failures_cnt
;
913 strcpy(stats
->custom
[1].desc
, "rx_discontiguous_hdr");
914 stats
->custom
[1].value
= tcp_sw_conn
->discontiguous_hdr_cnt
;
915 strcpy(stats
->custom
[2].desc
, "eh_abort_cnt");
916 stats
->custom
[2].value
= conn
->eh_abort_cnt
;
918 iscsi_tcp_conn_get_stats(cls_conn
, stats
);
921 static struct iscsi_cls_session
*
922 iscsi_sw_tcp_session_create(struct iscsi_endpoint
*ep
, uint16_t cmds_max
,
923 uint16_t qdepth
, uint32_t initial_cmdsn
)
925 struct iscsi_cls_session
*cls_session
;
926 struct iscsi_session
*session
;
927 struct iscsi_sw_tcp_host
*tcp_sw_host
;
928 struct Scsi_Host
*shost
;
932 printk(KERN_ERR
"iscsi_tcp: invalid ep %p.\n", ep
);
936 shost
= iscsi_host_alloc(&iscsi_sw_tcp_sht
,
937 sizeof(struct iscsi_sw_tcp_host
), 1);
940 shost
->transportt
= iscsi_sw_tcp_scsi_transport
;
941 shost
->cmd_per_lun
= qdepth
;
942 shost
->max_lun
= iscsi_max_lun
;
944 shost
->max_channel
= 0;
945 shost
->max_cmd_len
= SCSI_MAX_VARLEN_CDB_SIZE
;
946 shost
->dma_alignment
= 0;
948 rc
= iscsi_host_get_max_scsi_cmds(shost
, cmds_max
);
951 shost
->can_queue
= rc
;
953 if (iscsi_host_add(shost
, NULL
))
956 cls_session
= iscsi_session_setup(&iscsi_sw_tcp_transport
, shost
,
958 sizeof(struct iscsi_tcp_task
) +
959 sizeof(struct iscsi_sw_tcp_hdrbuf
),
963 session
= cls_session
->dd_data
;
965 if (iscsi_tcp_r2tpool_alloc(session
))
968 /* We are now fully setup so expose the session to sysfs. */
969 tcp_sw_host
= iscsi_host_priv(shost
);
970 tcp_sw_host
->session
= session
;
974 iscsi_session_teardown(cls_session
);
976 iscsi_host_remove(shost
, false);
978 iscsi_host_free(shost
);
982 static void iscsi_sw_tcp_session_destroy(struct iscsi_cls_session
*cls_session
)
984 struct Scsi_Host
*shost
= iscsi_session_to_shost(cls_session
);
985 struct iscsi_session
*session
= cls_session
->dd_data
;
987 if (WARN_ON_ONCE(session
->leadconn
))
990 iscsi_session_remove(cls_session
);
992 * Our get_host_param needs to access the session, so remove the
993 * host from sysfs before freeing the session to make sure userspace
994 * is no longer accessing the callout.
996 iscsi_host_remove(shost
, false);
998 iscsi_tcp_r2tpool_free(cls_session
->dd_data
);
1000 iscsi_session_free(cls_session
);
1001 iscsi_host_free(shost
);
1004 static umode_t
iscsi_sw_tcp_attr_is_visible(int param_type
, int param
)
1006 switch (param_type
) {
1007 case ISCSI_HOST_PARAM
:
1009 case ISCSI_HOST_PARAM_NETDEV_NAME
:
1010 case ISCSI_HOST_PARAM_HWADDRESS
:
1011 case ISCSI_HOST_PARAM_IPADDRESS
:
1012 case ISCSI_HOST_PARAM_INITIATOR_NAME
:
1019 case ISCSI_PARAM_MAX_RECV_DLENGTH
:
1020 case ISCSI_PARAM_MAX_XMIT_DLENGTH
:
1021 case ISCSI_PARAM_HDRDGST_EN
:
1022 case ISCSI_PARAM_DATADGST_EN
:
1023 case ISCSI_PARAM_CONN_ADDRESS
:
1024 case ISCSI_PARAM_CONN_PORT
:
1025 case ISCSI_PARAM_LOCAL_PORT
:
1026 case ISCSI_PARAM_EXP_STATSN
:
1027 case ISCSI_PARAM_PERSISTENT_ADDRESS
:
1028 case ISCSI_PARAM_PERSISTENT_PORT
:
1029 case ISCSI_PARAM_PING_TMO
:
1030 case ISCSI_PARAM_RECV_TMO
:
1031 case ISCSI_PARAM_INITIAL_R2T_EN
:
1032 case ISCSI_PARAM_MAX_R2T
:
1033 case ISCSI_PARAM_IMM_DATA_EN
:
1034 case ISCSI_PARAM_FIRST_BURST
:
1035 case ISCSI_PARAM_MAX_BURST
:
1036 case ISCSI_PARAM_PDU_INORDER_EN
:
1037 case ISCSI_PARAM_DATASEQ_INORDER_EN
:
1038 case ISCSI_PARAM_ERL
:
1039 case ISCSI_PARAM_TARGET_NAME
:
1040 case ISCSI_PARAM_TPGT
:
1041 case ISCSI_PARAM_USERNAME
:
1042 case ISCSI_PARAM_PASSWORD
:
1043 case ISCSI_PARAM_USERNAME_IN
:
1044 case ISCSI_PARAM_PASSWORD_IN
:
1045 case ISCSI_PARAM_FAST_ABORT
:
1046 case ISCSI_PARAM_ABORT_TMO
:
1047 case ISCSI_PARAM_LU_RESET_TMO
:
1048 case ISCSI_PARAM_TGT_RESET_TMO
:
1049 case ISCSI_PARAM_IFACE_NAME
:
1050 case ISCSI_PARAM_INITIATOR_NAME
:
1060 static int iscsi_sw_tcp_device_configure(struct scsi_device
*sdev
,
1061 struct queue_limits
*lim
)
1063 struct iscsi_sw_tcp_host
*tcp_sw_host
= iscsi_host_priv(sdev
->host
);
1064 struct iscsi_session
*session
= tcp_sw_host
->session
;
1065 struct iscsi_conn
*conn
= session
->leadconn
;
1067 if (conn
->datadgst_en
)
1068 lim
->features
|= BLK_FEAT_STABLE_WRITES
;
1072 static const struct scsi_host_template iscsi_sw_tcp_sht
= {
1073 .module
= THIS_MODULE
,
1074 .name
= "iSCSI Initiator over TCP/IP",
1075 .queuecommand
= iscsi_queuecommand
,
1076 .change_queue_depth
= scsi_change_queue_depth
,
1077 .can_queue
= ISCSI_TOTAL_CMDS_MAX
,
1078 .sg_tablesize
= 4096,
1079 .max_sectors
= 0xFFFF,
1080 .cmd_per_lun
= ISCSI_DEF_CMD_PER_LUN
,
1081 .eh_timed_out
= iscsi_eh_cmd_timed_out
,
1082 .eh_abort_handler
= iscsi_eh_abort
,
1083 .eh_device_reset_handler
= iscsi_eh_device_reset
,
1084 .eh_target_reset_handler
= iscsi_eh_recover_target
,
1085 .dma_boundary
= PAGE_SIZE
- 1,
1086 .device_configure
= iscsi_sw_tcp_device_configure
,
1087 .proc_name
= "iscsi_tcp",
1089 .track_queue_depth
= 1,
1090 .cmd_size
= sizeof(struct iscsi_cmd
),
1093 static struct iscsi_transport iscsi_sw_tcp_transport
= {
1094 .owner
= THIS_MODULE
,
1096 .caps
= CAP_RECOVERY_L0
| CAP_MULTI_R2T
| CAP_HDRDGST
1098 /* session management */
1099 .create_session
= iscsi_sw_tcp_session_create
,
1100 .destroy_session
= iscsi_sw_tcp_session_destroy
,
1101 /* connection management */
1102 .create_conn
= iscsi_sw_tcp_conn_create
,
1103 .bind_conn
= iscsi_sw_tcp_conn_bind
,
1104 .destroy_conn
= iscsi_sw_tcp_conn_destroy
,
1105 .attr_is_visible
= iscsi_sw_tcp_attr_is_visible
,
1106 .set_param
= iscsi_sw_tcp_conn_set_param
,
1107 .get_conn_param
= iscsi_sw_tcp_conn_get_param
,
1108 .get_session_param
= iscsi_session_get_param
,
1109 .start_conn
= iscsi_conn_start
,
1110 .stop_conn
= iscsi_sw_tcp_conn_stop
,
1111 /* iscsi host params */
1112 .get_host_param
= iscsi_sw_tcp_host_get_param
,
1113 .set_host_param
= iscsi_host_set_param
,
1115 .send_pdu
= iscsi_conn_send_pdu
,
1116 .get_stats
= iscsi_sw_tcp_conn_get_stats
,
1117 /* iscsi task/cmd helpers */
1118 .init_task
= iscsi_tcp_task_init
,
1119 .xmit_task
= iscsi_tcp_task_xmit
,
1120 .cleanup_task
= iscsi_tcp_cleanup_task
,
1121 /* low level pdu helpers */
1122 .xmit_pdu
= iscsi_sw_tcp_pdu_xmit
,
1123 .init_pdu
= iscsi_sw_tcp_pdu_init
,
1124 .alloc_pdu
= iscsi_sw_tcp_pdu_alloc
,
1126 .session_recovery_timedout
= iscsi_session_recovery_timedout
,
1129 static int __init
iscsi_sw_tcp_init(void)
1131 if (iscsi_max_lun
< 1) {
1132 printk(KERN_ERR
"iscsi_tcp: Invalid max_lun value of %u\n",
1137 iscsi_sw_tcp_scsi_transport
= iscsi_register_transport(
1138 &iscsi_sw_tcp_transport
);
1139 if (!iscsi_sw_tcp_scsi_transport
)
1145 static void __exit
iscsi_sw_tcp_exit(void)
1147 iscsi_unregister_transport(&iscsi_sw_tcp_transport
);
1150 module_init(iscsi_sw_tcp_init
);
1151 module_exit(iscsi_sw_tcp_exit
);