iscsi_tcp.c 26.8 KB
Newer Older
1 2 3 4 5
/*
 * iSCSI Initiator over TCP/IP Data-Path
 *
 * Copyright (C) 2004 Dmitry Yusupov
 * Copyright (C) 2004 Alex Aizman
6 7
 * Copyright (C) 2005 - 2006 Mike Christie
 * Copyright (C) 2006 Red Hat, Inc.  All rights reserved.
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 * maintained by open-iscsi@googlegroups.com
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published
 * by the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 *
 * See the file COPYING included with this distribution for more details.
 *
 * Credits:
 *	Christoph Hellwig
 *	FUJITA Tomonori
 *	Arne Redlich
 *	Zhenyu Wang
 */

#include <linux/types.h>
#include <linux/inet.h>
31
#include <linux/slab.h>
M
Mike Christie 已提交
32
#include <linux/file.h>
33 34 35 36 37 38 39
#include <linux/blkdev.h>
#include <linux/crypto.h>
#include <linux/delay.h>
#include <linux/kfifo.h>
#include <linux/scatterlist.h>
#include <net/tcp.h>
#include <scsi/scsi_cmnd.h>
40
#include <scsi/scsi_device.h>
41 42 43 44 45 46
#include <scsi/scsi_host.h>
#include <scsi/scsi.h>
#include <scsi/scsi_transport_iscsi.h>

#include "iscsi_tcp.h"

47 48
MODULE_AUTHOR("Mike Christie <michaelc@cs.wisc.edu>, "
	      "Dmitry Yusupov <dmitry_yus@yahoo.com>, "
49 50 51 52
	      "Alex Aizman <itn780@yahoo.com>");
MODULE_DESCRIPTION("iSCSI/TCP data-path");
MODULE_LICENSE("GPL");

53 54 55
static struct scsi_transport_template *iscsi_sw_tcp_scsi_transport;
static struct scsi_host_template iscsi_sw_tcp_sht;
static struct iscsi_transport iscsi_sw_tcp_transport;
56

57 58 59
static unsigned int iscsi_max_lun = 512;
module_param_named(max_lun, iscsi_max_lun, uint, S_IRUGO);

