brintos

brintos / linux-shallow public Read only

0
0
Text · 30.8 KiB · c708e10 Raw
1152 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3 * iSCSI Initiator over TCP/IP Data-Path4 *5 * Copyright (C) 2004 Dmitry Yusupov6 * Copyright (C) 2004 Alex Aizman7 * Copyright (C) 2005 - 2006 Mike Christie8 * Copyright (C) 2006 Red Hat, Inc.  All rights reserved.9 * maintained by open-iscsi@googlegroups.com10 *11 * See the file COPYING included with this distribution for more details.12 *13 * Credits:14 *	Christoph Hellwig15 *	FUJITA Tomonori16 *	Arne Redlich17 *	Zhenyu Wang18 */19 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>32#include <net/tcp.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>40 41#include "iscsi_tcp.h"42 43MODULE_AUTHOR("Mike Christie <michaelc@cs.wisc.edu>, "44	      "Dmitry Yusupov <dmitry_yus@yahoo.com>, "45	      "Alex Aizman <itn780@yahoo.com>");46MODULE_DESCRIPTION("iSCSI/TCP data-path");47MODULE_LICENSE("GPL");48 49static struct scsi_transport_template *iscsi_sw_tcp_scsi_transport;50static const struct scsi_host_template iscsi_sw_tcp_sht;51static struct iscsi_transport iscsi_sw_tcp_transport;52 53static unsigned int iscsi_max_lun = ~0;54module_param_named(max_lun, iscsi_max_lun, uint, S_IRUGO);55 56static bool iscsi_recv_from_iscsi_q;57module_param_named(recv_from_iscsi_q, iscsi_recv_from_iscsi_q, bool, 0644);58MODULE_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.");59 60static int iscsi_sw_tcp_dbg;61module_param_named(debug_iscsi_tcp, iscsi_sw_tcp_dbg, int,62		   S_IRUGO | S_IWUSR);63MODULE_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.");65 66#define ISCSI_SW_TCP_DBG(_conn, dbg_fmt, arg...)		\67	do {							\68		if (iscsi_sw_tcp_dbg)				\69			iscsi_conn_printk(KERN_INFO, _conn,	\70					     "%s " dbg_fmt,	\71					     __func__, ##arg);	\72		iscsi_dbg_trace(trace_iscsi_dbg_sw_tcp,		\73				&(_conn)->cls_conn->dev,	\74				"%s " dbg_fmt, __func__, ##arg);\75	} while (0);76 77 78/**79 * iscsi_sw_tcp_recv - TCP receive in sendfile fashion80 * @rd_desc: read descriptor81 * @skb: socket buffer82 * @offset: offset in skb83 * @len: skb->len - offset84 */85static int iscsi_sw_tcp_recv(read_descriptor_t *rd_desc, struct sk_buff *skb,86			     unsigned int offset, size_t len)87{88	struct iscsi_conn *conn = rd_desc->arg.data;89	unsigned int consumed, total_consumed = 0;90	int status;91 92	ISCSI_SW_TCP_DBG(conn, "in %d bytes\n", skb->len - offset);93 94	do {95		status = 0;96		consumed = iscsi_tcp_recv_skb(conn, skb, offset, 0, &status);97		offset += consumed;98		total_consumed += consumed;99	} while (consumed != 0 && status != ISCSI_TCP_SKB_DONE);100 101	ISCSI_SW_TCP_DBG(conn, "read %d bytes status %d\n",102			 skb->len - offset, status);103	return total_consumed;104}105 106/**107 * iscsi_sw_sk_state_check - check socket state108 * @sk: socket109 *110 * If the socket is in CLOSE or CLOSE_WAIT we should111 * not close the connection if there is still some112 * data pending.113 *114 * Must be called with sk_callback_lock.115 */116static inline int iscsi_sw_sk_state_check(struct sock *sk)117{118	struct iscsi_conn *conn = sk->sk_user_data;119 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);125		return -ECONNRESET;126	}127	return 0;128}129 130static void iscsi_sw_tcp_recv_data(struct iscsi_conn *conn)131{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;136 137	/*138	 * Use rd_desc to pass 'conn' to iscsi_tcp_recv.139	 * We set count to 1 because we want the network layer to140	 * hand us all the skbs that are available. iscsi_tcp_recv141	 * handled pdus that cross buffers or pdus that still need data.142	 */143	rd_desc.arg.data = conn;144	rd_desc.count = 1;145 146	tcp_read_sock(sk, &rd_desc, iscsi_sw_tcp_recv);147 148	/* If we had to (atomically) map a highmem page,149	 * unmap it now. */150	iscsi_tcp_segment_unmap(&tcp_conn->in.segment);151 152	iscsi_sw_sk_state_check(sk);153}154 155static void iscsi_sw_tcp_recv_data_work(struct work_struct *work)156{157	struct iscsi_conn *conn = container_of(work, struct iscsi_conn,158					       recvwork);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;162 163	lock_sock(sk);164	iscsi_sw_tcp_recv_data(conn);165	release_sock(sk);166}167 168static void iscsi_sw_tcp_data_ready(struct sock *sk)169{170	struct iscsi_sw_tcp_conn *tcp_sw_conn;171	struct iscsi_tcp_conn *tcp_conn;172	struct iscsi_conn *conn;173 174	trace_sk_data_ready(sk);175 176	read_lock_bh(&sk->sk_callback_lock);177	conn = sk->sk_user_data;178	if (!conn) {179		read_unlock_bh(&sk->sk_callback_lock);180		return;181	}182	tcp_conn = conn->dd_data;183	tcp_sw_conn = tcp_conn->dd_data;184 185	if (tcp_sw_conn->queue_recv)186		iscsi_conn_queue_recv(conn);187	else188		iscsi_sw_tcp_recv_data(conn);189	read_unlock_bh(&sk->sk_callback_lock);190}191 192static void iscsi_sw_tcp_state_change(struct sock *sk)193{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 *);198 199	read_lock_bh(&sk->sk_callback_lock);200	conn = sk->sk_user_data;201	if (!conn) {202		read_unlock_bh(&sk->sk_callback_lock);203		return;204	}205 206	iscsi_sw_sk_state_check(sk);207 208	tcp_conn = conn->dd_data;209	tcp_sw_conn = tcp_conn->dd_data;210	old_state_change = tcp_sw_conn->old_state_change;211 212	read_unlock_bh(&sk->sk_callback_lock);213 214	old_state_change(sk);215}216 217/**218 * iscsi_sw_tcp_write_space - Called when more output buffer space is available219 * @sk: socket space is available for220 **/221static void iscsi_sw_tcp_write_space(struct sock *sk)222{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 *);227 228	read_lock_bh(&sk->sk_callback_lock);229	conn = sk->sk_user_data;230	if (!conn) {231		read_unlock_bh(&sk->sk_callback_lock);232		return;233	}234 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);239 240	old_write_space(sk);241 242	ISCSI_SW_TCP_DBG(conn, "iscsi_write_space\n");243	iscsi_conn_queue_xmit(conn);244}245 246static void iscsi_sw_tcp_conn_set_callbacks(struct iscsi_conn *conn)247{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;251 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);262}263 264static void265iscsi_sw_tcp_conn_restore_callbacks(struct iscsi_conn *conn)266{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;270 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);279}280 281/**282 * iscsi_sw_tcp_xmit_segment - transmit segment283 * @tcp_conn: the iSCSI TCP connection284 * @segment: the buffer to transmnit285 *286 * This function transmits as much of the buffer as287 * the network layer will accept, and returns the number of288 * bytes transmitted.289 *290 * If CRC hashing is enabled, the function will compute the291 * hash as it goes. When the entire segment has been transmitted,292 * it will retrieve the hash value and send it as well.293 */294static int iscsi_sw_tcp_xmit_segment(struct iscsi_tcp_conn *tcp_conn,295				     struct iscsi_segment *segment)296{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;300	int r = 0;301 302	while (!iscsi_tcp_segment_done(tcp_conn, segment, 0, r)) {303		struct scatterlist *sg;304		struct msghdr msg = {};305		struct bio_vec bv;306		unsigned int offset, copy;307 308		r = 0;309		offset = segment->copied;310		copy = segment->size - offset;311 312		if (segment->total_copied + segment->size < segment->total_size)313			msg.msg_flags |= MSG_MORE;314 315		if (tcp_sw_conn->queue_recv)316			msg.msg_flags |= MSG_DONTWAIT;317 318		if (!segment->data) {319			if (!tcp_conn->iscsi_conn->datadgst_en)320				msg.msg_flags |= MSG_SPLICE_PAGES;321			sg = segment->sg;322			offset += segment->sg_offset + sg->offset;323			bvec_set_page(&bv, sg_page(sg), copy, offset);324		} else {325			bvec_set_virt(&bv, segment->data + offset, copy);326		}327		iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, &bv, 1, copy);328 329		r = sock_sendmsg(sk, &msg);330		if (r < 0) {331			iscsi_tcp_segment_unmap(segment);332			return r;333		}334		copied += r;335	}336	return copied;337}338 339/**340 * iscsi_sw_tcp_xmit - TCP transmit341 * @conn: iscsi connection342 **/343static int iscsi_sw_tcp_xmit(struct iscsi_conn *conn)344{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;349	int rc = 0;350 351	while (1) {352		rc = iscsi_sw_tcp_xmit_segment(tcp_conn, segment);353		/*354		 * We may not have been able to send data because the conn355		 * is getting stopped. libiscsi will know so propagate err356		 * for it to do the right thing.357		 */358		if (rc == -EAGAIN)359			return rc;360		else if (rc < 0) {361			rc = ISCSI_ERR_XMIT_FAILED;362			goto error;363		} else if (rc == 0)364			break;365 366		consumed += rc;367 368		if (segment->total_copied >= segment->total_size) {369			if (segment->done != NULL) {370				rc = segment->done(tcp_conn, segment);371				if (rc != 0)372					goto error;373			}374		}375	}376 377	ISCSI_SW_TCP_DBG(conn, "xmit %d bytes\n", consumed);378 379	conn->txdata_octets += consumed;380	return consumed;381 382error:383	/* Transmit error. We could initiate error recovery384	 * here. */385	ISCSI_SW_TCP_DBG(conn, "Error sending PDU, errno=%d\n", rc);386	iscsi_conn_failure(conn, rc);387	return -EIO;388}389 390/**391 * iscsi_sw_tcp_xmit_qlen - return the number of bytes queued for xmit392 * @conn: iscsi connection393 */394static inline int iscsi_sw_tcp_xmit_qlen(struct iscsi_conn *conn)395{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;399 400	return segment->total_copied - segment->total_size;401}402 403static int iscsi_sw_tcp_pdu_xmit(struct iscsi_task *task)404{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;409	int rc = 0;410 411	if (!tcp_sw_conn->sock) {412		iscsi_conn_printk(KERN_ERR, conn,413				  "Transport not bound to socket!\n");414		return -EINVAL;415	}416 417	noreclaim_flag = memalloc_noreclaim_save();418 419	while (iscsi_sw_tcp_xmit_qlen(conn)) {420		rc = iscsi_sw_tcp_xmit(conn);421		if (rc == 0) {422			rc = -EAGAIN;423			break;424		}425		if (rc < 0)426			break;427		rc = 0;428	}429 430	memalloc_noreclaim_restore(noreclaim_flag);431	return rc;432}433 434/*435 * This is called when we're done sending the header.436 * Simply copy the data_segment to the send segment, and return.437 */438static int iscsi_sw_tcp_send_hdr_done(struct iscsi_tcp_conn *tcp_conn,439				      struct iscsi_segment *segment)440{441	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;442 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);448	return 0;449}450 451static void iscsi_sw_tcp_send_hdr_prep(struct iscsi_conn *conn, void *hdr,452				       size_t hdrlen)453{454	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;455	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;456 457	ISCSI_SW_TCP_DBG(conn, "%s\n", conn->hdrdgst_en ?458			 "digest enabled" : "digest disabled");459 460	/* Clear the data segment - needs to be filled in by the461	 * caller using iscsi_tcp_send_data_prep() */462	memset(&tcp_sw_conn->out.data_segment, 0,463	       sizeof(struct iscsi_segment));464 465	/* If header digest is enabled, compute the CRC and466	 * place the digest into the same buffer. We make467	 * sure that both iscsi_tcp_task and mtask have468	 * sufficient room.469	 */470	if (conn->hdrdgst_en) {471		iscsi_tcp_dgst_header(tcp_sw_conn->tx_hash, hdr, hdrlen,472				      hdr + hdrlen);473		hdrlen += ISCSI_DIGEST_SIZE;474	}475 476	/* Remember header pointer for later, when we need477	 * to decide whether there's a payload to go along478	 * with the header. */479	tcp_sw_conn->out.hdr = hdr;480 481	iscsi_segment_init_linear(&tcp_sw_conn->out.segment, hdr, hdrlen,482				  iscsi_sw_tcp_send_hdr_done, NULL);483}484 485/*486 * Prepare the send buffer for the payload data.487 * Padding and checksumming will all be taken care488 * of by the iscsi_segment routines.489 */490static int491iscsi_sw_tcp_send_data_prep(struct iscsi_conn *conn, struct scatterlist *sg,492			    unsigned int count, unsigned int offset,493			    unsigned int len)494{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;499 500	ISCSI_SW_TCP_DBG(conn, "offset=%d, datalen=%d %s\n", offset, len,501			 conn->datadgst_en ?502			 "digest enabled" : "digest disabled");503 504	/* Make sure the datalen matches what the caller505	   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));508 509	if (conn->datadgst_en)510		tx_hash = tcp_sw_conn->tx_hash;511 512	return iscsi_segment_seek_sg(&tcp_sw_conn->out.data_segment,513				     sg, count, offset, len,514				     NULL, tx_hash);515}516 517static void518iscsi_sw_tcp_send_linear_data_prep(struct iscsi_conn *conn, void *data,519				   size_t len)520{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;525 526	ISCSI_SW_TCP_DBG(conn, "datalen=%zd %s\n", len, conn->datadgst_en ?527			 "digest enabled" : "digest disabled");528 529	/* Make sure the datalen matches what the caller530	   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));533 534	if (conn->datadgst_en)535		tx_hash = tcp_sw_conn->tx_hash;536 537	iscsi_segment_init_linear(&tcp_sw_conn->out.data_segment,538				data, len, NULL, tx_hash);539}540 541static int iscsi_sw_tcp_pdu_init(struct iscsi_task *task,542				 unsigned int offset, unsigned int count)543{544	struct iscsi_conn *conn = task->conn;545	int err = 0;546 547	iscsi_sw_tcp_send_hdr_prep(conn, task->hdr, task->hdr_len);548 549	if (!count)550		return 0;551 552	if (!task->sc)553		iscsi_sw_tcp_send_linear_data_prep(conn, task->data, count);554	else {555		struct scsi_data_buffer *sdb = &task->sc->sdb;556 557		err = iscsi_sw_tcp_send_data_prep(conn, sdb->table.sgl,558						  sdb->table.nents, offset,559						  count);560	}561 562	if (err) {563		/* got invalid offset/len */564		return -EIO;565	}566	return 0;567}568 569static int iscsi_sw_tcp_pdu_alloc(struct iscsi_task *task, uint8_t opcode)570{571	struct iscsi_tcp_task *tcp_task = task->dd_data;572 573	task->hdr = task->dd_data + sizeof(*tcp_task);574	task->hdr_max = sizeof(struct iscsi_sw_tcp_hdrbuf) - ISCSI_DIGEST_SIZE;575	return 0;576}577 578static struct iscsi_cls_conn *579iscsi_sw_tcp_conn_create(struct iscsi_cls_session *cls_session,580			 uint32_t conn_idx)581{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;587 588	cls_conn = iscsi_tcp_conn_setup(cls_session, sizeof(*tcp_sw_conn),589					conn_idx);590	if (!cls_conn)591		return NULL;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;597 598	mutex_init(&tcp_sw_conn->sock_lock);599 600	tfm = crypto_alloc_ahash("crc32c", 0, CRYPTO_ALG_ASYNC);601	if (IS_ERR(tfm))602		goto free_conn;603 604	tcp_sw_conn->tx_hash = ahash_request_alloc(tfm, GFP_KERNEL);605	if (!tcp_sw_conn->tx_hash)606		goto free_tfm;607	ahash_request_set_callback(tcp_sw_conn->tx_hash, 0, NULL, NULL);608 609	tcp_sw_conn->rx_hash = ahash_request_alloc(tfm, GFP_KERNEL);610	if (!tcp_sw_conn->rx_hash)611		goto free_tx_hash;612	ahash_request_set_callback(tcp_sw_conn->rx_hash, 0, NULL, NULL);613 614	tcp_conn->rx_hash = tcp_sw_conn->rx_hash;615 616	return cls_conn;617 618free_tx_hash:619	ahash_request_free(tcp_sw_conn->tx_hash);620free_tfm:621	crypto_free_ahash(tfm);622free_conn: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 "627			  "kernel\n");628	iscsi_tcp_conn_teardown(cls_conn);629	return NULL;630}631 632static void iscsi_sw_tcp_release_conn(struct iscsi_conn *conn)633{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;637 638	/*639	 * The iscsi transport class will make sure we are not called in640	 * parallel with start, stop, bind and destroys. However, this can be641	 * called twice if userspace does a stop then a destroy.642	 */643	if (!sock)644		return;645 646	/*647	 * Make sure we start socket shutdown now in case userspace is up648	 * but delayed in releasing the socket.649	 */650	kernel_sock_shutdown(sock, SHUT_RDWR);651 652	sock_hold(sock->sk);653	iscsi_sw_tcp_conn_restore_callbacks(conn);654	sock_put(sock->sk);655 656	iscsi_suspend_rx(conn);657 658	mutex_lock(&tcp_sw_conn->sock_lock);659	tcp_sw_conn->sock = NULL;660	mutex_unlock(&tcp_sw_conn->sock_lock);661	sockfd_put(sock);662}663 664static void iscsi_sw_tcp_conn_destroy(struct iscsi_cls_conn *cls_conn)665{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;669 670	iscsi_sw_tcp_release_conn(conn);671 672	ahash_request_free(tcp_sw_conn->rx_hash);673	if (tcp_sw_conn->tx_hash) {674		struct crypto_ahash *tfm;675 676		tfm = crypto_ahash_reqtfm(tcp_sw_conn->tx_hash);677		ahash_request_free(tcp_sw_conn->tx_hash);678		crypto_free_ahash(tfm);679	}680 681	iscsi_tcp_conn_teardown(cls_conn);682}683 684static void iscsi_sw_tcp_conn_stop(struct iscsi_cls_conn *cls_conn, int flag)685{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;690 691	/* userspace may have goofed up and not bound us */692	if (!sock)693		return;694 695	sock->sk->sk_err = EIO;696	wake_up_interruptible(sk_sleep(sock->sk));697 698	/* stop xmit side */699	iscsi_suspend_tx(conn);700 701	/* stop recv side and release socket */702	iscsi_sw_tcp_release_conn(conn);703 704	iscsi_conn_stop(cls_conn, flag);705}706 707static int708iscsi_sw_tcp_conn_bind(struct iscsi_cls_session *cls_session,709		       struct iscsi_cls_conn *cls_conn, uint64_t transport_eph,710		       int is_leading)711{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;715	struct sock *sk;716	struct socket *sock;717	int err;718 719	/* lookup for existing socket */720	sock = sockfd_lookup((int)transport_eph, &err);721	if (!sock) {722		iscsi_conn_printk(KERN_ERR, conn,723				  "sockfd_lookup failed %d\n", err);724		return -EEXIST;725	}726 727	err = -EINVAL;728	if (!sk_is_tcp(sock->sk))729		goto free_socket;730 731	err = iscsi_conn_bind(cls_session, cls_conn, is_leading);732	if (err)733		goto free_socket;734 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);739 740	/* setup Socket parameters */741	sk = sock->sk;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;746	sk_set_memalloc(sk);747	sock_no_linger(sk);748 749	iscsi_sw_tcp_conn_set_callbacks(conn);750	/*751	 * set receive state machine into initial state752	 */753	iscsi_tcp_hdr_recv_prep(tcp_conn);754	return 0;755 756free_socket:757	sockfd_put(sock);758	return err;759}760 761static int iscsi_sw_tcp_conn_set_param(struct iscsi_cls_conn *cls_conn,762				       enum iscsi_param param, char *buf,763				       int buflen)764{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;768 769	switch(param) {770	case ISCSI_PARAM_HDRDGST_EN:771		iscsi_set_param(cls_conn, param, buf, buflen);772		break;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);777			return -ENOTCONN;778		}779		iscsi_set_param(cls_conn, param, buf, buflen);780		mutex_unlock(&tcp_sw_conn->sock_lock);781		break;782	case ISCSI_PARAM_MAX_R2T:783		return iscsi_tcp_set_max_r2t(conn, buf);784	default:785		return iscsi_set_param(cls_conn, param, buf, buflen);786	}787 788	return 0;789}790 791static int iscsi_sw_tcp_conn_get_param(struct iscsi_cls_conn *cls_conn,792				       enum iscsi_param param, char *buf)793{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;798	struct socket *sock;799	int rc;800 801	switch(param) {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);808			return -ENOTCONN;809		}810		/*811		 * The conn has been setup and bound, so just grab a ref812		 * incase a destroy runs while we are in the net layer.813		 */814		iscsi_get_conn(conn->cls_conn);815		spin_unlock_bh(&conn->session->frwd_lock);816 817		tcp_conn = conn->dd_data;818		tcp_sw_conn = tcp_conn->dd_data;819 820		mutex_lock(&tcp_sw_conn->sock_lock);821		sock = tcp_sw_conn->sock;822		if (!sock) {823			rc = -ENOTCONN;824			goto sock_unlock;825		}826 827		if (param == ISCSI_PARAM_LOCAL_PORT)828			rc = kernel_getsockname(sock,829						(struct sockaddr *)&addr);830		else831			rc = kernel_getpeername(sock,832						(struct sockaddr *)&addr);833sock_unlock:834		mutex_unlock(&tcp_sw_conn->sock_lock);835		iscsi_put_conn(conn->cls_conn);836		if (rc < 0)837			return rc;838 839		return iscsi_conn_get_addr_param((struct sockaddr_storage *)840						 &addr, param, buf);841	default:842		return iscsi_conn_get_param(cls_conn, param, buf);843	}844 845	return 0;846}847 848static int iscsi_sw_tcp_host_get_param(struct Scsi_Host *shost,849				       enum iscsi_host_param param, char *buf)850{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;857	struct socket *sock;858	int rc;859 860	switch (param) {861	case ISCSI_HOST_PARAM_IPADDRESS:862		session = tcp_sw_host->session;863		if (!session)864			return -ENOTCONN;865 866		spin_lock_bh(&session->frwd_lock);867		conn = session->leadconn;868		if (!conn) {869			spin_unlock_bh(&session->frwd_lock);870			return -ENOTCONN;871		}872		tcp_conn = conn->dd_data;873		tcp_sw_conn = tcp_conn->dd_data;874		/*875		 * The conn has been setup and bound, so just grab a ref876		 * incase a destroy runs while we are in the net layer.877		 */878		iscsi_get_conn(conn->cls_conn);879		spin_unlock_bh(&session->frwd_lock);880 881		mutex_lock(&tcp_sw_conn->sock_lock);882		sock = tcp_sw_conn->sock;883		if (!sock)884			rc = -ENOTCONN;885		else886			rc = kernel_getsockname(sock, (struct sockaddr *)&addr);887		mutex_unlock(&tcp_sw_conn->sock_lock);888		iscsi_put_conn(conn->cls_conn);889		if (rc < 0)890			return rc;891 892		return iscsi_conn_get_addr_param((struct sockaddr_storage *)893						 &addr,894						 (enum iscsi_param)param, buf);895	default:896		return iscsi_host_get_param(shost, param, buf);897	}898 899	return 0;900}901 902static void903iscsi_sw_tcp_conn_get_stats(struct iscsi_cls_conn *cls_conn,904			    struct iscsi_stats *stats)905{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;909 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;917 918	iscsi_tcp_conn_get_stats(cls_conn, stats);919}920 921static struct iscsi_cls_session *922iscsi_sw_tcp_session_create(struct iscsi_endpoint *ep, uint16_t cmds_max,923			    uint16_t qdepth, uint32_t initial_cmdsn)924{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;929	int rc;930 931	if (ep) {932		printk(KERN_ERR "iscsi_tcp: invalid ep %p.\n", ep);933		return NULL;934	}935 936	shost = iscsi_host_alloc(&iscsi_sw_tcp_sht,937				 sizeof(struct iscsi_sw_tcp_host), 1);938	if (!shost)939		return NULL;940	shost->transportt = iscsi_sw_tcp_scsi_transport;941	shost->cmd_per_lun = qdepth;942	shost->max_lun = iscsi_max_lun;943	shost->max_id = 0;944	shost->max_channel = 0;945	shost->max_cmd_len = SCSI_MAX_VARLEN_CDB_SIZE;946	shost->dma_alignment = 0;947 948	rc = iscsi_host_get_max_scsi_cmds(shost, cmds_max);949	if (rc < 0)950		goto free_host;951	shost->can_queue = rc;952 953	if (iscsi_host_add(shost, NULL))954		goto free_host;955 956	cls_session = iscsi_session_setup(&iscsi_sw_tcp_transport, shost,957					  cmds_max, 0,958					  sizeof(struct iscsi_tcp_task) +959					  sizeof(struct iscsi_sw_tcp_hdrbuf),960					  initial_cmdsn, 0);961	if (!cls_session)962		goto remove_host;963	session = cls_session->dd_data;964 965	if (iscsi_tcp_r2tpool_alloc(session))966		goto remove_session;967 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;971	return cls_session;972 973remove_session:974	iscsi_session_teardown(cls_session);975remove_host:976	iscsi_host_remove(shost, false);977free_host:978	iscsi_host_free(shost);979	return NULL;980}981 982static void iscsi_sw_tcp_session_destroy(struct iscsi_cls_session *cls_session)983{984	struct Scsi_Host *shost = iscsi_session_to_shost(cls_session);985	struct iscsi_session *session = cls_session->dd_data;986 987	if (WARN_ON_ONCE(session->leadconn))988		return;989 990	iscsi_session_remove(cls_session);991	/*992	 * Our get_host_param needs to access the session, so remove the993	 * host from sysfs before freeing the session to make sure userspace994	 * is no longer accessing the callout.995	 */996	iscsi_host_remove(shost, false);997 998	iscsi_tcp_r2tpool_free(cls_session->dd_data);999 1000	iscsi_session_free(cls_session);1001	iscsi_host_free(shost);1002}1003 1004static umode_t iscsi_sw_tcp_attr_is_visible(int param_type, int param)1005{1006	switch (param_type) {1007	case ISCSI_HOST_PARAM:1008		switch (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:1013			return S_IRUGO;1014		default:1015			return 0;1016		}1017	case ISCSI_PARAM:1018		switch (param) {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:1051			return S_IRUGO;1052		default:1053			return 0;1054		}1055	}1056 1057	return 0;1058}1059 1060static int iscsi_sw_tcp_device_configure(struct scsi_device *sdev,1061		struct queue_limits *lim)1062{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;1066 1067	if (conn->datadgst_en)1068		lim->features |= BLK_FEAT_STABLE_WRITES;1069	return 0;1070}1071 1072static 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",1088	.this_id		= -1,1089	.track_queue_depth	= 1,1090	.cmd_size		= sizeof(struct iscsi_cmd),1091};1092 1093static struct iscsi_transport iscsi_sw_tcp_transport = {1094	.owner			= THIS_MODULE,1095	.name			= "tcp",1096	.caps			= CAP_RECOVERY_L0 | CAP_MULTI_R2T | CAP_HDRDGST1097				  | CAP_DATADGST,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,1114	/* IO */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,1125	/* recovery */1126	.session_recovery_timedout = iscsi_session_recovery_timedout,1127};1128 1129static int __init iscsi_sw_tcp_init(void)1130{1131	if (iscsi_max_lun < 1) {1132		printk(KERN_ERR "iscsi_tcp: Invalid max_lun value of %u\n",1133		       iscsi_max_lun);1134		return -EINVAL;1135	}1136 1137	iscsi_sw_tcp_scsi_transport = iscsi_register_transport(1138						&iscsi_sw_tcp_transport);1139	if (!iscsi_sw_tcp_scsi_transport)1140		return -ENODEV;1141 1142	return 0;1143}1144 1145static void __exit iscsi_sw_tcp_exit(void)1146{1147	iscsi_unregister_transport(&iscsi_sw_tcp_transport);1148}1149 1150module_init(iscsi_sw_tcp_init);1151module_exit(iscsi_sw_tcp_exit);1152