60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
static int iscsi_sw_tcp_dbg;
module_param_named(debug_iscsi_tcp, iscsi_sw_tcp_dbg, int,
		   S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(debug_iscsi_tcp, "Turn on debugging for iscsi_tcp module "
		 "Set to 1 to turn on, and zero to turn off. Default is off.");

#define ISCSI_SW_TCP_DBG(_conn, dbg_fmt, arg...)		\
	do {							\
		if (iscsi_sw_tcp_dbg)				\
			iscsi_conn_printk(KERN_INFO, _conn,	\
					     "%s " dbg_fmt,	\
					     __func__, ##arg);	\
	} while (0);


O
Olaf Kirch 已提交
75
/**
76
 * iscsi_sw_tcp_recv - TCP receive in sendfile fashion
77 78 79 80
 * @rd_desc: read descriptor
 * @skb: socket buffer
 * @offset: offset in skb
 * @len: skb->len - offset
81 82 83
 */
static int iscsi_sw_tcp_recv(read_descriptor_t *rd_desc, struct sk_buff *skb,
			     unsigned int offset, size_t len)
84 85 86 87 88
{
	struct iscsi_conn *conn = rd_desc->arg.data;
	unsigned int consumed, total_consumed = 0;
	int status;

89
	ISCSI_SW_TCP_DBG(conn, "in %d bytes\n", skb->len - offset);
90 91 92 93 94 95 96 97

	do {
		status = 0;
		consumed = iscsi_tcp_recv_skb(conn, skb, offset, 0, &status);
		offset += consumed;
		total_consumed += consumed;
	} while (consumed != 0 && status != ISCSI_TCP_SKB_DONE);

98 99
	ISCSI_SW_TCP_DBG(conn, "read %d bytes status %d\n",
			 skb->len - offset, status);
100
	return total_consumed;
101 102
}

103 104 105 106 107 108 109 110 111 112
/**
 * iscsi_sw_sk_state_check - check socket state
 * @sk: socket
 *
 * If the socket is in CLOSE or CLOSE_WAIT we should
 * not close the connection if there is still some
 * data pending.
 */
static inline int iscsi_sw_sk_state_check(struct sock *sk)
{
113
	struct iscsi_conn *conn = (struct iscsi_conn*)sk->sk_user_data;
114

115 116 117 118 119 120
	if ((sk->sk_state == TCP_CLOSE_WAIT || sk->sk_state == TCP_CLOSE) &&
	    !atomic_read(&sk->sk_rmem_alloc)) {
		ISCSI_SW_TCP_DBG(conn, "TCP_CLOSE|TCP_CLOSE_WAIT\n");
		iscsi_conn_failure(conn, ISCSI_ERR_TCP_CONN_CLOSE);
		return -ECONNRESET;
	}
121 122 123
	return 0;
}

124
static void iscsi_sw_tcp_data_ready(struct sock *sk, int flag)
125 126
{
	struct iscsi_conn *conn = sk->sk_user_data;
O
Olaf Kirch 已提交
127
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
128 129 130 131
	read_descriptor_t rd_desc;

	read_lock(&sk->sk_callback_lock);

132
	/*
O
Olaf Kirch 已提交
133
	 * Use rd_desc to pass 'conn' to iscsi_tcp_recv.
134
	 * We set count to 1 because we want the network layer to
O
Olaf Kirch 已提交
135
	 * hand us all the skbs that are available. iscsi_tcp_recv
136 137
	 * handled pdus that cross buffers or pdus that still need data.
	 */
138
	rd_desc.arg.data = conn;
139
	rd_desc.count = 1;
140
	tcp_read_sock(sk, &rd_desc, iscsi_sw_tcp_recv);
141

142
	iscsi_sw_sk_state_check(sk);
143

144
	read_unlock(&sk->sk_callback_lock);
O
Olaf Kirch 已提交
145 146 147

	/* If we had to (atomically) map a highmem page,
	 * unmap it now. */
148
	iscsi_tcp_segment_unmap(&tcp_conn->in.segment);
149 150
}

151
static void iscsi_sw_tcp_state_change(struct sock *sk)
152
{
153
	struct iscsi_tcp_conn *tcp_conn;
154
	struct iscsi_sw_tcp_conn *tcp_sw_conn;
155 156 157 158 159 160 161 162 163
	struct iscsi_conn *conn;
	struct iscsi_session *session;
	void (*old_state_change)(struct sock *);

	read_lock(&sk->sk_callback_lock);

	conn = (struct iscsi_conn*)sk->sk_user_data;
	session = conn->session;

164
	iscsi_sw_sk_state_check(sk);
165

166
	tcp_conn = conn->dd_data;
167 168
	tcp_sw_conn = tcp_conn->dd_data;
	old_state_change = tcp_sw_conn->old_state_change;
169 170 171 172 173 174 175 176 177 178

	read_unlock(&sk->sk_callback_lock);

	old_state_change(sk);
}

/**
 * iscsi_write_space - Called when more output buffer space is available
 * @sk: socket space is available for
 **/
179
static void iscsi_sw_tcp_write_space(struct sock *sk)
180 181
{
	struct iscsi_conn *conn = (struct iscsi_conn*)sk->sk_user_data;
182
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
183
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
184

185
	tcp_sw_conn->old_write_space(sk);
186
	ISCSI_SW_TCP_DBG(conn, "iscsi_write_space\n");
187
	iscsi_conn_queue_work(conn);
188 189
}

190
static void iscsi_sw_tcp_conn_set_callbacks(struct iscsi_conn *conn)
191
{
192
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
193 194
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
	struct sock *sk = tcp_sw_conn->sock->sk;
195 196 197 198

	/* assign new callbacks */
	write_lock_bh(&sk->sk_callback_lock);
	sk->sk_user_data = conn;
199 200 201 202 203 204
	tcp_sw_conn->old_data_ready = sk->sk_data_ready;
	tcp_sw_conn->old_state_change = sk->sk_state_change;
	tcp_sw_conn->old_write_space = sk->sk_write_space;
	sk->sk_data_ready = iscsi_sw_tcp_data_ready;
	sk->sk_state_change = iscsi_sw_tcp_state_change;
	sk->sk_write_space = iscsi_sw_tcp_write_space;
205 206 207
	write_unlock_bh(&sk->sk_callback_lock);
}

208
static void
209
iscsi_sw_tcp_conn_restore_callbacks(struct iscsi_conn *conn)
210
{
211 212
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
213
	struct sock *sk = tcp_sw_conn->sock->sk;
214 215 216 217

	/* restore socket callbacks, see also: iscsi_conn_set_callbacks() */
	write_lock_bh(&sk->sk_callback_lock);
	sk->sk_user_data    = NULL;
218 219 220
	sk->sk_data_ready   = tcp_sw_conn->old_data_ready;
	sk->sk_state_change = tcp_sw_conn->old_state_change;
	sk->sk_write_space  = tcp_sw_conn->old_write_space;
221 222 223 224 225
	sk->sk_no_check	 = 0;
	write_unlock_bh(&sk->sk_callback_lock);
}

/**
226
 * iscsi_sw_tcp_xmit_segment - transmit segment
227
 * @tcp_conn: the iSCSI TCP connection
228 229 230 231 232 233 234 235 236 237
 * @segment: the buffer to transmnit
 *
 * This function transmits as much of the buffer as
 * the network layer will accept, and returns the number of
 * bytes transmitted.
 *
 * If CRC hashing is enabled, the function will compute the
 * hash as it goes. When the entire segment has been transmitted,
 * it will retrieve the hash value and send it as well.
 */
238
static int iscsi_sw_tcp_xmit_segment(struct iscsi_tcp_conn *tcp_conn,
239 240
				     struct iscsi_segment *segment)
{
241
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
242 243 244 245
	struct socket *sk = tcp_sw_conn->sock;
	unsigned int copied = 0;
	int r = 0;

246
	while (!iscsi_tcp_segment_done(tcp_conn, segment, 0, r)) {
247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284
		struct scatterlist *sg;
		unsigned int offset, copy;
		int flags = 0;

		r = 0;
		offset = segment->copied;
		copy = segment->size - offset;

		if (segment->total_copied + segment->size < segment->total_size)
			flags |= MSG_MORE;

		/* Use sendpage if we can; else fall back to sendmsg */
		if (!segment->data) {
			sg = segment->sg;
			offset += segment->sg_offset + sg->offset;
			r = tcp_sw_conn->sendpage(sk, sg_page(sg), offset,
						  copy, flags);
		} else {
			struct msghdr msg = { .msg_flags = flags };
			struct kvec iov = {
				.iov_base = segment->data + offset,
				.iov_len = copy
			};

			r = kernel_sendmsg(sk, &msg, &iov, 1, copy);
		}

		if (r < 0) {
			iscsi_tcp_segment_unmap(segment);
			return r;
		}
		copied += r;
	}
	return copied;
}

/**
 * iscsi_sw_tcp_xmit - TCP transmit
285
 **/
286
static int iscsi_sw_tcp_xmit(struct iscsi_conn *conn)
287
{
288
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
289 290
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
	struct iscsi_segment *segment = &tcp_sw_conn->out.segment;
291 292
	unsigned int consumed = 0;
	int rc = 0;
293

294
	while (1) {
295
		rc = iscsi_sw_tcp_xmit_segment(tcp_conn, segment);
296 297 298 299 300 301 302 303
		/*
		 * We may not have been able to send data because the conn
		 * is getting stopped. libiscsi will know so propogate err
		 * for it to do the right thing.
		 */
		if (rc == -EAGAIN)
			return rc;
		else if (rc < 0) {
304
			rc = ISCSI_ERR_XMIT_FAILED;
305
			goto error;
306
		} else if (rc == 0)
307 308 309 310 311 312 313
			break;

		consumed += rc;

		if (segment->total_copied >= segment->total_size) {
			if (segment->done != NULL) {
				rc = segment->done(tcp_conn, segment);
314
				if (rc != 0)
315 316 317
					goto error;
			}
		}
318 319
	}

320
	ISCSI_SW_TCP_DBG(conn, "xmit %d bytes\n", consumed);
321 322 323 324 325 326 327

	conn->txdata_octets += consumed;
	return consumed;

error:
	/* Transmit error. We could initiate error recovery
	 * here. */
328
	ISCSI_SW_TCP_DBG(conn, "Error sending PDU, errno=%d\n", rc);
329 330
	iscsi_conn_failure(conn, rc);
	return -EIO;
331 332 333
}

/**
334 335
 * iscsi_tcp_xmit_qlen - return the number of bytes queued for xmit
 */
336
static inline int iscsi_sw_tcp_xmit_qlen(struct iscsi_conn *conn)
337
{
338
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
339 340
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
	struct iscsi_segment *segment = &tcp_sw_conn->out.segment;
341

342
	return segment->total_copied - segment->total_size;
343 344
}

345
static int iscsi_sw_tcp_pdu_xmit(struct iscsi_task *task)
346
{
347
	struct iscsi_conn *conn = task->conn;
348 349
	int rc;

350 351
	while (iscsi_sw_tcp_xmit_qlen(conn)) {
		rc = iscsi_sw_tcp_xmit(conn);
352
		if (rc == 0)
353
			return -EAGAIN;
354 355
		if (rc < 0)
			return rc;
356
	}
357

358
	return 0;
359 360
}

361 362 363 364
/*
 * This is called when we're done sending the header.
 * Simply copy the data_segment to the send segment, and return.
 */
365 366
static int iscsi_sw_tcp_send_hdr_done(struct iscsi_tcp_conn *tcp_conn,
				      struct iscsi_segment *segment)
367
{
368 369 370
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;

	tcp_sw_conn->out.segment = tcp_sw_conn->out.data_segment;
371 372 373 374
	ISCSI_SW_TCP_DBG(tcp_conn->iscsi_conn,
			 "Header done. Next segment size %u total_size %u\n",
			 tcp_sw_conn->out.segment.size,
			 tcp_sw_conn->out.segment.total_size);
375 376 377
	return 0;
}

378 379
static void iscsi_sw_tcp_send_hdr_prep(struct iscsi_conn *conn, void *hdr,
				       size_t hdrlen)
380 381
{
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
382
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
383

384 385
	ISCSI_SW_TCP_DBG(conn, "%s\n", conn->hdrdgst_en ?
			 "digest enabled" : "digest disabled");
386 387 388

	/* Clear the data segment - needs to be filled in by the
	 * caller using iscsi_tcp_send_data_prep() */
389 390
	memset(&tcp_sw_conn->out.data_segment, 0,
	       sizeof(struct iscsi_segment));
391 392 393

	/* If header digest is enabled, compute the CRC and
	 * place the digest into the same buffer. We make
394
	 * sure that both iscsi_tcp_task and mtask have
395 396 397
	 * sufficient room.
	 */
	if (conn->hdrdgst_en) {
398
		iscsi_tcp_dgst_header(&tcp_sw_conn->tx_hash, hdr, hdrlen,
399 400 401 402 403 404 405
				      hdr + hdrlen);
		hdrlen += ISCSI_DIGEST_SIZE;
	}

	/* Remember header pointer for later, when we need
	 * to decide whether there's a payload to go along
	 * with the header. */
406
	tcp_sw_conn->out.hdr = hdr;
407

408 409
	iscsi_segment_init_linear(&tcp_sw_conn->out.segment, hdr, hdrlen,
				  iscsi_sw_tcp_send_hdr_done, NULL);
410 411 412 413 414 415 416 417
}

/*
 * Prepare the send buffer for the payload data.
 * Padding and checksumming will all be taken care
 * of by the iscsi_segment routines.
 */
static int
418 419 420
iscsi_sw_tcp_send_data_prep(struct iscsi_conn *conn, struct scatterlist *sg,
			    unsigned int count, unsigned int offset,
			    unsigned int len)
421 422
{
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
423
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
424 425 426
	struct hash_desc *tx_hash = NULL;
	unsigned int hdr_spec_len;

427 428 429
	ISCSI_SW_TCP_DBG(conn, "offset=%d, datalen=%d %s\n", offset, len,
			 conn->datadgst_en ?
			 "digest enabled" : "digest disabled");
430 431 432

	/* Make sure the datalen matches what the caller
	   said he would send. */
433
	hdr_spec_len = ntoh24(tcp_sw_conn->out.hdr->dlength);
434 435 436
	WARN_ON(iscsi_padded(len) != iscsi_padded(hdr_spec_len));

	if (conn->datadgst_en)
437
		tx_hash = &tcp_sw_conn->tx_hash;
438

439 440 441
	return iscsi_segment_seek_sg(&tcp_sw_conn->out.data_segment,
				     sg, count, offset, len,
				     NULL, tx_hash);
442 443 444
}

static void
445
iscsi_sw_tcp_send_linear_data_prep(struct iscsi_conn *conn, void *data,
446 447 448
				   size_t len)
{
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
449
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
450 451 452
	struct hash_desc *tx_hash = NULL;
	unsigned int hdr_spec_len;

453 454
	ISCSI_SW_TCP_DBG(conn, "datalen=%zd %s\n", len, conn->datadgst_en ?
			 "digest enabled" : "digest disabled");
455 456 457

	/* Make sure the datalen matches what the caller
	   said he would send. */
458
	hdr_spec_len = ntoh24(tcp_sw_conn->out.hdr->dlength);
459 460 461
	WARN_ON(iscsi_padded(len) != iscsi_padded(hdr_spec_len));

	if (conn->datadgst_en)
462
		tx_hash = &tcp_sw_conn->tx_hash;
463

464
	iscsi_segment_init_linear(&tcp_sw_conn->out.data_segment,
465
				data, len, NULL, tx_hash);
466 467
}

468 469
static int iscsi_sw_tcp_pdu_init(struct iscsi_task *task,
				 unsigned int offset, unsigned int count)
470 471 472 473
{
	struct iscsi_conn *conn = task->conn;
	int err = 0;

474
	iscsi_sw_tcp_send_hdr_prep(conn, task->hdr, task->hdr_len);
475 476 477 478 479

	if (!count)
		return 0;

	if (!task->sc)
480
		iscsi_sw_tcp_send_linear_data_prep(conn, task->data, count);
481 482 483
	else {
		struct scsi_data_buffer *sdb = scsi_out(task->sc);

484 485 486
		err = iscsi_sw_tcp_send_data_prep(conn, sdb->table.sgl,
						  sdb->table.nents, offset,
						  count);
487 488 489
	}

	if (err) {
490
		/* got invalid offset/len */
491 492 493 494 495
		return -EIO;
	}
	return 0;
}

496
static int iscsi_sw_tcp_pdu_alloc(struct iscsi_task *task, uint8_t opcode)
497
{
498
	struct iscsi_tcp_task *tcp_task = task->dd_data;
499

500 501
	task->hdr = task->dd_data + sizeof(*tcp_task);
	task->hdr_max = sizeof(struct iscsi_sw_tcp_hdrbuf) - ISCSI_DIGEST_SIZE;
502
	return 0;
503 504
}

505
static struct iscsi_cls_conn *
506 507
iscsi_sw_tcp_conn_create(struct iscsi_cls_session *cls_session,
			 uint32_t conn_idx)
508
{
509 510 511
	struct iscsi_conn *conn;
	struct iscsi_cls_conn *cls_conn;
	struct iscsi_tcp_conn *tcp_conn;
512
	struct iscsi_sw_tcp_conn *tcp_sw_conn;
513

514 515
	cls_conn = iscsi_tcp_conn_setup(cls_session, sizeof(*tcp_sw_conn),
					conn_idx);
516 517 518
	if (!cls_conn)
		return NULL;
	conn = cls_conn->dd_data;
519
	tcp_conn = conn->dd_data;
520
	tcp_sw_conn = tcp_conn->dd_data;
521

522 523 524 525
	tcp_sw_conn->tx_hash.tfm = crypto_alloc_hash("crc32c", 0,
						     CRYPTO_ALG_ASYNC);
	tcp_sw_conn->tx_hash.flags = 0;
	if (IS_ERR(tcp_sw_conn->tx_hash.tfm))
526
		goto free_conn;
527

528 529 530 531
	tcp_sw_conn->rx_hash.tfm = crypto_alloc_hash("crc32c", 0,
						     CRYPTO_ALG_ASYNC);
	tcp_sw_conn->rx_hash.flags = 0;
	if (IS_ERR(tcp_sw_conn->rx_hash.tfm))
532
		goto free_tx_tfm;
533
	tcp_conn->rx_hash = &tcp_sw_conn->rx_hash;
534

535
	return cls_conn;
536

537
free_tx_tfm:
538
	crypto_free_hash(tcp_sw_conn->tx_hash.tfm);
539
free_conn:
540 541 542 543 544
	iscsi_conn_printk(KERN_ERR, conn,
			  "Could not create connection due to crc32c "
			  "loading error. Make sure the crc32c "
			  "module is built as a module or into the "
			  "kernel\n");
545
	iscsi_tcp_conn_teardown(cls_conn);
546
	return NULL;
547 548
}

549
static void iscsi_sw_tcp_release_conn(struct iscsi_conn *conn)
550
{
551
	struct iscsi_session *session = conn->session;
552
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
553 554
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
	struct socket *sock = tcp_sw_conn->sock;
555

556
	if (!sock)
557 558
		return;

559
	sock_hold(sock->sk);
560
	iscsi_sw_tcp_conn_restore_callbacks(conn);
561
	sock_put(sock->sk);
562

563
	spin_lock_bh(&session->lock);
564
	tcp_sw_conn->sock = NULL;
565 566
	spin_unlock_bh(&session->lock);
	sockfd_put(sock);
567 568
}

569
static void iscsi_sw_tcp_conn_destroy(struct iscsi_cls_conn *cls_conn)
570
{
571 572
	struct iscsi_conn *conn = cls_conn->dd_data;
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
573
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
574

575
	iscsi_sw_tcp_release_conn(conn);
576

577 578 579 580
	if (tcp_sw_conn->tx_hash.tfm)
		crypto_free_hash(tcp_sw_conn->tx_hash.tfm);
	if (tcp_sw_conn->rx_hash.tfm)
		crypto_free_hash(tcp_sw_conn->rx_hash.tfm);
581

582
	iscsi_tcp_conn_teardown(cls_conn);
583
}
584

585
static void iscsi_sw_tcp_conn_stop(struct iscsi_cls_conn *cls_conn, int flag)
586 587
{
	struct iscsi_conn *conn = cls_conn->dd_data;
588
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
589
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
590
	struct socket *sock = tcp_sw_conn->sock;
591 592

	/* userspace may have goofed up and not bound us */
593
	if (!sock)
594 595 596 597 598 599
		return;
	/*
	 * Make sure our recv side is stopped.
	 * Older tools called conn stop before ep_disconnect
	 * so IO could still be coming in.
	 */
600
	write_lock_bh(&tcp_sw_conn->sock->sk->sk_callback_lock);
601
	set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_rx);
602
	write_unlock_bh(&tcp_sw_conn->sock->sk->sk_callback_lock);
603

604 605
	sock->sk->sk_err = EIO;
	wake_up_interruptible(sk_sleep(sock->sk));
606

607
	iscsi_conn_stop(cls_conn, flag);
608
	iscsi_sw_tcp_release_conn(conn);
609 610
}

611
static int
612 613 614
iscsi_sw_tcp_conn_bind(struct iscsi_cls_session *cls_session,
		       struct iscsi_cls_conn *cls_conn, uint64_t transport_eph,
		       int is_leading)
615
{
616
	struct iscsi_session *session = cls_session->dd_data;
617 618
	struct iscsi_conn *conn = cls_conn->dd_data;
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
619
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
620 621 622
	struct sock *sk;
	struct socket *sock;
	int err;
623

624
	/* lookup for existing socket */
625
	sock = sockfd_lookup((int)transport_eph, &err);
626
	if (!sock) {
627 628
		iscsi_conn_printk(KERN_ERR, conn,
				  "sockfd_lookup failed %d\n", err);
629
		return -EEXIST;
630 631
	}

632 633
	err = iscsi_conn_bind(cls_session, cls_conn, is_leading);
	if (err)
634
		goto free_socket;
635

636
	spin_lock_bh(&session->lock);
637
	/* bind iSCSI connection and socket */
638
	tcp_sw_conn->sock = sock;
639
	spin_unlock_bh(&session->lock);
640

641 642 643 644 645
	/* setup Socket parameters */
	sk = sock->sk;
	sk->sk_reuse = 1;
	sk->sk_sndtimeo = 15 * HZ; /* FIXME: make it configurable */
	sk->sk_allocation = GFP_ATOMIC;
646

647 648
	iscsi_sw_tcp_conn_set_callbacks(conn);
	tcp_sw_conn->sendpage = tcp_sw_conn->sock->ops->sendpage;
649 650 651
	/*
	 * set receive state machine into initial state
	 */
O
Olaf Kirch 已提交
652
	iscsi_tcp_hdr_recv_prep(tcp_conn);
653
	return 0;
654 655 656 657

free_socket:
	sockfd_put(sock);
	return err;
658 659
}

660 661 662
static int iscsi_sw_tcp_conn_set_param(struct iscsi_cls_conn *cls_conn,
				       enum iscsi_param param, char *buf,
				       int buflen)
663
{
664
	struct iscsi_conn *conn = cls_conn->dd_data;
665
	struct iscsi_session *session = conn->session;
666
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
667
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
668
	int value;
669 670 671

	switch(param) {
	case ISCSI_PARAM_HDRDGST_EN:
672
		iscsi_set_param(cls_conn, param, buf, buflen);
673 674
		break;
	case ISCSI_PARAM_DATADGST_EN:
675
		iscsi_set_param(cls_conn, param, buf, buflen);
676 677
		tcp_sw_conn->sendpage = conn->datadgst_en ?
			sock_no_sendpage : tcp_sw_conn->sock->ops->sendpage;
678 679
		break;
	case ISCSI_PARAM_MAX_R2T:
680
		sscanf(buf, "%d", &value);
681 682 683
		if (value <= 0 || !is_power_of_2(value))
			return -EINVAL;
		if (session->max_r2t == value)
684
			break;
685
		iscsi_tcp_r2tpool_free(session);
686
		iscsi_set_param(cls_conn, param, buf, buflen);
687
		if (iscsi_tcp_r2tpool_alloc(session))
688 689 690
			return -ENOMEM;
		break;
	default:
691
		return iscsi_set_param(cls_conn, param, buf, buflen);
692 693 694 695 696
	}

	return 0;
}

697 698
static int iscsi_sw_tcp_conn_get_param(struct iscsi_cls_conn *cls_conn,
				       enum iscsi_param param, char *buf)
699
{
700
	struct iscsi_conn *conn = cls_conn->dd_data;
701 702 703 704
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
	struct sockaddr_in6 addr;
	int rc, len;
705 706

	switch(param) {
707 708
	case ISCSI_PARAM_CONN_PORT:
	case ISCSI_PARAM_CONN_ADDRESS:
709
		spin_lock_bh(&conn->session->lock);
710 711 712 713 714 715
		if (!tcp_sw_conn || !tcp_sw_conn->sock) {
			spin_unlock_bh(&conn->session->lock);
			return -ENOTCONN;
		}
		rc = kernel_getpeername(tcp_sw_conn->sock,
					(struct sockaddr *)&addr, &len);
716
		spin_unlock_bh(&conn->session->lock);
717 718 719 720 721
		if (rc)
			return rc;

		return iscsi_conn_get_addr_param((struct sockaddr_storage *)
						 &addr, param, buf);
722
	default:
723
		return iscsi_conn_get_param(cls_conn, param, buf);
724 725
	}

726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768
	return 0;
}

static int iscsi_sw_tcp_host_get_param(struct Scsi_Host *shost,
				       enum iscsi_host_param param, char *buf)
{
	struct iscsi_sw_tcp_host *tcp_sw_host = iscsi_host_priv(shost);
	struct iscsi_session *session = tcp_sw_host->session;
	struct iscsi_conn *conn;
	struct iscsi_tcp_conn *tcp_conn;
	struct iscsi_sw_tcp_conn *tcp_sw_conn;
	struct sockaddr_in6 addr;
	int rc, len;

	switch (param) {
	case ISCSI_HOST_PARAM_IPADDRESS:
		spin_lock_bh(&session->lock);
		conn = session->leadconn;
		if (!conn) {
			spin_unlock_bh(&session->lock);
			return -ENOTCONN;
		}
		tcp_conn = conn->dd_data;

		tcp_sw_conn = tcp_conn->dd_data;
		if (!tcp_sw_conn->sock) {
			spin_unlock_bh(&session->lock);
			return -ENOTCONN;
		}

		rc = kernel_getsockname(tcp_sw_conn->sock,
					(struct sockaddr *)&addr, &len);
		spin_unlock_bh(&session->lock);
		if (rc)
			return rc;

		return iscsi_conn_get_addr_param((struct sockaddr_storage *)
						 &addr, param, buf);
	default:
		return iscsi_host_get_param(shost, param, buf);
	}

	return 0;
769 770
}

771
static void
772 773
iscsi_sw_tcp_conn_get_stats(struct iscsi_cls_conn *cls_conn,
			    struct iscsi_stats *stats)
774
{
775
	struct iscsi_conn *conn = cls_conn->dd_data;
776
	struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
777
	struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
778 779 780

	stats->custom_length = 3;
	strcpy(stats->custom[0].desc, "tx_sendpage_failures");
781
	stats->custom[0].value = tcp_sw_conn->sendpage_failures_cnt;
782
	strcpy(stats->custom[1].desc, "rx_discontiguous_hdr");
783
	stats->custom[1].value = tcp_sw_conn->discontiguous_hdr_cnt;
784 785
	strcpy(stats->custom[2].desc, "eh_abort_cnt");
	stats->custom[2].value = conn->eh_abort_cnt;
786 787

	iscsi_tcp_conn_get_stats(cls_conn, stats);
788 789
}

790
static struct iscsi_cls_session *
791
iscsi_sw_tcp_session_create(struct iscsi_endpoint *ep, uint16_t cmds_max,
792
			    uint16_t qdepth, uint32_t initial_cmdsn)
793
{
794 795
	struct iscsi_cls_session *cls_session;
	struct iscsi_session *session;
796
	struct iscsi_sw_tcp_host *tcp_sw_host;
797
	struct Scsi_Host *shost;
798

799 800
	if (ep) {
		printk(KERN_ERR "iscsi_tcp: invalid ep %p.\n", ep);
801 802 803
		return NULL;
	}

804 805
	shost = iscsi_host_alloc(&iscsi_sw_tcp_sht,
				 sizeof(struct iscsi_sw_tcp_host), 1);
806
	if (!shost)
807
		return NULL;
808
	shost->transportt = iscsi_sw_tcp_scsi_transport;
809
	shost->cmd_per_lun = qdepth;
810 811 812
	shost->max_lun = iscsi_max_lun;
	shost->max_id = 0;
	shost->max_channel = 0;
813
	shost->max_cmd_len = SCSI_MAX_VARLEN_CDB_SIZE;
814

815
	if (iscsi_host_add(shost, NULL))
816 817
		goto free_host;

818
	cls_session = iscsi_session_setup(&iscsi_sw_tcp_transport, shost,
819
					  cmds_max, 0,
820 821
					  sizeof(struct iscsi_tcp_task) +
					  sizeof(struct iscsi_sw_tcp_hdrbuf),
822
					  initial_cmdsn, 0);
823 824 825
	if (!cls_session)
		goto remove_host;
	session = cls_session->dd_data;
826 827
	tcp_sw_host = iscsi_host_priv(shost);
	tcp_sw_host->session = session;
828

829
	shost->can_queue = session->scsi_cmds_max;
830
	if (iscsi_tcp_r2tpool_alloc(session))
831
		goto remove_session;
832 833
	return cls_session;

834
remove_session:
835
	iscsi_session_teardown(cls_session);
836
remove_host:
837
	iscsi_host_remove(shost);
838
free_host:
839
	iscsi_host_free(shost);
840 841 842
	return NULL;
}

843
static void iscsi_sw_tcp_session_destroy(struct iscsi_cls_session *cls_session)
844
{
845 846
	struct Scsi_Host *shost = iscsi_session_to_shost(cls_session);

847
	iscsi_tcp_r2tpool_free(cls_session->dd_data);
848
	iscsi_session_teardown(cls_session);
849

850 851
	iscsi_host_remove(shost);
	iscsi_host_free(shost);
852 853
}

P
Pete Wyckoff 已提交
854 855 856 857 858 859
static int iscsi_sw_tcp_slave_alloc(struct scsi_device *sdev)
{
	set_bit(QUEUE_FLAG_BIDI, &sdev->request_queue->queue_flags);
	return 0;
}

860
static int iscsi_sw_tcp_slave_configure(struct scsi_device *sdev)
861
{
862
	blk_queue_bounce_limit(sdev->request_queue, BLK_BOUNCE_ANY);
863 864 865 866
	blk_queue_dma_alignment(sdev->request_queue, 0);
	return 0;
}

867
static struct scsi_host_template iscsi_sw_tcp_sht = {
868
	.module			= THIS_MODULE,
869
	.name			= "iSCSI Initiator over TCP/IP",
870 871
	.queuecommand           = iscsi_queuecommand,
	.change_queue_depth	= iscsi_change_queue_depth,
872
	.can_queue		= ISCSI_DEF_XMIT_CMDS_MAX - 1,
873
	.sg_tablesize		= 4096,
874
	.max_sectors		= 0xFFFF,
875 876
	.cmd_per_lun		= ISCSI_DEF_CMD_PER_LUN,
	.eh_abort_handler       = iscsi_eh_abort,
877
	.eh_device_reset_handler= iscsi_eh_device_reset,
878
	.eh_target_reset_handler = iscsi_eh_recover_target,
879
	.use_clustering         = DISABLE_CLUSTERING,
P
Pete Wyckoff 已提交
880
	.slave_alloc            = iscsi_sw_tcp_slave_alloc,
881
	.slave_configure        = iscsi_sw_tcp_slave_configure,
882
	.target_alloc		= iscsi_target_alloc,
883 884 885 886
	.proc_name		= "iscsi_tcp",
	.this_id		= -1,
};

887
static struct iscsi_transport iscsi_sw_tcp_transport = {
888 889 890 891
	.owner			= THIS_MODULE,
	.name			= "tcp",
	.caps			= CAP_RECOVERY_L0 | CAP_MULTI_R2T | CAP_HDRDGST
				  | CAP_DATADGST,
892 893 894 895 896 897 898 899 900 901 902 903 904
	.param_mask		= ISCSI_MAX_RECV_DLENGTH |
				  ISCSI_MAX_XMIT_DLENGTH |
				  ISCSI_HDRDGST_EN |
				  ISCSI_DATADGST_EN |
				  ISCSI_INITIAL_R2T_EN |
				  ISCSI_MAX_R2T |
				  ISCSI_IMM_DATA_EN |
				  ISCSI_FIRST_BURST |
				  ISCSI_MAX_BURST |
				  ISCSI_PDU_INORDER_EN |
				  ISCSI_DATASEQ_INORDER_EN |
				  ISCSI_ERL |
				  ISCSI_CONN_PORT |
905
				  ISCSI_CONN_ADDRESS |
906 907 908
				  ISCSI_EXP_STATSN |
				  ISCSI_PERSISTENT_PORT |
				  ISCSI_PERSISTENT_ADDRESS |
909 910
				  ISCSI_TARGET_NAME | ISCSI_TPGT |
				  ISCSI_USERNAME | ISCSI_PASSWORD |
911
				  ISCSI_USERNAME_IN | ISCSI_PASSWORD_IN |
912
				  ISCSI_FAST_ABORT | ISCSI_ABORT_TMO |
913
				  ISCSI_LU_RESET_TMO | ISCSI_TGT_RESET_TMO |
914 915
				  ISCSI_PING_TMO | ISCSI_RECV_TMO |
				  ISCSI_IFACE_NAME | ISCSI_INITIATOR_NAME,
916
	.host_param_mask	= ISCSI_HOST_HWADDRESS | ISCSI_HOST_IPADDRESS |
917 918
				  ISCSI_HOST_INITIATOR_NAME |
				  ISCSI_HOST_NETDEV_NAME,
919
	/* session management */
920 921
	.create_session		= iscsi_sw_tcp_session_create,
	.destroy_session	= iscsi_sw_tcp_session_destroy,
922
	/* connection management */
923 924 925 926 927
	.create_conn		= iscsi_sw_tcp_conn_create,
	.bind_conn		= iscsi_sw_tcp_conn_bind,
	.destroy_conn		= iscsi_sw_tcp_conn_destroy,
	.set_param		= iscsi_sw_tcp_conn_set_param,
	.get_conn_param		= iscsi_sw_tcp_conn_get_param,
928
	.get_session_param	= iscsi_session_get_param,
929
	.start_conn		= iscsi_conn_start,
930
	.stop_conn		= iscsi_sw_tcp_conn_stop,
931
	/* iscsi host params */
932
	.get_host_param		= iscsi_sw_tcp_host_get_param,
933
	.set_host_param		= iscsi_host_set_param,
934
	/* IO */
935
	.send_pdu		= iscsi_conn_send_pdu,
936
	.get_stats		= iscsi_sw_tcp_conn_get_stats,
937
	/* iscsi task/cmd helpers */
938 939 940
	.init_task		= iscsi_tcp_task_init,
	.xmit_task		= iscsi_tcp_task_xmit,
	.cleanup_task		= iscsi_tcp_cleanup_task,
941
	/* low level pdu helpers */
942 943 944
	.xmit_pdu		= iscsi_sw_tcp_pdu_xmit,
	.init_pdu		= iscsi_sw_tcp_pdu_init,
	.alloc_pdu		= iscsi_sw_tcp_pdu_alloc,
945
	/* recovery */
M
Mike Christie 已提交
946
	.session_recovery_timedout = iscsi_session_recovery_timedout,
947 948
};

949
static int __init iscsi_sw_tcp_init(void)
950 951
{
	if (iscsi_max_lun < 1) {
O
Or Gerlitz 已提交
952 953
		printk(KERN_ERR "iscsi_tcp: Invalid max_lun value of %u\n",
		       iscsi_max_lun);
954 955 956
		return -EINVAL;
	}

957 958 959
	iscsi_sw_tcp_scsi_transport = iscsi_register_transport(
						&iscsi_sw_tcp_transport);
	if (!iscsi_sw_tcp_scsi_transport)
960
		return -ENODEV;
961

962
	return 0;
963 964
}

965
static void __exit iscsi_sw_tcp_exit(void)
966
{
967
	iscsi_unregister_transport(&iscsi_sw_tcp_transport);
968 969
}

970 971
module_init(iscsi_sw_tcp_init);
module_exit(iscsi_sw_tcp_exit);