[NET]: Create netdev attribute_groups with class_device_add
[linux-2.6] / drivers / scsi / iscsi_tcp.c
1 /*
2  * iSCSI Initiator over TCP/IP Data-Path
3  *
4  * Copyright (C) 2004 Dmitry Yusupov
5  * Copyright (C) 2004 Alex Aizman
6  * Copyright (C) 2005 Mike Christie
7  * maintained by open-iscsi@googlegroups.com
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published
11  * by the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful, but
15  * WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * General Public License for more details.
18  *
19  * See the file COPYING included with this distribution for more details.
20  *
21  * Credits:
22  *      Christoph Hellwig
23  *      FUJITA Tomonori
24  *      Arne Redlich
25  *      Zhenyu Wang
26  */
27
28 #include <linux/types.h>
29 #include <linux/list.h>
30 #include <linux/inet.h>
31 #include <linux/blkdev.h>
32 #include <linux/crypto.h>
33 #include <linux/delay.h>
34 #include <linux/kfifo.h>
35 #include <linux/scatterlist.h>
36 #include <linux/mutex.h>
37 #include <net/tcp.h>
38 #include <scsi/scsi_cmnd.h>
39 #include <scsi/scsi_device.h>
40 #include <scsi/scsi_eh.h>
41 #include <scsi/scsi_request.h>
42 #include <scsi/scsi_tcq.h>
43 #include <scsi/scsi_host.h>
44 #include <scsi/scsi.h>
45 #include <scsi/scsi_transport_iscsi.h>
46
47 #include "iscsi_tcp.h"
48
49 MODULE_AUTHOR("Dmitry Yusupov <dmitry_yus@yahoo.com>, "
50               "Alex Aizman <itn780@yahoo.com>");
51 MODULE_DESCRIPTION("iSCSI/TCP data-path");
52 MODULE_LICENSE("GPL");
53 MODULE_VERSION("0:4.445");
54 /* #define DEBUG_TCP */
55 /* #define DEBUG_SCSI */
56 #define DEBUG_ASSERT
57
58 #ifdef DEBUG_TCP
59 #define debug_tcp(fmt...) printk(KERN_DEBUG "tcp: " fmt)
60 #else
61 #define debug_tcp(fmt...)
62 #endif
63
64 #ifdef DEBUG_SCSI
65 #define debug_scsi(fmt...) printk(KERN_DEBUG "scsi: " fmt)
66 #else
67 #define debug_scsi(fmt...)
68 #endif
69
70 #ifndef DEBUG_ASSERT
71 #ifdef BUG_ON
72 #undef BUG_ON
73 #endif
74 #define BUG_ON(expr)
75 #endif
76
77 #define INVALID_SN_DELTA        0xffff
78
79 static unsigned int iscsi_max_lun = 512;
80 module_param_named(max_lun, iscsi_max_lun, uint, S_IRUGO);
81
82 /* global data */
83 static kmem_cache_t *taskcache;
84
85 static inline void
86 iscsi_buf_init_virt(struct iscsi_buf *ibuf, char *vbuf, int size)
87 {
88         sg_init_one(&ibuf->sg, (u8 *)vbuf, size);
89         ibuf->sent = 0;
90         ibuf->use_sendmsg = 0;
91 }
92
93 static inline void
94 iscsi_buf_init_iov(struct iscsi_buf *ibuf, char *vbuf, int size)
95 {
96         ibuf->sg.page = virt_to_page(vbuf);
97         ibuf->sg.offset = offset_in_page(vbuf);
98         ibuf->sg.length = size;
99         ibuf->sent = 0;
100         ibuf->use_sendmsg = 1;
101 }
102
103 static inline void
104 iscsi_buf_init_sg(struct iscsi_buf *ibuf, struct scatterlist *sg)
105 {
106         ibuf->sg.page = sg->page;
107         ibuf->sg.offset = sg->offset;
108         ibuf->sg.length = sg->length;
109         /*
110          * Fastpath: sg element fits into single page
111          */
112         if (sg->length + sg->offset <= PAGE_SIZE && !PageSlab(sg->page))
113                 ibuf->use_sendmsg = 0;
114         else
115                 ibuf->use_sendmsg = 1;
116         ibuf->sent = 0;
117 }
118
119 static inline int
120 iscsi_buf_left(struct iscsi_buf *ibuf)
121 {
122         int rc;
123
124         rc = ibuf->sg.length - ibuf->sent;
125         BUG_ON(rc < 0);
126         return rc;
127 }
128
129 static inline void
130 iscsi_hdr_digest(struct iscsi_conn *conn, struct iscsi_buf *buf,
131                  u8* crc)
132 {
133         crypto_digest_digest(conn->tx_tfm, &buf->sg, 1, crc);
134         buf->sg.length += sizeof(uint32_t);
135 }
136
137 static void
138 iscsi_conn_failure(struct iscsi_conn *conn, enum iscsi_err err)
139 {
140         struct iscsi_session *session = conn->session;
141         unsigned long flags;
142
143         spin_lock_irqsave(&session->lock, flags);
144         if (session->conn_cnt == 1 || session->leadconn == conn)
145                 session->state = ISCSI_STATE_FAILED;
146         spin_unlock_irqrestore(&session->lock, flags);
147         set_bit(SUSPEND_BIT, &conn->suspend_tx);
148         set_bit(SUSPEND_BIT, &conn->suspend_rx);
149         iscsi_conn_error(conn->cls_conn, err);
150 }
151
152 static inline int
153 iscsi_check_assign_cmdsn(struct iscsi_session *session, struct iscsi_nopin *hdr)
154 {
155         uint32_t max_cmdsn = be32_to_cpu(hdr->max_cmdsn);
156         uint32_t exp_cmdsn = be32_to_cpu(hdr->exp_cmdsn);
157
158         if (max_cmdsn < exp_cmdsn -1 &&
159             max_cmdsn > exp_cmdsn - INVALID_SN_DELTA)
160                 return ISCSI_ERR_MAX_CMDSN;
161         if (max_cmdsn > session->max_cmdsn ||
162             max_cmdsn < session->max_cmdsn - INVALID_SN_DELTA)
163                 session->max_cmdsn = max_cmdsn;
164         if (exp_cmdsn > session->exp_cmdsn ||
165             exp_cmdsn < session->exp_cmdsn - INVALID_SN_DELTA)
166                 session->exp_cmdsn = exp_cmdsn;
167
168         return 0;
169 }
170
171 static inline int
172 iscsi_hdr_extract(struct iscsi_conn *conn)
173 {
174         struct sk_buff *skb = conn->in.skb;
175
176         if (conn->in.copy >= conn->hdr_size &&
177             conn->in_progress == IN_PROGRESS_WAIT_HEADER) {
178                 /*
179                  * Zero-copy PDU Header: using connection context
180                  * to store header pointer.
181                  */
182                 if (skb_shinfo(skb)->frag_list == NULL &&
183                     !skb_shinfo(skb)->nr_frags)
184                         conn->in.hdr = (struct iscsi_hdr *)
185                                 ((char*)skb->data + conn->in.offset);
186                 else {
187                         /* ignoring return code since we checked
188                          * in.copy before */
189                         skb_copy_bits(skb, conn->in.offset,
190                                 &conn->hdr, conn->hdr_size);
191                         conn->in.hdr = &conn->hdr;
192                 }
193                 conn->in.offset += conn->hdr_size;
194                 conn->in.copy -= conn->hdr_size;
195         } else {
196                 int hdr_remains;
197                 int copylen;
198
199                 /*
200                  * PDU header scattered across SKB's,
201                  * copying it... This'll happen quite rarely.
202                  */
203
204                 if (conn->in_progress == IN_PROGRESS_WAIT_HEADER)
205                         conn->in.hdr_offset = 0;
206
207                 hdr_remains = conn->hdr_size - conn->in.hdr_offset;
208                 BUG_ON(hdr_remains <= 0);
209
210                 copylen = min(conn->in.copy, hdr_remains);
211                 skb_copy_bits(skb, conn->in.offset,
212                         (char*)&conn->hdr + conn->in.hdr_offset, copylen);
213
214                 debug_tcp("PDU gather offset %d bytes %d in.offset %d "
215                        "in.copy %d\n", conn->in.hdr_offset, copylen,
216                        conn->in.offset, conn->in.copy);
217
218                 conn->in.offset += copylen;
219                 conn->in.copy -= copylen;
220                 if (copylen < hdr_remains)  {
221                         conn->in_progress = IN_PROGRESS_HEADER_GATHER;
222                         conn->in.hdr_offset += copylen;
223                         return -EAGAIN;
224                 }
225                 conn->in.hdr = &conn->hdr;
226                 conn->discontiguous_hdr_cnt++;
227                 conn->in_progress = IN_PROGRESS_WAIT_HEADER;
228         }
229
230         return 0;
231 }
232
233 static inline void
234 iscsi_ctask_cleanup(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
235 {
236         struct scsi_cmnd *sc = ctask->sc;
237         struct iscsi_session *session = conn->session;
238
239         spin_lock(&session->lock);
240         if (unlikely(!sc)) {
241                 spin_unlock(&session->lock);
242                 return;
243         }
244         if (sc->sc_data_direction == DMA_TO_DEVICE) {
245                 struct iscsi_data_task *dtask, *n;
246                 /* WRITE: cleanup Data-Out's if any */
247                 list_for_each_entry_safe(dtask, n, &ctask->dataqueue, item) {
248                         list_del(&dtask->item);
249                         mempool_free(dtask, ctask->datapool);
250                 }
251         }
252         ctask->xmstate = XMSTATE_IDLE;
253         ctask->r2t = NULL;
254         ctask->sc = NULL;
255         __kfifo_put(session->cmdpool.queue, (void*)&ctask, sizeof(void*));
256         spin_unlock(&session->lock);
257 }
258
259 /**
260  * iscsi_cmd_rsp - SCSI Command Response processing
261  * @conn: iscsi connection
262  * @ctask: scsi command task
263  **/
264 static int
265 iscsi_cmd_rsp(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
266 {
267         int rc;
268         struct iscsi_cmd_rsp *rhdr = (struct iscsi_cmd_rsp *)conn->in.hdr;
269         struct iscsi_session *session = conn->session;
270         struct scsi_cmnd *sc = ctask->sc;
271
272         rc = iscsi_check_assign_cmdsn(session, (struct iscsi_nopin*)rhdr);
273         if (rc) {
274                 sc->result = (DID_ERROR << 16);
275                 goto out;
276         }
277
278         conn->exp_statsn = be32_to_cpu(rhdr->statsn) + 1;
279
280         sc->result = (DID_OK << 16) | rhdr->cmd_status;
281
282         if (rhdr->response != ISCSI_STATUS_CMD_COMPLETED) {
283                 sc->result = (DID_ERROR << 16);
284                 goto out;
285         }
286
287         if (rhdr->cmd_status == SAM_STAT_CHECK_CONDITION && conn->senselen) {
288                 int sensecopy = min(conn->senselen, SCSI_SENSE_BUFFERSIZE);
289
290                 memcpy(sc->sense_buffer, conn->data + 2, sensecopy);
291                 debug_scsi("copied %d bytes of sense\n", sensecopy);
292         }
293
294         if (sc->sc_data_direction == DMA_TO_DEVICE)
295                 goto out;
296
297         if (rhdr->flags & ISCSI_FLAG_CMD_UNDERFLOW) {
298                 int res_count = be32_to_cpu(rhdr->residual_count);
299
300                 if (res_count > 0 && res_count <= sc->request_bufflen)
301                         sc->resid = res_count;
302                 else
303                         sc->result = (DID_BAD_TARGET << 16) | rhdr->cmd_status;
304         } else if (rhdr->flags & ISCSI_FLAG_CMD_BIDI_UNDERFLOW)
305                 sc->result = (DID_BAD_TARGET << 16) | rhdr->cmd_status;
306         else if (rhdr->flags & ISCSI_FLAG_CMD_OVERFLOW)
307                 sc->resid = be32_to_cpu(rhdr->residual_count);
308
309 out:
310         debug_scsi("done [sc %lx res %d itt 0x%x]\n",
311                    (long)sc, sc->result, ctask->itt);
312         conn->scsirsp_pdus_cnt++;
313         iscsi_ctask_cleanup(conn, ctask);
314         sc->scsi_done(sc);
315         return rc;
316 }
317
318 /**
319  * iscsi_data_rsp - SCSI Data-In Response processing
320  * @conn: iscsi connection
321  * @ctask: scsi command task
322  **/
323 static int
324 iscsi_data_rsp(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
325 {
326         int rc;
327         struct iscsi_data_rsp *rhdr = (struct iscsi_data_rsp *)conn->in.hdr;
328         struct iscsi_session *session = conn->session;
329         int datasn = be32_to_cpu(rhdr->datasn);
330
331         rc = iscsi_check_assign_cmdsn(session, (struct iscsi_nopin*)rhdr);
332         if (rc)
333                 return rc;
334         /*
335          * setup Data-In byte counter (gets decremented..)
336          */
337         ctask->data_count = conn->in.datalen;
338
339         if (conn->in.datalen == 0)
340                 return 0;
341
342         if (ctask->datasn != datasn)
343                 return ISCSI_ERR_DATASN;
344
345         ctask->datasn++;
346
347         ctask->data_offset = be32_to_cpu(rhdr->offset);
348         if (ctask->data_offset + conn->in.datalen > ctask->total_length)
349                 return ISCSI_ERR_DATA_OFFSET;
350
351         if (rhdr->flags & ISCSI_FLAG_DATA_STATUS) {
352                 struct scsi_cmnd *sc = ctask->sc;
353
354                 conn->exp_statsn = be32_to_cpu(rhdr->statsn) + 1;
355                 if (rhdr->flags & ISCSI_FLAG_DATA_UNDERFLOW) {
356                         int res_count = be32_to_cpu(rhdr->residual_count);
357
358                         if (res_count > 0 &&
359                             res_count <= sc->request_bufflen) {
360                                 sc->resid = res_count;
361                                 sc->result = (DID_OK << 16) | rhdr->cmd_status;
362                         } else
363                                 sc->result = (DID_BAD_TARGET << 16) |
364                                         rhdr->cmd_status;
365                 } else if (rhdr->flags & ISCSI_FLAG_DATA_OVERFLOW) {
366                         sc->resid = be32_to_cpu(rhdr->residual_count);
367                         sc->result = (DID_OK << 16) | rhdr->cmd_status;
368                 } else
369                         sc->result = (DID_OK << 16) | rhdr->cmd_status;
370         }
371
372         conn->datain_pdus_cnt++;
373         return 0;
374 }
375
376 /**
377  * iscsi_solicit_data_init - initialize first Data-Out
378  * @conn: iscsi connection
379  * @ctask: scsi command task
380  * @r2t: R2T info
381  *
382  * Notes:
383  *      Initialize first Data-Out within this R2T sequence and finds
384  *      proper data_offset within this SCSI command.
385  *
386  *      This function is called with connection lock taken.
387  **/
388 static void
389 iscsi_solicit_data_init(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask,
390                         struct iscsi_r2t_info *r2t)
391 {
392         struct iscsi_data *hdr;
393         struct iscsi_data_task *dtask;
394         struct scsi_cmnd *sc = ctask->sc;
395
396         dtask = mempool_alloc(ctask->datapool, GFP_ATOMIC);
397         BUG_ON(!dtask);
398         hdr = &dtask->hdr;
399         memset(hdr, 0, sizeof(struct iscsi_data));
400         hdr->ttt = r2t->ttt;
401         hdr->datasn = cpu_to_be32(r2t->solicit_datasn);
402         r2t->solicit_datasn++;
403         hdr->opcode = ISCSI_OP_SCSI_DATA_OUT;
404         memcpy(hdr->lun, ctask->hdr.lun, sizeof(hdr->lun));
405         hdr->itt = ctask->hdr.itt;
406         hdr->exp_statsn = r2t->exp_statsn;
407         hdr->offset = cpu_to_be32(r2t->data_offset);
408         if (r2t->data_length > conn->max_xmit_dlength) {
409                 hton24(hdr->dlength, conn->max_xmit_dlength);
410                 r2t->data_count = conn->max_xmit_dlength;
411                 hdr->flags = 0;
412         } else {
413                 hton24(hdr->dlength, r2t->data_length);
414                 r2t->data_count = r2t->data_length;
415                 hdr->flags = ISCSI_FLAG_CMD_FINAL;
416         }
417         conn->dataout_pdus_cnt++;
418
419         r2t->sent = 0;
420
421         iscsi_buf_init_virt(&r2t->headbuf, (char*)hdr,
422                            sizeof(struct iscsi_hdr));
423
424         r2t->dtask = dtask;
425
426         if (sc->use_sg) {
427                 int i, sg_count = 0;
428                 struct scatterlist *sg = sc->request_buffer;
429
430                 r2t->sg = NULL;
431                 for (i = 0; i < sc->use_sg; i++, sg += 1) {
432                         /* FIXME: prefetch ? */
433                         if (sg_count + sg->length > r2t->data_offset) {
434                                 int page_offset;
435
436                                 /* sg page found! */
437
438                                 /* offset within this page */
439                                 page_offset = r2t->data_offset - sg_count;
440
441                                 /* fill in this buffer */
442                                 iscsi_buf_init_sg(&r2t->sendbuf, sg);
443                                 r2t->sendbuf.sg.offset += page_offset;
444                                 r2t->sendbuf.sg.length -= page_offset;
445
446                                 /* xmit logic will continue with next one */
447                                 r2t->sg = sg + 1;
448                                 break;
449                         }
450                         sg_count += sg->length;
451                 }
452                 BUG_ON(r2t->sg == NULL);
453         } else
454                 iscsi_buf_init_iov(&ctask->sendbuf,
455                             (char*)sc->request_buffer + r2t->data_offset,
456                             r2t->data_count);
457
458         list_add(&dtask->item, &ctask->dataqueue);
459 }
460
461 /**
462  * iscsi_r2t_rsp - iSCSI R2T Response processing
463  * @conn: iscsi connection
464  * @ctask: scsi command task
465  **/
466 static int
467 iscsi_r2t_rsp(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
468 {
469         struct iscsi_r2t_info *r2t;
470         struct iscsi_session *session = conn->session;
471         struct iscsi_r2t_rsp *rhdr = (struct iscsi_r2t_rsp *)conn->in.hdr;
472         int r2tsn = be32_to_cpu(rhdr->r2tsn);
473         int rc;
474
475         if (conn->in.ahslen)
476                 return ISCSI_ERR_AHSLEN;
477
478         if (conn->in.datalen)
479                 return ISCSI_ERR_DATALEN;
480
481         if (ctask->exp_r2tsn && ctask->exp_r2tsn != r2tsn)
482                 return ISCSI_ERR_R2TSN;
483
484         rc = iscsi_check_assign_cmdsn(session, (struct iscsi_nopin*)rhdr);
485         if (rc)
486                 return rc;
487
488         /* FIXME: use R2TSN to detect missing R2T */
489
490         /* fill-in new R2T associated with the task */
491         spin_lock(&session->lock);
492         if (!ctask->sc || ctask->mtask ||
493              session->state != ISCSI_STATE_LOGGED_IN) {
494                 printk(KERN_INFO "iscsi_tcp: dropping R2T itt %d in "
495                        "recovery...\n", ctask->itt);
496                 spin_unlock(&session->lock);
497                 return 0;
498         }
499         rc = __kfifo_get(ctask->r2tpool.queue, (void*)&r2t, sizeof(void*));
500         BUG_ON(!rc);
501
502         r2t->exp_statsn = rhdr->statsn;
503         r2t->data_length = be32_to_cpu(rhdr->data_length);
504         if (r2t->data_length == 0 ||
505             r2t->data_length > session->max_burst) {
506                 spin_unlock(&session->lock);
507                 return ISCSI_ERR_DATALEN;
508         }
509
510         r2t->data_offset = be32_to_cpu(rhdr->data_offset);
511         if (r2t->data_offset + r2t->data_length > ctask->total_length) {
512                 spin_unlock(&session->lock);
513                 return ISCSI_ERR_DATALEN;
514         }
515
516         r2t->ttt = rhdr->ttt; /* no flip */
517         r2t->solicit_datasn = 0;
518
519         iscsi_solicit_data_init(conn, ctask, r2t);
520
521         ctask->exp_r2tsn = r2tsn + 1;
522         ctask->xmstate |= XMSTATE_SOL_HDR;
523         __kfifo_put(ctask->r2tqueue, (void*)&r2t, sizeof(void*));
524         __kfifo_put(conn->writequeue, (void*)&ctask, sizeof(void*));
525
526         scsi_queue_work(session->host, &conn->xmitwork);
527         conn->r2t_pdus_cnt++;
528         spin_unlock(&session->lock);
529
530         return 0;
531 }
532
533 static int
534 iscsi_hdr_recv(struct iscsi_conn *conn)
535 {
536         int rc = 0;
537         struct iscsi_hdr *hdr;
538         struct iscsi_cmd_task *ctask;
539         struct iscsi_session *session = conn->session;
540         uint32_t cdgst, rdgst = 0;
541
542         hdr = conn->in.hdr;
543
544         /* verify PDU length */
545         conn->in.datalen = ntoh24(hdr->dlength);
546         if (conn->in.datalen > conn->max_recv_dlength) {
547                 printk(KERN_ERR "iscsi_tcp: datalen %d > %d\n",
548                        conn->in.datalen, conn->max_recv_dlength);
549                 return ISCSI_ERR_DATALEN;
550         }
551         conn->data_copied = 0;
552
553         /* read AHS */
554         conn->in.ahslen = hdr->hlength * 4;
555         conn->in.offset += conn->in.ahslen;
556         conn->in.copy -= conn->in.ahslen;
557         if (conn->in.copy < 0) {
558                 printk(KERN_ERR "iscsi_tcp: can't handle AHS with length "
559                        "%d bytes\n", conn->in.ahslen);
560                 return ISCSI_ERR_AHSLEN;
561         }
562
563         /* calculate read padding */
564         conn->in.padding = conn->in.datalen & (ISCSI_PAD_LEN-1);
565         if (conn->in.padding) {
566                 conn->in.padding = ISCSI_PAD_LEN - conn->in.padding;
567                 debug_scsi("read padding %d bytes\n", conn->in.padding);
568         }
569
570         if (conn->hdrdgst_en) {
571                 struct scatterlist sg;
572
573                 sg_init_one(&sg, (u8 *)hdr,
574                             sizeof(struct iscsi_hdr) + conn->in.ahslen);
575                 crypto_digest_digest(conn->rx_tfm, &sg, 1, (u8 *)&cdgst);
576                 rdgst = *(uint32_t*)((char*)hdr + sizeof(struct iscsi_hdr) +
577                                      conn->in.ahslen);
578                 if (cdgst != rdgst) {
579                         printk(KERN_ERR "iscsi_tcp: itt %x: hdrdgst error "
580                                "recv 0x%x calc 0x%x\n", conn->in.itt, rdgst,
581                                cdgst);
582                         return ISCSI_ERR_HDR_DGST;
583                 }
584         }
585
586         /* save opcode for later */
587         conn->in.opcode = hdr->opcode & ISCSI_OPCODE_MASK;
588
589         /* verify itt (itt encoding: age+cid+itt) */
590         if (hdr->itt != cpu_to_be32(ISCSI_RESERVED_TAG)) {
591                 if ((hdr->itt & AGE_MASK) !=
592                                 (session->age << AGE_SHIFT)) {
593                         printk(KERN_ERR "iscsi_tcp: received itt %x expected "
594                                 "session age (%x)\n", hdr->itt,
595                                 session->age & AGE_MASK);
596                         return ISCSI_ERR_BAD_ITT;
597                 }
598
599                 if ((hdr->itt & CID_MASK) != (conn->id << CID_SHIFT)) {
600                         printk(KERN_ERR "iscsi_tcp: received itt %x, expected "
601                                 "CID (%x)\n", hdr->itt, conn->id);
602                         return ISCSI_ERR_BAD_ITT;
603                 }
604                 conn->in.itt = hdr->itt & ITT_MASK;
605         } else
606                 conn->in.itt = hdr->itt;
607
608         debug_tcp("opcode 0x%x offset %d copy %d ahslen %d datalen %d\n",
609                   hdr->opcode, conn->in.offset, conn->in.copy,
610                   conn->in.ahslen, conn->in.datalen);
611
612         if (conn->in.itt < session->cmds_max) {
613                 ctask = (struct iscsi_cmd_task *)session->cmds[conn->in.itt];
614
615                 if (!ctask->sc) {
616                         printk(KERN_INFO "iscsi_tcp: dropping ctask with "
617                                "itt 0x%x\n", ctask->itt);
618                         conn->in.datalen = 0; /* force drop */
619                         return 0;
620                 }
621
622                 if (ctask->sc->SCp.phase != session->age) {
623                         printk(KERN_ERR "iscsi_tcp: ctask's session age %d, "
624                                 "expected %d\n", ctask->sc->SCp.phase,
625                                 session->age);
626                         return ISCSI_ERR_SESSION_FAILED;
627                 }
628
629                 conn->in.ctask = ctask;
630
631                 debug_scsi("rsp [op 0x%x cid %d sc %lx itt 0x%x len %d]\n",
632                            hdr->opcode, conn->id, (long)ctask->sc,
633                            ctask->itt, conn->in.datalen);
634
635                 switch(conn->in.opcode) {
636                 case ISCSI_OP_SCSI_CMD_RSP:
637                         BUG_ON((void*)ctask != ctask->sc->SCp.ptr);
638                         if (!conn->in.datalen)
639                                 rc = iscsi_cmd_rsp(conn, ctask);
640                         else
641                                 /*
642                                  * got sense or response data; copying PDU
643                                  * Header to the connection's header
644                                  * placeholder
645                                  */
646                                 memcpy(&conn->hdr, hdr,
647                                        sizeof(struct iscsi_hdr));
648                         break;
649                 case ISCSI_OP_SCSI_DATA_IN:
650                         BUG_ON((void*)ctask != ctask->sc->SCp.ptr);
651                         /* save flags for non-exceptional status */
652                         conn->in.flags = hdr->flags;
653                         /* save cmd_status for sense data */
654                         conn->in.cmd_status =
655                                 ((struct iscsi_data_rsp*)hdr)->cmd_status;
656                         rc = iscsi_data_rsp(conn, ctask);
657                         break;
658                 case ISCSI_OP_R2T:
659                         BUG_ON((void*)ctask != ctask->sc->SCp.ptr);
660                         if (ctask->sc->sc_data_direction == DMA_TO_DEVICE)
661                                 rc = iscsi_r2t_rsp(conn, ctask);
662                         else
663                                 rc = ISCSI_ERR_PROTO;
664                         break;
665                 default:
666                         rc = ISCSI_ERR_BAD_OPCODE;
667                         break;
668                 }
669         } else if (conn->in.itt >= ISCSI_MGMT_ITT_OFFSET &&
670                    conn->in.itt < ISCSI_MGMT_ITT_OFFSET +
671                                         session->mgmtpool_max) {
672                 struct iscsi_mgmt_task *mtask = (struct iscsi_mgmt_task *)
673                                         session->mgmt_cmds[conn->in.itt -
674                                                 ISCSI_MGMT_ITT_OFFSET];
675
676                 debug_scsi("immrsp [op 0x%x cid %d itt 0x%x len %d]\n",
677                            conn->in.opcode, conn->id, mtask->itt,
678                            conn->in.datalen);
679
680                 switch(conn->in.opcode) {
681                 case ISCSI_OP_LOGIN_RSP:
682                 case ISCSI_OP_TEXT_RSP:
683                 case ISCSI_OP_LOGOUT_RSP:
684                         rc = iscsi_check_assign_cmdsn(session,
685                                                  (struct iscsi_nopin*)hdr);
686                         if (rc)
687                                 break;
688
689                         if (!conn->in.datalen) {
690                                 rc = iscsi_recv_pdu(conn->cls_conn, hdr,
691                                                     NULL, 0);
692                                 if (conn->login_mtask != mtask) {
693                                         spin_lock(&session->lock);
694                                         __kfifo_put(session->mgmtpool.queue,
695                                             (void*)&mtask, sizeof(void*));
696                                         spin_unlock(&session->lock);
697                                 }
698                         }
699                         break;
700                 case ISCSI_OP_SCSI_TMFUNC_RSP:
701                         rc = iscsi_check_assign_cmdsn(session,
702                                                  (struct iscsi_nopin*)hdr);
703                         if (rc)
704                                 break;
705
706                         if (conn->in.datalen || conn->in.ahslen) {
707                                 rc = ISCSI_ERR_PROTO;
708                                 break;
709                         }
710                         conn->tmfrsp_pdus_cnt++;
711                         spin_lock(&session->lock);
712                         if (conn->tmabort_state == TMABORT_INITIAL) {
713                                 __kfifo_put(session->mgmtpool.queue,
714                                                 (void*)&mtask, sizeof(void*));
715                                 conn->tmabort_state =
716                                         ((struct iscsi_tm_rsp *)hdr)->
717                                         response == ISCSI_TMF_RSP_COMPLETE ?
718                                                 TMABORT_SUCCESS:TMABORT_FAILED;
719                                 /* unblock eh_abort() */
720                                 wake_up(&conn->ehwait);
721                         }
722                         spin_unlock(&session->lock);
723                         break;
724                 case ISCSI_OP_NOOP_IN:
725                         if (hdr->ttt != ISCSI_RESERVED_TAG) {
726                                 rc = ISCSI_ERR_PROTO;
727                                 break;
728                         }
729                         rc = iscsi_check_assign_cmdsn(session,
730                                                 (struct iscsi_nopin*)hdr);
731                         if (rc)
732                                 break;
733                         conn->exp_statsn = be32_to_cpu(hdr->statsn) + 1;
734
735                         if (!conn->in.datalen) {
736                                 struct iscsi_mgmt_task *mtask;
737
738                                 rc = iscsi_recv_pdu(conn->cls_conn, hdr,
739                                                     NULL, 0);
740                                 mtask = (struct iscsi_mgmt_task *)
741                                         session->mgmt_cmds[conn->in.itt -
742                                                         ISCSI_MGMT_ITT_OFFSET];
743                                 if (conn->login_mtask != mtask) {
744                                         spin_lock(&session->lock);
745                                         __kfifo_put(session->mgmtpool.queue,
746                                                   (void*)&mtask, sizeof(void*));
747                                         spin_unlock(&session->lock);
748                                 }
749                         }
750                         break;
751                 default:
752                         rc = ISCSI_ERR_BAD_OPCODE;
753                         break;
754                 }
755         } else if (conn->in.itt == ISCSI_RESERVED_TAG) {
756                 switch(conn->in.opcode) {
757                 case ISCSI_OP_NOOP_IN:
758                         if (!conn->in.datalen) {
759                                 rc = iscsi_check_assign_cmdsn(session,
760                                                  (struct iscsi_nopin*)hdr);
761                                 if (!rc && hdr->ttt != ISCSI_RESERVED_TAG)
762                                         rc = iscsi_recv_pdu(conn->cls_conn,
763                                                             hdr, NULL, 0);
764                         } else
765                                 rc = ISCSI_ERR_PROTO;
766                         break;
767                 case ISCSI_OP_REJECT:
768                         /* we need sth like iscsi_reject_rsp()*/
769                 case ISCSI_OP_ASYNC_EVENT:
770                         /* we need sth like iscsi_async_event_rsp() */
771                         rc = ISCSI_ERR_BAD_OPCODE;
772                         break;
773                 default:
774                         rc = ISCSI_ERR_BAD_OPCODE;
775                         break;
776                 }
777         } else
778                 rc = ISCSI_ERR_BAD_ITT;
779
780         return rc;
781 }
782
783 /**
784  * iscsi_ctask_copy - copy skb bits to the destanation cmd task
785  * @conn: iscsi connection
786  * @ctask: scsi command task
787  * @buf: buffer to copy to
788  * @buf_size: size of buffer
789  * @offset: offset within the buffer
790  *
791  * Notes:
792  *      The function calls skb_copy_bits() and updates per-connection and
793  *      per-cmd byte counters.
794  *
795  *      Read counters (in bytes):
796  *
797  *      conn->in.offset         offset within in progress SKB
798  *      conn->in.copy           left to copy from in progress SKB
799  *                              including padding
800  *      conn->in.copied         copied already from in progress SKB
801  *      conn->data_copied       copied already from in progress buffer
802  *      ctask->sent             total bytes sent up to the MidLayer
803  *      ctask->data_count       left to copy from in progress Data-In
804  *      buf_left                left to copy from in progress buffer
805  **/
806 static inline int
807 iscsi_ctask_copy(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask,
808                 void *buf, int buf_size, int offset)
809 {
810         int buf_left = buf_size - (conn->data_copied + offset);
811         int size = min(conn->in.copy, buf_left);
812         int rc;
813
814         size = min(size, ctask->data_count);
815
816         debug_tcp("ctask_copy %d bytes at offset %d copied %d\n",
817                size, conn->in.offset, conn->in.copied);
818
819         BUG_ON(size <= 0);
820         BUG_ON(ctask->sent + size > ctask->total_length);
821
822         rc = skb_copy_bits(conn->in.skb, conn->in.offset,
823                            (char*)buf + (offset + conn->data_copied), size);
824         /* must fit into skb->len */
825         BUG_ON(rc);
826
827         conn->in.offset += size;
828         conn->in.copy -= size;
829         conn->in.copied += size;
830         conn->data_copied += size;
831         ctask->sent += size;
832         ctask->data_count -= size;
833
834         BUG_ON(conn->in.copy < 0);
835         BUG_ON(ctask->data_count < 0);
836
837         if (buf_size != (conn->data_copied + offset)) {
838                 if (!ctask->data_count) {
839                         BUG_ON(buf_size - conn->data_copied < 0);
840                         /* done with this PDU */
841                         return buf_size - conn->data_copied;
842                 }
843                 return -EAGAIN;
844         }
845
846         /* done with this buffer or with both - PDU and buffer */
847         conn->data_copied = 0;
848         return 0;
849 }
850
851 /**
852  * iscsi_tcp_copy - copy skb bits to the destanation buffer
853  * @conn: iscsi connection
854  * @buf: buffer to copy to
855  * @buf_size: number of bytes to copy
856  *
857  * Notes:
858  *      The function calls skb_copy_bits() and updates per-connection
859  *      byte counters.
860  **/
861 static inline int
862 iscsi_tcp_copy(struct iscsi_conn *conn, void *buf, int buf_size)
863 {
864         int buf_left = buf_size - conn->data_copied;
865         int size = min(conn->in.copy, buf_left);
866         int rc;
867
868         debug_tcp("tcp_copy %d bytes at offset %d copied %d\n",
869                size, conn->in.offset, conn->data_copied);
870         BUG_ON(size <= 0);
871
872         rc = skb_copy_bits(conn->in.skb, conn->in.offset,
873                            (char*)buf + conn->data_copied, size);
874         BUG_ON(rc);
875
876         conn->in.offset += size;
877         conn->in.copy -= size;
878         conn->in.copied += size;
879         conn->data_copied += size;
880
881         if (buf_size != conn->data_copied)
882                 return -EAGAIN;
883
884         return 0;
885 }
886
887 static inline void
888 partial_sg_digest_update(struct iscsi_conn *conn, struct scatterlist *sg,
889                          int offset, int length)
890 {
891         struct scatterlist temp;
892
893         memcpy(&temp, sg, sizeof(struct scatterlist));
894         temp.offset = offset;
895         temp.length = length;
896         crypto_digest_update(conn->data_rx_tfm, &temp, 1);
897 }
898
899 static void
900 iscsi_recv_digest_update(struct iscsi_conn *conn, char* buf, int len)
901 {
902         struct scatterlist tmp;
903
904         sg_init_one(&tmp, buf, len);
905         crypto_digest_update(conn->data_rx_tfm, &tmp, 1);
906 }
907
908 static int iscsi_scsi_data_in(struct iscsi_conn *conn)
909 {
910         struct iscsi_cmd_task *ctask = conn->in.ctask;
911         struct scsi_cmnd *sc = ctask->sc;
912         struct scatterlist *sg;
913         int i, offset, rc = 0;
914
915         BUG_ON((void*)ctask != sc->SCp.ptr);
916
917         /*
918          * copying Data-In into the Scsi_Cmnd
919          */
920         if (!sc->use_sg) {
921                 i = ctask->data_count;
922                 rc = iscsi_ctask_copy(conn, ctask, sc->request_buffer,
923                                       sc->request_bufflen, ctask->data_offset);
924                 if (rc == -EAGAIN)
925                         return rc;
926                 if (conn->datadgst_en)
927                         iscsi_recv_digest_update(conn, sc->request_buffer, i);
928                 rc = 0;
929                 goto done;
930         }
931
932         offset = ctask->data_offset;
933         sg = sc->request_buffer;
934
935         if (ctask->data_offset)
936                 for (i = 0; i < ctask->sg_count; i++)
937                         offset -= sg[i].length;
938         /* we've passed through partial sg*/
939         if (offset < 0)
940                 offset = 0;
941
942         for (i = ctask->sg_count; i < sc->use_sg; i++) {
943                 char *dest;
944
945                 dest = kmap_atomic(sg[i].page, KM_SOFTIRQ0);
946                 rc = iscsi_ctask_copy(conn, ctask, dest + sg[i].offset,
947                                       sg[i].length, offset);
948                 kunmap_atomic(dest, KM_SOFTIRQ0);
949                 if (rc == -EAGAIN)
950                         /* continue with the next SKB/PDU */
951                         return rc;
952                 if (!rc) {
953                         if (conn->datadgst_en) {
954                                 if (!offset)
955                                         crypto_digest_update(conn->data_rx_tfm,
956                                                              &sg[i], 1);
957                                 else
958                                         partial_sg_digest_update(conn, &sg[i],
959                                                         sg[i].offset + offset,
960                                                         sg[i].length - offset);
961                         }
962                         offset = 0;
963                         ctask->sg_count++;
964                 }
965
966                 if (!ctask->data_count) {
967                         if (rc && conn->datadgst_en)
968                                 /*
969                                  * data-in is complete, but buffer not...
970                                  */
971                                 partial_sg_digest_update(conn, &sg[i],
972                                                 sg[i].offset, sg[i].length-rc);
973                         rc = 0;
974                         break;
975                 }
976
977                 if (!conn->in.copy)
978                         return -EAGAIN;
979         }
980         BUG_ON(ctask->data_count);
981
982 done:
983         /* check for non-exceptional status */
984         if (conn->in.flags & ISCSI_FLAG_DATA_STATUS) {
985                 debug_scsi("done [sc %lx res %d itt 0x%x]\n",
986                            (long)sc, sc->result, ctask->itt);
987                 conn->scsirsp_pdus_cnt++;
988                 iscsi_ctask_cleanup(conn, ctask);
989                 sc->scsi_done(sc);
990         }
991
992         return rc;
993 }
994
995 static int
996 iscsi_data_recv(struct iscsi_conn *conn)
997 {
998         struct iscsi_session *session = conn->session;
999         int rc = 0;
1000
1001         switch(conn->in.opcode) {
1002         case ISCSI_OP_SCSI_DATA_IN:
1003                 rc = iscsi_scsi_data_in(conn);
1004                 break;
1005         case ISCSI_OP_SCSI_CMD_RSP: {
1006                 /*
1007                  * SCSI Sense Data:
1008                  * copying the entire Data Segment.
1009                  */
1010                 if (iscsi_tcp_copy(conn, conn->data, conn->in.datalen)) {
1011                         rc = -EAGAIN;
1012                         goto exit;
1013                 }
1014
1015                 /*
1016                  * check for sense
1017                  */
1018                 conn->in.hdr = &conn->hdr;
1019                 conn->senselen = (conn->data[0] << 8) | conn->data[1];
1020                 rc = iscsi_cmd_rsp(conn, conn->in.ctask);
1021                 if (!rc && conn->datadgst_en)
1022                         iscsi_recv_digest_update(conn, conn->data,
1023                                                  conn->in.datalen);
1024         }
1025         break;
1026         case ISCSI_OP_TEXT_RSP:
1027         case ISCSI_OP_LOGIN_RSP:
1028         case ISCSI_OP_NOOP_IN: {
1029                 struct iscsi_mgmt_task *mtask = NULL;
1030
1031                 if (conn->in.itt != ISCSI_RESERVED_TAG)
1032                         mtask = (struct iscsi_mgmt_task *)
1033                                 session->mgmt_cmds[conn->in.itt -
1034                                         ISCSI_MGMT_ITT_OFFSET];
1035
1036                 /*
1037                  * Collect data segment to the connection's data
1038                  * placeholder
1039                  */
1040                 if (iscsi_tcp_copy(conn, conn->data, conn->in.datalen)) {
1041                         rc = -EAGAIN;
1042                         goto exit;
1043                 }
1044
1045                 rc = iscsi_recv_pdu(conn->cls_conn, conn->in.hdr,
1046                                     conn->data, conn->in.datalen);
1047
1048                 if (!rc && conn->datadgst_en &&
1049                         conn->in.opcode != ISCSI_OP_LOGIN_RSP)
1050                         iscsi_recv_digest_update(conn, conn->data,
1051                                                 conn->in.datalen);
1052
1053                 if (mtask && conn->login_mtask != mtask) {
1054                         spin_lock(&session->lock);
1055                         __kfifo_put(session->mgmtpool.queue, (void*)&mtask,
1056                                     sizeof(void*));
1057                         spin_unlock(&session->lock);
1058                 }
1059         }
1060         break;
1061         case ISCSI_OP_ASYNC_EVENT:
1062         case ISCSI_OP_REJECT:
1063         default:
1064                 BUG_ON(1);
1065         }
1066 exit:
1067         return rc;
1068 }
1069
1070 /**
1071  * iscsi_tcp_data_recv - TCP receive in sendfile fashion
1072  * @rd_desc: read descriptor
1073  * @skb: socket buffer
1074  * @offset: offset in skb
1075  * @len: skb->len - offset
1076  **/
1077 static int
1078 iscsi_tcp_data_recv(read_descriptor_t *rd_desc, struct sk_buff *skb,
1079                 unsigned int offset, size_t len)
1080 {
1081         int rc;
1082         struct iscsi_conn *conn = rd_desc->arg.data;
1083         int processed;
1084         char pad[ISCSI_PAD_LEN];
1085         struct scatterlist sg;
1086
1087         /*
1088          * Save current SKB and its offset in the corresponding
1089          * connection context.
1090          */
1091         conn->in.copy = skb->len - offset;
1092         conn->in.offset = offset;
1093         conn->in.skb = skb;
1094         conn->in.len = conn->in.copy;
1095         BUG_ON(conn->in.copy <= 0);
1096         debug_tcp("in %d bytes\n", conn->in.copy);
1097
1098 more:
1099         conn->in.copied = 0;
1100         rc = 0;
1101
1102         if (unlikely(conn->suspend_rx)) {
1103                 debug_tcp("conn %d Rx suspended!\n", conn->id);
1104                 return 0;
1105         }
1106
1107         if (conn->in_progress == IN_PROGRESS_WAIT_HEADER ||
1108             conn->in_progress == IN_PROGRESS_HEADER_GATHER) {
1109                 rc = iscsi_hdr_extract(conn);
1110                 if (rc) {
1111                        if (rc == -EAGAIN)
1112                                 goto nomore;
1113                        else {
1114                                 iscsi_conn_failure(conn, rc);
1115                                 return 0;
1116                        }
1117                 }
1118
1119                 /*
1120                  * Verify and process incoming PDU header.
1121                  */
1122                 rc = iscsi_hdr_recv(conn);
1123                 if (!rc && conn->in.datalen) {
1124                         if (conn->datadgst_en) {
1125                                 BUG_ON(!conn->data_rx_tfm);
1126                                 crypto_digest_init(conn->data_rx_tfm);
1127                         }
1128                         conn->in_progress = IN_PROGRESS_DATA_RECV;
1129                 } else if (rc) {
1130                         iscsi_conn_failure(conn, rc);
1131                         return 0;
1132                 }
1133         }
1134
1135         if (conn->in_progress == IN_PROGRESS_DDIGEST_RECV) {
1136                 uint32_t recv_digest;
1137                 debug_tcp("extra data_recv offset %d copy %d\n",
1138                           conn->in.offset, conn->in.copy);
1139                 skb_copy_bits(conn->in.skb, conn->in.offset,
1140                                 &recv_digest, 4);
1141                 conn->in.offset += 4;
1142                 conn->in.copy -= 4;
1143                 if (recv_digest != conn->in.datadgst) {
1144                         debug_tcp("iscsi_tcp: data digest error!"
1145                                   "0x%x != 0x%x\n", recv_digest,
1146                                   conn->in.datadgst);
1147                         iscsi_conn_failure(conn, ISCSI_ERR_DATA_DGST);
1148                         return 0;
1149                 } else {
1150                         debug_tcp("iscsi_tcp: data digest match!"
1151                                   "0x%x == 0x%x\n", recv_digest,
1152                                   conn->in.datadgst);
1153                         conn->in_progress = IN_PROGRESS_WAIT_HEADER;
1154                 }
1155         }
1156
1157         if (conn->in_progress == IN_PROGRESS_DATA_RECV && conn->in.copy) {
1158
1159                 debug_tcp("data_recv offset %d copy %d\n",
1160                        conn->in.offset, conn->in.copy);
1161
1162                 rc = iscsi_data_recv(conn);
1163                 if (rc) {
1164                         if (rc == -EAGAIN) {
1165                                 rd_desc->count = conn->in.datalen -
1166                                                 conn->in.ctask->data_count;
1167                                 goto again;
1168                         }
1169                         iscsi_conn_failure(conn, rc);
1170                         return 0;
1171                 }
1172                 conn->in.copy -= conn->in.padding;
1173                 conn->in.offset += conn->in.padding;
1174                 if (conn->datadgst_en) {
1175                         if (conn->in.padding) {
1176                                 debug_tcp("padding -> %d\n", conn->in.padding);
1177                                 memset(pad, 0, conn->in.padding);
1178                                 sg_init_one(&sg, pad, conn->in.padding);
1179                                 crypto_digest_update(conn->data_rx_tfm, &sg, 1);
1180                         }
1181                         crypto_digest_final(conn->data_rx_tfm,
1182                                             (u8 *) & conn->in.datadgst);
1183                         debug_tcp("rx digest 0x%x\n", conn->in.datadgst);
1184                         conn->in_progress = IN_PROGRESS_DDIGEST_RECV;
1185                 } else
1186                         conn->in_progress = IN_PROGRESS_WAIT_HEADER;
1187         }
1188
1189         debug_tcp("f, processed %d from out of %d padding %d\n",
1190                conn->in.offset - offset, (int)len, conn->in.padding);
1191         BUG_ON(conn->in.offset - offset > len);
1192
1193         if (conn->in.offset - offset != len) {
1194                 debug_tcp("continue to process %d bytes\n",
1195                        (int)len - (conn->in.offset - offset));
1196                 goto more;
1197         }
1198
1199 nomore:
1200         processed = conn->in.offset - offset;
1201         BUG_ON(processed == 0);
1202         return processed;
1203
1204 again:
1205         processed = conn->in.offset - offset;
1206         debug_tcp("c, processed %d from out of %d rd_desc_cnt %d\n",
1207                   processed, (int)len, (int)rd_desc->count);
1208         BUG_ON(processed == 0);
1209         BUG_ON(processed > len);
1210
1211         conn->rxdata_octets += processed;
1212         return processed;
1213 }
1214
1215 static void
1216 iscsi_tcp_data_ready(struct sock *sk, int flag)
1217 {
1218         struct iscsi_conn *conn = sk->sk_user_data;
1219         read_descriptor_t rd_desc;
1220
1221         read_lock(&sk->sk_callback_lock);
1222
1223         /* use rd_desc to pass 'conn' to iscsi_tcp_data_recv */
1224         rd_desc.arg.data = conn;
1225         rd_desc.count = 0;
1226         tcp_read_sock(sk, &rd_desc, iscsi_tcp_data_recv);
1227
1228         read_unlock(&sk->sk_callback_lock);
1229 }
1230
1231 static void
1232 iscsi_tcp_state_change(struct sock *sk)
1233 {
1234         struct iscsi_conn *conn;
1235         struct iscsi_session *session;
1236         void (*old_state_change)(struct sock *);
1237
1238         read_lock(&sk->sk_callback_lock);
1239
1240         conn = (struct iscsi_conn*)sk->sk_user_data;
1241         session = conn->session;
1242
1243         if ((sk->sk_state == TCP_CLOSE_WAIT ||
1244              sk->sk_state == TCP_CLOSE) &&
1245             !atomic_read(&sk->sk_rmem_alloc)) {
1246                 debug_tcp("iscsi_tcp_state_change: TCP_CLOSE|TCP_CLOSE_WAIT\n");
1247                 iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);
1248         }
1249
1250         old_state_change = conn->old_state_change;
1251
1252         read_unlock(&sk->sk_callback_lock);
1253
1254         old_state_change(sk);
1255 }
1256
1257 /**
1258  * iscsi_write_space - Called when more output buffer space is available
1259  * @sk: socket space is available for
1260  **/
1261 static void
1262 iscsi_write_space(struct sock *sk)
1263 {
1264         struct iscsi_conn *conn = (struct iscsi_conn*)sk->sk_user_data;
1265         conn->old_write_space(sk);
1266         debug_tcp("iscsi_write_space: cid %d\n", conn->id);
1267         clear_bit(SUSPEND_BIT, &conn->suspend_tx);
1268         scsi_queue_work(conn->session->host, &conn->xmitwork);
1269 }
1270
1271 static void
1272 iscsi_conn_set_callbacks(struct iscsi_conn *conn)
1273 {
1274         struct sock *sk = conn->sock->sk;
1275
1276         /* assign new callbacks */
1277         write_lock_bh(&sk->sk_callback_lock);
1278         sk->sk_user_data = conn;
1279         conn->old_data_ready = sk->sk_data_ready;
1280         conn->old_state_change = sk->sk_state_change;
1281         conn->old_write_space = sk->sk_write_space;
1282         sk->sk_data_ready = iscsi_tcp_data_ready;
1283         sk->sk_state_change = iscsi_tcp_state_change;
1284         sk->sk_write_space = iscsi_write_space;
1285         write_unlock_bh(&sk->sk_callback_lock);
1286 }
1287
1288 static void
1289 iscsi_conn_restore_callbacks(struct iscsi_conn *conn)
1290 {
1291         struct sock *sk = conn->sock->sk;
1292
1293         /* restore socket callbacks, see also: iscsi_conn_set_callbacks() */
1294         write_lock_bh(&sk->sk_callback_lock);
1295         sk->sk_user_data    = NULL;
1296         sk->sk_data_ready   = conn->old_data_ready;
1297         sk->sk_state_change = conn->old_state_change;
1298         sk->sk_write_space  = conn->old_write_space;
1299         sk->sk_no_check  = 0;
1300         write_unlock_bh(&sk->sk_callback_lock);
1301 }
1302
1303 /**
1304  * iscsi_send - generic send routine
1305  * @sk: kernel's socket
1306  * @buf: buffer to write from
1307  * @size: actual size to write
1308  * @flags: socket's flags
1309  */
1310 static inline int
1311 iscsi_send(struct iscsi_conn *conn, struct iscsi_buf *buf, int size, int flags)
1312 {
1313         struct socket *sk = conn->sock;
1314         int offset = buf->sg.offset + buf->sent;
1315
1316         /*
1317          * if we got use_sg=0 or are sending something we kmallocd
1318          * then we did not have to do kmap (kmap returns page_address)
1319          *
1320          * if we got use_sg > 0, but had to drop down, we do not
1321          * set clustering so this should only happen for that
1322          * slab case.
1323          */
1324         if (buf->use_sendmsg)
1325                 return sock_no_sendpage(sk, buf->sg.page, offset, size, flags);
1326         else
1327                 return conn->sendpage(sk, buf->sg.page, offset, size, flags);
1328 }
1329
1330 /**
1331  * iscsi_sendhdr - send PDU Header via tcp_sendpage()
1332  * @conn: iscsi connection
1333  * @buf: buffer to write from
1334  * @datalen: lenght of data to be sent after the header
1335  *
1336  * Notes:
1337  *      (Tx, Fast Path)
1338  **/
1339 static inline int
1340 iscsi_sendhdr(struct iscsi_conn *conn, struct iscsi_buf *buf, int datalen)
1341 {
1342         int flags = 0; /* MSG_DONTWAIT; */
1343         int res, size;
1344
1345         size = buf->sg.length - buf->sent;
1346         BUG_ON(buf->sent + size > buf->sg.length);
1347         if (buf->sent + size != buf->sg.length || datalen)
1348                 flags |= MSG_MORE;
1349
1350         res = iscsi_send(conn, buf, size, flags);
1351         debug_tcp("sendhdr %d bytes, sent %d res %d\n", size, buf->sent, res);
1352         if (res >= 0) {
1353                 conn->txdata_octets += res;
1354                 buf->sent += res;
1355                 if (size != res)
1356                         return -EAGAIN;
1357                 return 0;
1358         } else if (res == -EAGAIN) {
1359                 conn->sendpage_failures_cnt++;
1360                 set_bit(SUSPEND_BIT, &conn->suspend_tx);
1361         } else if (res == -EPIPE)
1362                 iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);
1363
1364         return res;
1365 }
1366
1367 /**
1368  * iscsi_sendpage - send one page of iSCSI Data-Out.
1369  * @conn: iscsi connection
1370  * @buf: buffer to write from
1371  * @count: remaining data
1372  * @sent: number of bytes sent
1373  *
1374  * Notes:
1375  *      (Tx, Fast Path)
1376  **/
1377 static inline int
1378 iscsi_sendpage(struct iscsi_conn *conn, struct iscsi_buf *buf,
1379                int *count, int *sent)
1380 {
1381         int flags = 0; /* MSG_DONTWAIT; */
1382         int res, size;
1383
1384         size = buf->sg.length - buf->sent;
1385         BUG_ON(buf->sent + size > buf->sg.length);
1386         if (size > *count)
1387                 size = *count;
1388         if (buf->sent + size != buf->sg.length || *count != size)
1389                 flags |= MSG_MORE;
1390
1391         res = iscsi_send(conn, buf, size, flags);
1392         debug_tcp("sendpage: %d bytes, sent %d left %d sent %d res %d\n",
1393                   size, buf->sent, *count, *sent, res);
1394         if (res >= 0) {
1395                 conn->txdata_octets += res;
1396                 buf->sent += res;
1397                 *count -= res;
1398                 *sent += res;
1399                 if (size != res)
1400                         return -EAGAIN;
1401                 return 0;
1402         } else if (res == -EAGAIN) {
1403                 conn->sendpage_failures_cnt++;
1404                 set_bit(SUSPEND_BIT, &conn->suspend_tx);
1405         } else if (res == -EPIPE)
1406                 iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);
1407
1408         return res;
1409 }
1410
1411 static inline void
1412 iscsi_data_digest_init(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
1413 {
1414         BUG_ON(!conn->data_tx_tfm);
1415         crypto_digest_init(conn->data_tx_tfm);
1416         ctask->digest_count = 4;
1417 }
1418
1419 static int
1420 iscsi_digest_final_send(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask,
1421                         struct iscsi_buf *buf, uint32_t *digest, int final)
1422 {
1423         int rc = 0;
1424         int sent = 0;
1425
1426         if (final)
1427                 crypto_digest_final(conn->data_tx_tfm, (u8*)digest);
1428
1429         iscsi_buf_init_virt(buf, (char*)digest, 4);
1430         rc = iscsi_sendpage(conn, buf, &ctask->digest_count, &sent);
1431         if (rc) {
1432                 ctask->datadigest = *digest;
1433                 ctask->xmstate |= XMSTATE_DATA_DIGEST;
1434         } else
1435                 ctask->digest_count = 4;
1436         return rc;
1437 }
1438
1439 /**
1440  * iscsi_solicit_data_cont - initialize next Data-Out
1441  * @conn: iscsi connection
1442  * @ctask: scsi command task
1443  * @r2t: R2T info
1444  * @left: bytes left to transfer
1445  *
1446  * Notes:
1447  *      Initialize next Data-Out within this R2T sequence and continue
1448  *      to process next Scatter-Gather element(if any) of this SCSI command.
1449  *
1450  *      Called under connection lock.
1451  **/
1452 static void
1453 iscsi_solicit_data_cont(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask,
1454                         struct iscsi_r2t_info *r2t, int left)
1455 {
1456         struct iscsi_data *hdr;
1457         struct iscsi_data_task *dtask;
1458         struct scsi_cmnd *sc = ctask->sc;
1459         int new_offset;
1460
1461         dtask = mempool_alloc(ctask->datapool, GFP_ATOMIC);
1462         BUG_ON(!dtask);
1463         hdr = &dtask->hdr;
1464         memset(hdr, 0, sizeof(struct iscsi_data));
1465         hdr->ttt = r2t->ttt;
1466         hdr->datasn = cpu_to_be32(r2t->solicit_datasn);
1467         r2t->solicit_datasn++;
1468         hdr->opcode = ISCSI_OP_SCSI_DATA_OUT;
1469         memcpy(hdr->lun, ctask->hdr.lun, sizeof(hdr->lun));
1470         hdr->itt = ctask->hdr.itt;
1471         hdr->exp_statsn = r2t->exp_statsn;
1472         new_offset = r2t->data_offset + r2t->sent;
1473         hdr->offset = cpu_to_be32(new_offset);
1474         if (left > conn->max_xmit_dlength) {
1475                 hton24(hdr->dlength, conn->max_xmit_dlength);
1476                 r2t->data_count = conn->max_xmit_dlength;
1477         } else {
1478                 hton24(hdr->dlength, left);
1479                 r2t->data_count = left;
1480                 hdr->flags = ISCSI_FLAG_CMD_FINAL;
1481         }
1482         conn->dataout_pdus_cnt++;
1483
1484         iscsi_buf_init_virt(&r2t->headbuf, (char*)hdr,
1485                            sizeof(struct iscsi_hdr));
1486
1487         r2t->dtask = dtask;
1488
1489         if (sc->use_sg && !iscsi_buf_left(&r2t->sendbuf)) {
1490                 BUG_ON(ctask->bad_sg == r2t->sg);
1491                 iscsi_buf_init_sg(&r2t->sendbuf, r2t->sg);
1492                 r2t->sg += 1;
1493         } else
1494                 iscsi_buf_init_iov(&ctask->sendbuf,
1495                             (char*)sc->request_buffer + new_offset,
1496                             r2t->data_count);
1497
1498         list_add(&dtask->item, &ctask->dataqueue);
1499 }
1500
1501 static void
1502 iscsi_unsolicit_data_init(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
1503 {
1504         struct iscsi_data *hdr;
1505         struct iscsi_data_task *dtask;
1506
1507         dtask = mempool_alloc(ctask->datapool, GFP_ATOMIC);
1508         BUG_ON(!dtask);
1509         hdr = &dtask->hdr;
1510         memset(hdr, 0, sizeof(struct iscsi_data));
1511         hdr->ttt = cpu_to_be32(ISCSI_RESERVED_TAG);
1512         hdr->datasn = cpu_to_be32(ctask->unsol_datasn);
1513         ctask->unsol_datasn++;
1514         hdr->opcode = ISCSI_OP_SCSI_DATA_OUT;
1515         memcpy(hdr->lun, ctask->hdr.lun, sizeof(hdr->lun));
1516         hdr->itt = ctask->hdr.itt;
1517         hdr->exp_statsn = cpu_to_be32(conn->exp_statsn);
1518         hdr->offset = cpu_to_be32(ctask->total_length -
1519                                   ctask->r2t_data_count -
1520                                   ctask->unsol_count);
1521         if (ctask->unsol_count > conn->max_xmit_dlength) {
1522                 hton24(hdr->dlength, conn->max_xmit_dlength);
1523                 ctask->data_count = conn->max_xmit_dlength;
1524                 hdr->flags = 0;
1525         } else {
1526                 hton24(hdr->dlength, ctask->unsol_count);
1527                 ctask->data_count = ctask->unsol_count;
1528                 hdr->flags = ISCSI_FLAG_CMD_FINAL;
1529         }
1530
1531         iscsi_buf_init_virt(&ctask->headbuf, (char*)hdr,
1532                            sizeof(struct iscsi_hdr));
1533
1534         list_add(&dtask->item, &ctask->dataqueue);
1535
1536         ctask->dtask = dtask;
1537 }
1538
1539 /**
1540  * iscsi_cmd_init - Initialize iSCSI SCSI_READ or SCSI_WRITE commands
1541  * @conn: iscsi connection
1542  * @ctask: scsi command task
1543  * @sc: scsi command
1544  **/
1545 static void
1546 iscsi_cmd_init(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask,
1547                 struct scsi_cmnd *sc)
1548 {
1549         struct iscsi_session *session = conn->session;
1550
1551         BUG_ON(__kfifo_len(ctask->r2tqueue));
1552
1553         ctask->sc = sc;
1554         ctask->conn = conn;
1555         ctask->hdr.opcode = ISCSI_OP_SCSI_CMD;
1556         ctask->hdr.flags = ISCSI_ATTR_SIMPLE;
1557         int_to_scsilun(sc->device->lun, (struct scsi_lun *)ctask->hdr.lun);
1558         ctask->hdr.itt = ctask->itt | (conn->id << CID_SHIFT) |
1559                          (session->age << AGE_SHIFT);
1560         ctask->hdr.data_length = cpu_to_be32(sc->request_bufflen);
1561         ctask->hdr.cmdsn = cpu_to_be32(session->cmdsn); session->cmdsn++;
1562         ctask->hdr.exp_statsn = cpu_to_be32(conn->exp_statsn);
1563         memcpy(ctask->hdr.cdb, sc->cmnd, sc->cmd_len);
1564         memset(&ctask->hdr.cdb[sc->cmd_len], 0, MAX_COMMAND_SIZE - sc->cmd_len);
1565
1566         ctask->mtask = NULL;
1567         ctask->sent = 0;
1568         ctask->sg_count = 0;
1569
1570         ctask->total_length = sc->request_bufflen;
1571
1572         if (sc->sc_data_direction == DMA_TO_DEVICE) {
1573                 ctask->exp_r2tsn = 0;
1574                 ctask->hdr.flags |= ISCSI_FLAG_CMD_WRITE;
1575                 BUG_ON(ctask->total_length == 0);
1576                 if (sc->use_sg) {
1577                         struct scatterlist *sg = sc->request_buffer;
1578
1579                         iscsi_buf_init_sg(&ctask->sendbuf,
1580                                           &sg[ctask->sg_count++]);
1581                         ctask->sg = sg;
1582                         ctask->bad_sg = sg + sc->use_sg;
1583                 } else {
1584                         iscsi_buf_init_iov(&ctask->sendbuf, sc->request_buffer,
1585                                         sc->request_bufflen);
1586                 }
1587
1588                 /*
1589                  * Write counters:
1590                  *
1591                  *      imm_count       bytes to be sent right after
1592                  *                      SCSI PDU Header
1593                  *
1594                  *      unsol_count     bytes(as Data-Out) to be sent
1595                  *                      without R2T ack right after
1596                  *                      immediate data
1597                  *
1598                  *      r2t_data_count  bytes to be sent via R2T ack's
1599                  *
1600                  *      pad_count       bytes to be sent as zero-padding
1601                  */
1602                 ctask->imm_count = 0;
1603                 ctask->unsol_count = 0;
1604                 ctask->unsol_datasn = 0;
1605                 ctask->xmstate = XMSTATE_W_HDR;
1606                 /* calculate write padding */
1607                 ctask->pad_count = ctask->total_length & (ISCSI_PAD_LEN-1);
1608                 if (ctask->pad_count) {
1609                         ctask->pad_count = ISCSI_PAD_LEN - ctask->pad_count;
1610                         debug_scsi("write padding %d bytes\n",
1611                                 ctask->pad_count);
1612                         ctask->xmstate |= XMSTATE_W_PAD;
1613                 }
1614                 if (session->imm_data_en) {
1615                         if (ctask->total_length >= session->first_burst)
1616                                 ctask->imm_count = min(session->first_burst,
1617                                                         conn->max_xmit_dlength);
1618                         else
1619                                 ctask->imm_count = min(ctask->total_length,
1620                                                         conn->max_xmit_dlength);
1621                         hton24(ctask->hdr.dlength, ctask->imm_count);
1622                         ctask->xmstate |= XMSTATE_IMM_DATA;
1623                 } else
1624                         zero_data(ctask->hdr.dlength);
1625
1626                 if (!session->initial_r2t_en)
1627                         ctask->unsol_count = min(session->first_burst,
1628                                 ctask->total_length) - ctask->imm_count;
1629                 if (!ctask->unsol_count)
1630                         /* No unsolicit Data-Out's */
1631                         ctask->hdr.flags |= ISCSI_FLAG_CMD_FINAL;
1632                 else
1633                         ctask->xmstate |= XMSTATE_UNS_HDR | XMSTATE_UNS_INIT;
1634
1635                 ctask->r2t_data_count = ctask->total_length -
1636                                     ctask->imm_count -
1637                                     ctask->unsol_count;
1638
1639                 debug_scsi("cmd [itt %x total %d imm %d imm_data %d "
1640                            "r2t_data %d]\n",
1641                            ctask->itt, ctask->total_length, ctask->imm_count,
1642                            ctask->unsol_count, ctask->r2t_data_count);
1643         } else {
1644                 ctask->hdr.flags |= ISCSI_FLAG_CMD_FINAL;
1645                 if (sc->sc_data_direction == DMA_FROM_DEVICE)
1646                         ctask->hdr.flags |= ISCSI_FLAG_CMD_READ;
1647                 ctask->datasn = 0;
1648                 ctask->xmstate = XMSTATE_R_HDR;
1649                 zero_data(ctask->hdr.dlength);
1650         }
1651
1652         iscsi_buf_init_virt(&ctask->headbuf, (char*)&ctask->hdr,
1653                             sizeof(struct iscsi_hdr));
1654         conn->scsicmd_pdus_cnt++;
1655 }
1656
1657 /**
1658  * iscsi_mtask_xmit - xmit management(immediate) task
1659  * @conn: iscsi connection
1660  * @mtask: task management task
1661  *
1662  * Notes:
1663  *      The function can return -EAGAIN in which case caller must
1664  *      call it again later, or recover. '0' return code means successful
1665  *      xmit.
1666  *
1667  *      Management xmit state machine consists of two states:
1668  *              IN_PROGRESS_IMM_HEAD - PDU Header xmit in progress
1669  *              IN_PROGRESS_IMM_DATA - PDU Data xmit in progress
1670  **/
1671 static int
1672 iscsi_mtask_xmit(struct iscsi_conn *conn, struct iscsi_mgmt_task *mtask)
1673 {
1674
1675         debug_scsi("mtask deq [cid %d state %x itt 0x%x]\n",
1676                 conn->id, mtask->xmstate, mtask->itt);
1677
1678         if (mtask->xmstate & XMSTATE_IMM_HDR) {
1679                 mtask->xmstate &= ~XMSTATE_IMM_HDR;
1680                 if (mtask->data_count)
1681                         mtask->xmstate |= XMSTATE_IMM_DATA;
1682                 if (conn->c_stage != ISCSI_CONN_INITIAL_STAGE &&
1683                     conn->stop_stage != STOP_CONN_RECOVER &&
1684                     conn->hdrdgst_en)
1685                         iscsi_hdr_digest(conn, &mtask->headbuf,
1686                                         (u8*)mtask->hdrext);
1687                 if (iscsi_sendhdr(conn, &mtask->headbuf, mtask->data_count)) {
1688                         mtask->xmstate |= XMSTATE_IMM_HDR;
1689                         if (mtask->data_count)
1690                                 mtask->xmstate &= ~XMSTATE_IMM_DATA;
1691                         return -EAGAIN;
1692                 }
1693         }
1694
1695         if (mtask->xmstate & XMSTATE_IMM_DATA) {
1696                 BUG_ON(!mtask->data_count);
1697                 mtask->xmstate &= ~XMSTATE_IMM_DATA;
1698                 /* FIXME: implement.
1699                  * Virtual buffer could be spreaded across multiple pages...
1700                  */
1701                 do {
1702                         if (iscsi_sendpage(conn, &mtask->sendbuf,
1703                                    &mtask->data_count, &mtask->sent)) {
1704                                 mtask->xmstate |= XMSTATE_IMM_DATA;
1705                                 return -EAGAIN;
1706                         }
1707                 } while (mtask->data_count);
1708         }
1709
1710         BUG_ON(mtask->xmstate != XMSTATE_IDLE);
1711         return 0;
1712 }
1713
1714 static inline int
1715 handle_xmstate_r_hdr(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
1716 {
1717         ctask->xmstate &= ~XMSTATE_R_HDR;
1718         if (conn->hdrdgst_en)
1719                 iscsi_hdr_digest(conn, &ctask->headbuf, (u8*)ctask->hdrext);
1720         if (!iscsi_sendhdr(conn, &ctask->headbuf, 0)) {
1721                 BUG_ON(ctask->xmstate != XMSTATE_IDLE);
1722                 return 0; /* wait for Data-In */
1723         }
1724         ctask->xmstate |= XMSTATE_R_HDR;
1725         return -EAGAIN;
1726 }
1727
1728 static inline int
1729 handle_xmstate_w_hdr(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
1730 {
1731         ctask->xmstate &= ~XMSTATE_W_HDR;
1732         if (conn->hdrdgst_en)
1733                 iscsi_hdr_digest(conn, &ctask->headbuf, (u8*)ctask->hdrext);
1734         if (iscsi_sendhdr(conn, &ctask->headbuf, ctask->imm_count)) {
1735                 ctask->xmstate |= XMSTATE_W_HDR;
1736                 return -EAGAIN;
1737         }
1738         return 0;
1739 }
1740
1741 static inline int
1742 handle_xmstate_data_digest(struct iscsi_conn *conn,
1743                            struct iscsi_cmd_task *ctask)
1744 {
1745         ctask->xmstate &= ~XMSTATE_DATA_DIGEST;
1746         debug_tcp("resent data digest 0x%x\n", ctask->datadigest);
1747         if (iscsi_digest_final_send(conn, ctask, &ctask->immbuf,
1748                                     &ctask->datadigest, 0)) {
1749                 ctask->xmstate |= XMSTATE_DATA_DIGEST;
1750                 debug_tcp("resent data digest 0x%x fail!\n",
1751                           ctask->datadigest);
1752                 return -EAGAIN;
1753         }
1754         return 0;
1755 }
1756
1757 static inline int
1758 handle_xmstate_imm_data(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
1759 {
1760         BUG_ON(!ctask->imm_count);
1761         ctask->xmstate &= ~XMSTATE_IMM_DATA;
1762
1763         if (conn->datadgst_en) {
1764                 iscsi_data_digest_init(conn, ctask);
1765                 ctask->immdigest = 0;
1766         }
1767
1768         for (;;) {
1769                 if (iscsi_sendpage(conn, &ctask->sendbuf, &ctask->imm_count,
1770                                    &ctask->sent)) {
1771                         ctask->xmstate |= XMSTATE_IMM_DATA;
1772                         if (conn->datadgst_en) {
1773                                 crypto_digest_final(conn->data_tx_tfm,
1774                                                 (u8*)&ctask->immdigest);
1775                                 debug_tcp("tx imm sendpage fail 0x%x\n",
1776                                           ctask->datadigest);
1777                         }
1778                         return -EAGAIN;
1779                 }
1780                 if (conn->datadgst_en)
1781                         crypto_digest_update(conn->data_tx_tfm,
1782                                              &ctask->sendbuf.sg, 1);
1783
1784                 if (!ctask->imm_count)
1785                         break;
1786                 iscsi_buf_init_sg(&ctask->sendbuf,
1787                                   &ctask->sg[ctask->sg_count++]);
1788         }
1789
1790         if (conn->datadgst_en && !(ctask->xmstate & XMSTATE_W_PAD)) {
1791                 if (iscsi_digest_final_send(conn, ctask, &ctask->immbuf,
1792                                             &ctask->immdigest, 1)) {
1793                         debug_tcp("sending imm digest 0x%x fail!\n",
1794                                   ctask->immdigest);
1795                         return -EAGAIN;
1796                 }
1797                 debug_tcp("sending imm digest 0x%x\n", ctask->immdigest);
1798         }
1799
1800         return 0;
1801 }
1802
1803 static inline int
1804 handle_xmstate_uns_hdr(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
1805 {
1806         struct iscsi_data_task *dtask;
1807
1808         ctask->xmstate |= XMSTATE_UNS_DATA;
1809         if (ctask->xmstate & XMSTATE_UNS_INIT) {
1810                 iscsi_unsolicit_data_init(conn, ctask);
1811                 BUG_ON(!ctask->dtask);
1812                 dtask = ctask->dtask;
1813                 if (conn->hdrdgst_en)
1814                         iscsi_hdr_digest(conn, &ctask->headbuf,
1815                                         (u8*)dtask->hdrext);
1816                 ctask->xmstate &= ~XMSTATE_UNS_INIT;
1817         }
1818         if (iscsi_sendhdr(conn, &ctask->headbuf, ctask->data_count)) {
1819                 ctask->xmstate &= ~XMSTATE_UNS_DATA;
1820                 ctask->xmstate |= XMSTATE_UNS_HDR;
1821                 return -EAGAIN;
1822         }
1823
1824         debug_scsi("uns dout [itt 0x%x dlen %d sent %d]\n",
1825                    ctask->itt, ctask->unsol_count, ctask->sent);
1826         return 0;
1827 }
1828
1829 static inline int
1830 handle_xmstate_uns_data(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
1831 {
1832         struct iscsi_data_task *dtask = ctask->dtask;
1833
1834         BUG_ON(!ctask->data_count);
1835         ctask->xmstate &= ~XMSTATE_UNS_DATA;
1836
1837         if (conn->datadgst_en) {
1838                 iscsi_data_digest_init(conn, ctask);
1839                 dtask->digest = 0;
1840         }
1841
1842         for (;;) {
1843                 int start = ctask->sent;
1844
1845                 if (iscsi_sendpage(conn, &ctask->sendbuf, &ctask->data_count,
1846                                    &ctask->sent)) {
1847                         ctask->unsol_count -= ctask->sent - start;
1848                         ctask->xmstate |= XMSTATE_UNS_DATA;
1849                         /* will continue with this ctask later.. */
1850                         if (conn->datadgst_en) {
1851                                 crypto_digest_final(conn->data_tx_tfm,
1852                                                 (u8 *)&dtask->digest);
1853                                 debug_tcp("tx uns data fail 0x%x\n",
1854                                           dtask->digest);
1855                         }
1856                         return -EAGAIN;
1857                 }
1858
1859                 BUG_ON(ctask->sent > ctask->total_length);
1860                 ctask->unsol_count -= ctask->sent - start;
1861
1862                 /*
1863                  * XXX:we may run here with un-initial sendbuf.
1864                  * so pass it
1865                  */
1866                 if (conn->datadgst_en && ctask->sent - start > 0)
1867                         crypto_digest_update(conn->data_tx_tfm,
1868                                              &ctask->sendbuf.sg, 1);
1869
1870                 if (!ctask->data_count)
1871                         break;
1872                 iscsi_buf_init_sg(&ctask->sendbuf,
1873                                   &ctask->sg[ctask->sg_count++]);
1874         }
1875         BUG_ON(ctask->unsol_count < 0);
1876
1877         /*
1878          * Done with the Data-Out. Next, check if we need
1879          * to send another unsolicited Data-Out.
1880          */
1881         if (ctask->unsol_count) {
1882                 if (conn->datadgst_en) {
1883                         if (iscsi_digest_final_send(conn, ctask,
1884                                                     &dtask->digestbuf,
1885                                                     &dtask->digest, 1)) {
1886                                 debug_tcp("send uns digest 0x%x fail\n",
1887                                           dtask->digest);
1888                                 return -EAGAIN;
1889                         }
1890                         debug_tcp("sending uns digest 0x%x, more uns\n",
1891                                   dtask->digest);
1892                 }
1893                 ctask->xmstate |= XMSTATE_UNS_INIT;
1894                 return 1;
1895         }
1896
1897         if (conn->datadgst_en && !(ctask->xmstate & XMSTATE_W_PAD)) {
1898                 if (iscsi_digest_final_send(conn, ctask,
1899                                             &dtask->digestbuf,
1900                                             &dtask->digest, 1)) {
1901                         debug_tcp("send last uns digest 0x%x fail\n",
1902                                    dtask->digest);
1903                         return -EAGAIN;
1904                 }
1905                 debug_tcp("sending uns digest 0x%x\n",dtask->digest);
1906         }
1907
1908         return 0;
1909 }
1910
1911 static inline int
1912 handle_xmstate_sol_data(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
1913 {
1914         struct iscsi_session *session = conn->session;
1915         struct iscsi_r2t_info *r2t = ctask->r2t;
1916         struct iscsi_data_task *dtask = r2t->dtask;
1917         int left;
1918
1919         ctask->xmstate &= ~XMSTATE_SOL_DATA;
1920         ctask->dtask = dtask;
1921
1922         if (conn->datadgst_en) {
1923                 iscsi_data_digest_init(conn, ctask);
1924                 dtask->digest = 0;
1925         }
1926 solicit_again:
1927         /*
1928          * send Data-Out whitnin this R2T sequence.
1929          */
1930         if (!r2t->data_count)
1931                 goto data_out_done;
1932
1933         if (iscsi_sendpage(conn, &r2t->sendbuf, &r2t->data_count, &r2t->sent)) {
1934                 ctask->xmstate |= XMSTATE_SOL_DATA;
1935                 /* will continue with this ctask later.. */
1936                 if (conn->datadgst_en) {
1937                         crypto_digest_final(conn->data_tx_tfm,
1938                                           (u8 *)&dtask->digest);
1939                         debug_tcp("r2t data send fail 0x%x\n", dtask->digest);
1940                 }
1941                 return -EAGAIN;
1942         }
1943
1944         BUG_ON(r2t->data_count < 0);
1945         if (conn->datadgst_en)
1946                 crypto_digest_update(conn->data_tx_tfm, &r2t->sendbuf.sg, 1);
1947
1948         if (r2t->data_count) {
1949                 BUG_ON(ctask->sc->use_sg == 0);
1950                 if (!iscsi_buf_left(&r2t->sendbuf)) {
1951                         BUG_ON(ctask->bad_sg == r2t->sg);
1952                         iscsi_buf_init_sg(&r2t->sendbuf, r2t->sg);
1953                         r2t->sg += 1;
1954                 }
1955                 goto solicit_again;
1956         }
1957
1958 data_out_done:
1959         /*
1960          * Done with this Data-Out. Next, check if we have
1961          * to send another Data-Out for this R2T.
1962          */
1963         BUG_ON(r2t->data_length - r2t->sent < 0);
1964         left = r2t->data_length - r2t->sent;
1965         if (left) {
1966                 if (conn->datadgst_en) {
1967                         if (iscsi_digest_final_send(conn, ctask,
1968                                                     &dtask->digestbuf,
1969                                                     &dtask->digest, 1)) {
1970                                 debug_tcp("send r2t data digest 0x%x"
1971                                           "fail\n", dtask->digest);
1972                                 return -EAGAIN;
1973                         }
1974                         debug_tcp("r2t data send digest 0x%x\n",
1975                                   dtask->digest);
1976                 }
1977                 iscsi_solicit_data_cont(conn, ctask, r2t, left);
1978                 ctask->xmstate |= XMSTATE_SOL_DATA;
1979                 ctask->xmstate &= ~XMSTATE_SOL_HDR;
1980                 return 1;
1981         }
1982
1983         /*
1984          * Done with this R2T. Check if there are more
1985          * outstanding R2Ts ready to be processed.
1986          */
1987         BUG_ON(ctask->r2t_data_count - r2t->data_length < 0);
1988         if (conn->datadgst_en) {
1989                 if (iscsi_digest_final_send(conn, ctask, &dtask->digestbuf,
1990                                             &dtask->digest, 1)) {
1991                         debug_tcp("send last r2t data digest 0x%x"
1992                                   "fail\n", dtask->digest);
1993                         return -EAGAIN;
1994                 }
1995                 debug_tcp("r2t done dout digest 0x%x\n", dtask->digest);
1996         }
1997
1998         ctask->r2t_data_count -= r2t->data_length;
1999         ctask->r2t = NULL;
2000         spin_lock_bh(&session->lock);
2001         __kfifo_put(ctask->r2tpool.queue, (void*)&r2t, sizeof(void*));
2002         spin_unlock_bh(&session->lock);
2003         if (__kfifo_get(ctask->r2tqueue, (void*)&r2t, sizeof(void*))) {
2004                 ctask->r2t = r2t;
2005                 ctask->xmstate |= XMSTATE_SOL_DATA;
2006                 ctask->xmstate &= ~XMSTATE_SOL_HDR;
2007                 return 1;
2008         }
2009
2010         return 0;
2011 }
2012
2013 static inline int
2014 handle_xmstate_w_pad(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
2015 {
2016         struct iscsi_data_task *dtask = ctask->dtask;
2017         int sent;
2018
2019         ctask->xmstate &= ~XMSTATE_W_PAD;
2020         iscsi_buf_init_virt(&ctask->sendbuf, (char*)&ctask->pad,
2021                             ctask->pad_count);
2022         if (iscsi_sendpage(conn, &ctask->sendbuf, &ctask->pad_count, &sent)) {
2023                 ctask->xmstate |= XMSTATE_W_PAD;
2024                 return -EAGAIN;
2025         }
2026
2027         if (conn->datadgst_en) {
2028                 crypto_digest_update(conn->data_tx_tfm, &ctask->sendbuf.sg, 1);
2029                 /* imm data? */
2030                 if (!dtask) {
2031                         if (iscsi_digest_final_send(conn, ctask, &ctask->immbuf,
2032                                                     &ctask->immdigest, 1)) {
2033                                 debug_tcp("send padding digest 0x%x"
2034                                           "fail!\n", ctask->immdigest);
2035                                 return -EAGAIN;
2036                         }
2037                         debug_tcp("done with padding, digest 0x%x\n",
2038                                   ctask->datadigest);
2039                 } else {
2040                         if (iscsi_digest_final_send(conn, ctask,
2041                                                     &dtask->digestbuf,
2042                                                     &dtask->digest, 1)) {
2043                                 debug_tcp("send padding digest 0x%x"
2044                                           "fail\n", dtask->digest);
2045                                 return -EAGAIN;
2046                         }
2047                         debug_tcp("done with padding, digest 0x%x\n",
2048                                   dtask->digest);
2049                 }
2050         }
2051
2052         return 0;
2053 }
2054
2055 static int
2056 iscsi_ctask_xmit(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
2057 {
2058         int rc = 0;
2059
2060         debug_scsi("ctask deq [cid %d xmstate %x itt 0x%x]\n",
2061                 conn->id, ctask->xmstate, ctask->itt);
2062
2063         /*
2064          * serialize with TMF AbortTask
2065          */
2066         if (ctask->mtask)
2067                 return rc;
2068
2069         if (ctask->xmstate & XMSTATE_R_HDR) {
2070                 rc = handle_xmstate_r_hdr(conn, ctask);
2071                 return rc;
2072         }
2073
2074         if (ctask->xmstate & XMSTATE_W_HDR) {
2075                 rc = handle_xmstate_w_hdr(conn, ctask);
2076                 if (rc)
2077                         return rc;
2078         }
2079
2080         /* XXX: for data digest xmit recover */
2081         if (ctask->xmstate & XMSTATE_DATA_DIGEST) {
2082                 rc = handle_xmstate_data_digest(conn, ctask);
2083                 if (rc)
2084                         return rc;
2085         }
2086
2087         if (ctask->xmstate & XMSTATE_IMM_DATA) {
2088                 rc = handle_xmstate_imm_data(conn, ctask);
2089                 if (rc)
2090                         return rc;
2091         }
2092
2093         if (ctask->xmstate & XMSTATE_UNS_HDR) {
2094                 BUG_ON(!ctask->unsol_count);
2095                 ctask->xmstate &= ~XMSTATE_UNS_HDR;
2096 unsolicit_head_again:
2097                 rc = handle_xmstate_uns_hdr(conn, ctask);
2098                 if (rc)
2099                         return rc;
2100         }
2101
2102         if (ctask->xmstate & XMSTATE_UNS_DATA) {
2103                 rc = handle_xmstate_uns_data(conn, ctask);
2104                 if (rc == 1)
2105                         goto unsolicit_head_again;
2106                 else if (rc)
2107                         return rc;
2108                 goto done;
2109         }
2110
2111         if (ctask->xmstate & XMSTATE_SOL_HDR) {
2112                 struct iscsi_r2t_info *r2t;
2113
2114                 ctask->xmstate &= ~XMSTATE_SOL_HDR;
2115                 ctask->xmstate |= XMSTATE_SOL_DATA;
2116                 if (!ctask->r2t)
2117                         __kfifo_get(ctask->r2tqueue, (void*)&ctask->r2t,
2118                                     sizeof(void*));
2119 solicit_head_again:
2120                 r2t = ctask->r2t;
2121                 if (conn->hdrdgst_en)
2122                         iscsi_hdr_digest(conn, &r2t->headbuf,
2123                                         (u8*)r2t->dtask->hdrext);
2124                 if (iscsi_sendhdr(conn, &r2t->headbuf, r2t->data_count)) {
2125                         ctask->xmstate &= ~XMSTATE_SOL_DATA;
2126                         ctask->xmstate |= XMSTATE_SOL_HDR;
2127                         return -EAGAIN;
2128                 }
2129
2130                 debug_scsi("sol dout [dsn %d itt 0x%x dlen %d sent %d]\n",
2131                         r2t->solicit_datasn - 1, ctask->itt, r2t->data_count,
2132                         r2t->sent);
2133         }
2134
2135         if (ctask->xmstate & XMSTATE_SOL_DATA) {
2136                 rc = handle_xmstate_sol_data(conn, ctask);
2137                 if (rc == 1)
2138                         goto solicit_head_again;
2139                 if (rc)
2140                         return rc;
2141         }
2142
2143 done:
2144         /*
2145          * Last thing to check is whether we need to send write
2146          * padding. Note that we check for xmstate equality, not just the bit.
2147          */
2148         if (ctask->xmstate == XMSTATE_W_PAD)
2149                 rc = handle_xmstate_w_pad(conn, ctask);
2150
2151         return rc;
2152 }
2153
2154 /**
2155  * iscsi_data_xmit - xmit any command into the scheduled connection
2156  * @conn: iscsi connection
2157  *
2158  * Notes:
2159  *      The function can return -EAGAIN in which case the caller must
2160  *      re-schedule it again later or recover. '0' return code means
2161  *      successful xmit.
2162  **/
2163 static int
2164 iscsi_data_xmit(struct iscsi_conn *conn)
2165 {
2166         if (unlikely(conn->suspend_tx)) {
2167                 debug_tcp("conn %d Tx suspended!\n", conn->id);
2168                 return 0;
2169         }
2170
2171         /*
2172          * Transmit in the following order:
2173          *
2174          * 1) un-finished xmit (ctask or mtask)
2175          * 2) immediate control PDUs
2176          * 3) write data
2177          * 4) SCSI commands
2178          * 5) non-immediate control PDUs
2179          *
2180          * No need to lock around __kfifo_get as long as
2181          * there's one producer and one consumer.
2182          */
2183
2184         BUG_ON(conn->ctask && conn->mtask);
2185
2186         if (conn->ctask) {
2187                 if (iscsi_ctask_xmit(conn, conn->ctask))
2188                         goto again;
2189                 /* done with this in-progress ctask */
2190                 conn->ctask = NULL;
2191         }
2192         if (conn->mtask) {
2193                 if (iscsi_mtask_xmit(conn, conn->mtask))
2194                         goto again;
2195                 /* done with this in-progress mtask */
2196                 conn->mtask = NULL;
2197         }
2198
2199         /* process immediate first */
2200         if (unlikely(__kfifo_len(conn->immqueue))) {
2201                 struct iscsi_session *session = conn->session;
2202                 while (__kfifo_get(conn->immqueue, (void*)&conn->mtask,
2203                                    sizeof(void*))) {
2204                         if (iscsi_mtask_xmit(conn, conn->mtask))
2205                                 goto again;
2206
2207                         if (conn->mtask->hdr.itt ==
2208                                         cpu_to_be32(ISCSI_RESERVED_TAG)) {
2209                                 spin_lock_bh(&session->lock);
2210                                 __kfifo_put(session->mgmtpool.queue,
2211                                             (void*)&conn->mtask, sizeof(void*));
2212                                 spin_unlock_bh(&session->lock);
2213                         }
2214                 }
2215                 /* done with this mtask */
2216                 conn->mtask = NULL;
2217         }
2218
2219         /* process write queue */
2220         while (__kfifo_get(conn->writequeue, (void*)&conn->ctask,
2221                            sizeof(void*))) {
2222                 if (iscsi_ctask_xmit(conn, conn->ctask))
2223                         goto again;
2224         }
2225
2226         /* process command queue */
2227         while (__kfifo_get(conn->xmitqueue, (void*)&conn->ctask,
2228                            sizeof(void*))) {
2229                 if (iscsi_ctask_xmit(conn, conn->ctask))
2230                         goto again;
2231         }
2232         /* done with this ctask */
2233         conn->ctask = NULL;
2234
2235         /* process the rest control plane PDUs, if any */
2236         if (unlikely(__kfifo_len(conn->mgmtqueue))) {
2237                 struct iscsi_session *session = conn->session;
2238
2239                 while (__kfifo_get(conn->mgmtqueue, (void*)&conn->mtask,
2240                                    sizeof(void*))) {
2241                         if (iscsi_mtask_xmit(conn, conn->mtask))
2242                                 goto again;
2243
2244                         if (conn->mtask->hdr.itt ==
2245                                         cpu_to_be32(ISCSI_RESERVED_TAG)) {
2246                                 spin_lock_bh(&session->lock);
2247                                 __kfifo_put(session->mgmtpool.queue,
2248                                             (void*)&conn->mtask,
2249                                             sizeof(void*));
2250                                 spin_unlock_bh(&session->lock);
2251                         }
2252                 }
2253                 /* done with this mtask */
2254                 conn->mtask = NULL;
2255         }
2256
2257         return 0;
2258
2259 again:
2260         if (unlikely(conn->suspend_tx))
2261                 return 0;
2262
2263         return -EAGAIN;
2264 }
2265
2266 static void
2267 iscsi_xmitworker(void *data)
2268 {
2269         struct iscsi_conn *conn = data;
2270
2271         /*
2272          * serialize Xmit worker on a per-connection basis.
2273          */
2274         mutex_lock(&conn->xmitmutex);
2275         if (iscsi_data_xmit(conn))
2276                 scsi_queue_work(conn->session->host, &conn->xmitwork);
2277         mutex_unlock(&conn->xmitmutex);
2278 }
2279
2280 #define FAILURE_BAD_HOST                1
2281 #define FAILURE_SESSION_FAILED          2
2282 #define FAILURE_SESSION_FREED           3
2283 #define FAILURE_WINDOW_CLOSED           4
2284 #define FAILURE_SESSION_TERMINATE       5
2285
2286 static int
2287 iscsi_queuecommand(struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *))
2288 {
2289         struct Scsi_Host *host;
2290         int reason = 0;
2291         struct iscsi_session *session;
2292         struct iscsi_conn *conn = NULL;
2293         struct iscsi_cmd_task *ctask = NULL;
2294
2295         sc->scsi_done = done;
2296         sc->result = 0;
2297
2298         host = sc->device->host;
2299         session = iscsi_hostdata(host->hostdata);
2300         BUG_ON(host != session->host);
2301
2302         spin_lock(&session->lock);
2303
2304         if (session->state != ISCSI_STATE_LOGGED_IN) {
2305                 if (session->state == ISCSI_STATE_FAILED) {
2306                         reason = FAILURE_SESSION_FAILED;
2307                         goto reject;
2308                 } else if (session->state == ISCSI_STATE_TERMINATE) {
2309                         reason = FAILURE_SESSION_TERMINATE;
2310                         goto fault;
2311                 }
2312                 reason = FAILURE_SESSION_FREED;
2313                 goto fault;
2314         }
2315
2316         /*
2317          * Check for iSCSI window and take care of CmdSN wrap-around
2318          */
2319         if ((int)(session->max_cmdsn - session->cmdsn) < 0) {
2320                 reason = FAILURE_WINDOW_CLOSED;
2321                 goto reject;
2322         }
2323
2324         conn = session->leadconn;
2325
2326         __kfifo_get(session->cmdpool.queue, (void*)&ctask, sizeof(void*));
2327         BUG_ON(ctask->sc);
2328
2329         sc->SCp.phase = session->age;
2330         sc->SCp.ptr = (char*)ctask;
2331         iscsi_cmd_init(conn, ctask, sc);
2332
2333         __kfifo_put(conn->xmitqueue, (void*)&ctask, sizeof(void*));
2334         debug_scsi(
2335                "ctask enq [%s cid %d sc %lx itt 0x%x len %d cmdsn %d win %d]\n",
2336                 sc->sc_data_direction == DMA_TO_DEVICE ? "write" : "read",
2337                 conn->id, (long)sc, ctask->itt, sc->request_bufflen,
2338                 session->cmdsn, session->max_cmdsn - session->exp_cmdsn + 1);
2339         spin_unlock(&session->lock);
2340
2341         scsi_queue_work(host, &conn->xmitwork);
2342         return 0;
2343
2344 reject:
2345         spin_unlock(&session->lock);
2346         debug_scsi("cmd 0x%x rejected (%d)\n", sc->cmnd[0], reason);
2347         return SCSI_MLQUEUE_HOST_BUSY;
2348
2349 fault:
2350         spin_unlock(&session->lock);
2351         printk(KERN_ERR "iscsi_tcp: cmd 0x%x is not queued (%d)\n",
2352                sc->cmnd[0], reason);
2353         sc->sense_buffer[0] = 0x70;
2354         sc->sense_buffer[2] = NOT_READY;
2355         sc->sense_buffer[7] = 0x6;
2356         sc->sense_buffer[12] = 0x08;
2357         sc->sense_buffer[13] = 0x00;
2358         sc->result = (DID_NO_CONNECT << 16);
2359         sc->resid = sc->request_bufflen;
2360         sc->scsi_done(sc);
2361         return 0;
2362 }
2363
2364 static int
2365 iscsi_change_queue_depth(struct scsi_device *sdev, int depth)
2366 {
2367         if (depth > ISCSI_MAX_CMD_PER_LUN)
2368                 depth = ISCSI_MAX_CMD_PER_LUN;
2369         scsi_adjust_queue_depth(sdev, scsi_get_tag_type(sdev), depth);
2370         return sdev->queue_depth;
2371 }
2372
2373 static int
2374 iscsi_pool_init(struct iscsi_queue *q, int max, void ***items, int item_size)
2375 {
2376         int i;
2377
2378         *items = kmalloc(max * sizeof(void*), GFP_KERNEL);
2379         if (*items == NULL)
2380                 return -ENOMEM;
2381
2382         q->max = max;
2383         q->pool = kmalloc(max * sizeof(void*), GFP_KERNEL);
2384         if (q->pool == NULL) {
2385                 kfree(*items);
2386                 return -ENOMEM;
2387         }
2388
2389         q->queue = kfifo_init((void*)q->pool, max * sizeof(void*),
2390                               GFP_KERNEL, NULL);
2391         if (q->queue == ERR_PTR(-ENOMEM)) {
2392                 kfree(q->pool);
2393                 kfree(*items);
2394                 return -ENOMEM;
2395         }
2396
2397         for (i = 0; i < max; i++) {
2398                 q->pool[i] = kmalloc(item_size, GFP_KERNEL);
2399                 if (q->pool[i] == NULL) {
2400                         int j;
2401
2402                         for (j = 0; j < i; j++)
2403                                 kfree(q->pool[j]);
2404
2405                         kfifo_free(q->queue);
2406                         kfree(q->pool);
2407                         kfree(*items);
2408                         return -ENOMEM;
2409                 }
2410                 memset(q->pool[i], 0, item_size);
2411                 (*items)[i] = q->pool[i];
2412                 __kfifo_put(q->queue, (void*)&q->pool[i], sizeof(void*));
2413         }
2414         return 0;
2415 }
2416
2417 static void
2418 iscsi_pool_free(struct iscsi_queue *q, void **items)
2419 {
2420         int i;
2421
2422         for (i = 0; i < q->max; i++)
2423                 kfree(items[i]);
2424         kfree(q->pool);
2425         kfree(items);
2426 }
2427
2428 static struct iscsi_cls_conn *
2429 iscsi_conn_create(struct iscsi_cls_session *cls_session, uint32_t conn_idx)
2430 {
2431         struct Scsi_Host *shost = iscsi_session_to_shost(cls_session);
2432         struct iscsi_session *session = iscsi_hostdata(shost->hostdata);
2433         struct iscsi_conn *conn;
2434         struct iscsi_cls_conn *cls_conn;
2435
2436         cls_conn = iscsi_create_conn(cls_session, conn_idx);
2437         if (!cls_conn)
2438                 return NULL;
2439         conn = cls_conn->dd_data;
2440         memset(conn, 0, sizeof(*conn));
2441
2442         conn->cls_conn = cls_conn;
2443         conn->c_stage = ISCSI_CONN_INITIAL_STAGE;
2444         conn->in_progress = IN_PROGRESS_WAIT_HEADER;
2445         conn->id = conn_idx;
2446         conn->exp_statsn = 0;
2447         conn->tmabort_state = TMABORT_INITIAL;
2448
2449         /* initial operational parameters */
2450         conn->hdr_size = sizeof(struct iscsi_hdr);
2451         conn->data_size = DEFAULT_MAX_RECV_DATA_SEGMENT_LENGTH;
2452         conn->max_recv_dlength = DEFAULT_MAX_RECV_DATA_SEGMENT_LENGTH;
2453
2454         /* initialize general xmit PDU commands queue */
2455         conn->xmitqueue = kfifo_alloc(session->cmds_max * sizeof(void*),
2456                                         GFP_KERNEL, NULL);
2457         if (conn->xmitqueue == ERR_PTR(-ENOMEM))
2458                 goto xmitqueue_alloc_fail;
2459
2460         /* initialize write response PDU commands queue */
2461         conn->writequeue = kfifo_alloc(session->cmds_max * sizeof(void*),
2462                                         GFP_KERNEL, NULL);
2463         if (conn->writequeue == ERR_PTR(-ENOMEM))
2464                 goto writequeue_alloc_fail;
2465
2466         /* initialize general immediate & non-immediate PDU commands queue */
2467         conn->immqueue = kfifo_alloc(session->mgmtpool_max * sizeof(void*),
2468                                         GFP_KERNEL, NULL);
2469         if (conn->immqueue == ERR_PTR(-ENOMEM))
2470                 goto immqueue_alloc_fail;
2471
2472         conn->mgmtqueue = kfifo_alloc(session->mgmtpool_max * sizeof(void*),
2473                                         GFP_KERNEL, NULL);
2474         if (conn->mgmtqueue == ERR_PTR(-ENOMEM))
2475                 goto mgmtqueue_alloc_fail;
2476
2477         INIT_WORK(&conn->xmitwork, iscsi_xmitworker, conn);
2478
2479         /* allocate login_mtask used for the login/text sequences */
2480         spin_lock_bh(&session->lock);
2481         if (!__kfifo_get(session->mgmtpool.queue,
2482                          (void*)&conn->login_mtask,
2483                          sizeof(void*))) {
2484                 spin_unlock_bh(&session->lock);
2485                 goto login_mtask_alloc_fail;
2486         }
2487         spin_unlock_bh(&session->lock);
2488
2489         /* allocate initial PDU receive place holder */
2490         if (conn->data_size <= PAGE_SIZE)
2491                 conn->data = kmalloc(conn->data_size, GFP_KERNEL);
2492         else
2493                 conn->data = (void*)__get_free_pages(GFP_KERNEL,
2494                                         get_order(conn->data_size));
2495         if (!conn->data)
2496                 goto max_recv_dlenght_alloc_fail;
2497
2498         init_timer(&conn->tmabort_timer);
2499         mutex_init(&conn->xmitmutex);
2500         init_waitqueue_head(&conn->ehwait);
2501
2502         return cls_conn;
2503
2504 max_recv_dlenght_alloc_fail:
2505         spin_lock_bh(&session->lock);
2506         __kfifo_put(session->mgmtpool.queue, (void*)&conn->login_mtask,
2507                     sizeof(void*));
2508         spin_unlock_bh(&session->lock);
2509 login_mtask_alloc_fail:
2510         kfifo_free(conn->mgmtqueue);
2511 mgmtqueue_alloc_fail:
2512         kfifo_free(conn->immqueue);
2513 immqueue_alloc_fail:
2514         kfifo_free(conn->writequeue);
2515 writequeue_alloc_fail:
2516         kfifo_free(conn->xmitqueue);
2517 xmitqueue_alloc_fail:
2518         iscsi_destroy_conn(cls_conn);
2519         return NULL;
2520 }
2521
2522 static void
2523 iscsi_conn_destroy(struct iscsi_cls_conn *cls_conn)
2524 {
2525         struct iscsi_conn *conn = cls_conn->dd_data;
2526         struct iscsi_session *session = conn->session;
2527         unsigned long flags;
2528
2529         mutex_lock(&conn->xmitmutex);
2530         set_bit(SUSPEND_BIT, &conn->suspend_tx);
2531         if (conn->c_stage == ISCSI_CONN_INITIAL_STAGE && conn->sock) {
2532                 struct sock *sk = conn->sock->sk;
2533
2534                 /*
2535                  * conn_start() has never been called!
2536                  * need to cleanup the socket.
2537                  */
2538                 write_lock_bh(&sk->sk_callback_lock);
2539                 set_bit(SUSPEND_BIT, &conn->suspend_rx);
2540                 write_unlock_bh(&sk->sk_callback_lock);
2541
2542                 sock_hold(conn->sock->sk);
2543                 iscsi_conn_restore_callbacks(conn);
2544                 sock_put(conn->sock->sk);
2545                 sock_release(conn->sock);
2546                 conn->sock = NULL;
2547         }
2548
2549         spin_lock_bh(&session->lock);
2550         conn->c_stage = ISCSI_CONN_CLEANUP_WAIT;
2551         if (session->leadconn == conn) {
2552                 /*
2553                  * leading connection? then give up on recovery.
2554                  */
2555                 session->state = ISCSI_STATE_TERMINATE;
2556                 wake_up(&conn->ehwait);
2557         }
2558         spin_unlock_bh(&session->lock);
2559
2560         mutex_unlock(&conn->xmitmutex);
2561
2562         /*
2563          * Block until all in-progress commands for this connection
2564          * time out or fail.
2565          */
2566         for (;;) {
2567                 spin_lock_irqsave(session->host->host_lock, flags);
2568                 if (!session->host->host_busy) { /* OK for ERL == 0 */
2569                         spin_unlock_irqrestore(session->host->host_lock, flags);
2570                         break;
2571                 }
2572                 spin_unlock_irqrestore(session->host->host_lock, flags);
2573                 msleep_interruptible(500);
2574                 printk("conn_destroy(): host_busy %d host_failed %d\n",
2575                         session->host->host_busy, session->host->host_failed);
2576                 /*
2577                  * force eh_abort() to unblock
2578                  */
2579                 wake_up(&conn->ehwait);
2580         }
2581
2582         /* now free crypto */
2583         if (conn->hdrdgst_en || conn->datadgst_en) {
2584                 if (conn->tx_tfm)
2585                         crypto_free_tfm(conn->tx_tfm);
2586                 if (conn->rx_tfm)
2587                         crypto_free_tfm(conn->rx_tfm);
2588                 if (conn->data_tx_tfm)
2589                         crypto_free_tfm(conn->data_tx_tfm);
2590                 if (conn->data_rx_tfm)
2591                         crypto_free_tfm(conn->data_rx_tfm);
2592         }
2593
2594         /* free conn->data, size = MaxRecvDataSegmentLength */
2595         if (conn->data_size <= PAGE_SIZE)
2596                 kfree(conn->data);
2597         else
2598                 free_pages((unsigned long)conn->data,
2599                                         get_order(conn->data_size));
2600
2601         spin_lock_bh(&session->lock);
2602         __kfifo_put(session->mgmtpool.queue, (void*)&conn->login_mtask,
2603                     sizeof(void*));
2604         list_del(&conn->item);
2605         if (list_empty(&session->connections))
2606                 session->leadconn = NULL;
2607         if (session->leadconn && session->leadconn == conn)
2608                 session->leadconn = container_of(session->connections.next,
2609                         struct iscsi_conn, item);
2610
2611         if (session->leadconn == NULL)
2612                 /* none connections exits.. reset sequencing */
2613                 session->cmdsn = session->max_cmdsn = session->exp_cmdsn = 1;
2614         spin_unlock_bh(&session->lock);
2615
2616         kfifo_free(conn->xmitqueue);
2617         kfifo_free(conn->writequeue);
2618         kfifo_free(conn->immqueue);
2619         kfifo_free(conn->mgmtqueue);
2620
2621         iscsi_destroy_conn(cls_conn);
2622 }
2623
2624 static int
2625 iscsi_conn_bind(struct iscsi_cls_session *cls_session,
2626                 struct iscsi_cls_conn *cls_conn, uint32_t transport_fd,
2627                 int is_leading)
2628 {
2629         struct Scsi_Host *shost = iscsi_session_to_shost(cls_session);
2630         struct iscsi_session *session = iscsi_hostdata(shost->hostdata);
2631         struct iscsi_conn *tmp = ERR_PTR(-EEXIST), *conn = cls_conn->dd_data;
2632         struct sock *sk;
2633         struct socket *sock;
2634         int err;
2635
2636         /* lookup for existing socket */
2637         sock = sockfd_lookup(transport_fd, &err);
2638         if (!sock) {
2639                 printk(KERN_ERR "iscsi_tcp: sockfd_lookup failed %d\n", err);
2640                 return -EEXIST;
2641         }
2642
2643         /* lookup for existing connection */
2644         spin_lock_bh(&session->lock);
2645         list_for_each_entry(tmp, &session->connections, item) {
2646                 if (tmp == conn) {
2647                         if (conn->c_stage != ISCSI_CONN_STOPPED ||
2648                             conn->stop_stage == STOP_CONN_TERM) {
2649                                 printk(KERN_ERR "iscsi_tcp: can't bind "
2650                                        "non-stopped connection (%d:%d)\n",
2651                                        conn->c_stage, conn->stop_stage);
2652                                 spin_unlock_bh(&session->lock);
2653                                 return -EIO;
2654                         }
2655                         break;
2656                 }
2657         }
2658         if (tmp != conn) {
2659                 /* bind new iSCSI connection to session */
2660                 conn->session = session;
2661
2662                 list_add(&conn->item, &session->connections);
2663         }
2664         spin_unlock_bh(&session->lock);
2665
2666         if (conn->stop_stage != STOP_CONN_SUSPEND) {
2667                 /* bind iSCSI connection and socket */
2668                 conn->sock = sock;
2669
2670                 /* setup Socket parameters */
2671                 sk = sock->sk;
2672                 sk->sk_reuse = 1;
2673                 sk->sk_sndtimeo = 15 * HZ; /* FIXME: make it configurable */
2674                 sk->sk_allocation = GFP_ATOMIC;
2675
2676                 /* FIXME: disable Nagle's algorithm */
2677
2678                 /*
2679                  * Intercept TCP callbacks for sendfile like receive
2680                  * processing.
2681                  */
2682                 iscsi_conn_set_callbacks(conn);
2683
2684                 conn->sendpage = conn->sock->ops->sendpage;
2685
2686                 /*
2687                  * set receive state machine into initial state
2688                  */
2689                 conn->in_progress = IN_PROGRESS_WAIT_HEADER;
2690         }
2691
2692         if (is_leading)
2693                 session->leadconn = conn;
2694
2695         /*
2696          * Unblock xmitworker(), Login Phase will pass through.
2697          */
2698         clear_bit(SUSPEND_BIT, &conn->suspend_rx);
2699         clear_bit(SUSPEND_BIT, &conn->suspend_tx);
2700
2701         return 0;
2702 }
2703
2704 static int
2705 iscsi_conn_start(struct iscsi_cls_conn *cls_conn)
2706 {
2707         struct iscsi_conn *conn = cls_conn->dd_data;
2708         struct iscsi_session *session = conn->session;
2709         struct sock *sk;
2710
2711         /* FF phase warming up... */
2712
2713         if (session == NULL) {
2714                 printk(KERN_ERR "iscsi_tcp: can't start unbound connection\n");
2715                 return -EPERM;
2716         }
2717
2718         sk = conn->sock->sk;
2719
2720         write_lock_bh(&sk->sk_callback_lock);
2721         spin_lock_bh(&session->lock);
2722         conn->c_stage = ISCSI_CONN_STARTED;
2723         session->state = ISCSI_STATE_LOGGED_IN;
2724
2725         switch(conn->stop_stage) {
2726         case STOP_CONN_RECOVER:
2727                 /*
2728                  * unblock eh_abort() if it is blocked. re-try all
2729                  * commands after successful recovery
2730                  */
2731                 session->conn_cnt++;
2732                 conn->stop_stage = 0;
2733                 conn->tmabort_state = TMABORT_INITIAL;
2734                 session->age++;
2735                 wake_up(&conn->ehwait);
2736                 break;
2737         case STOP_CONN_TERM:
2738                 session->conn_cnt++;
2739                 conn->stop_stage = 0;
2740                 break;
2741         case STOP_CONN_SUSPEND:
2742                 conn->stop_stage = 0;
2743                 clear_bit(SUSPEND_BIT, &conn->suspend_rx);
2744                 clear_bit(SUSPEND_BIT, &conn->suspend_tx);
2745                 break;
2746         default:
2747                 break;
2748         }
2749         spin_unlock_bh(&session->lock);
2750         write_unlock_bh(&sk->sk_callback_lock);
2751
2752         return 0;
2753 }
2754
2755 static void
2756 iscsi_conn_stop(struct iscsi_cls_conn *cls_conn, int flag)
2757 {
2758         struct iscsi_conn *conn = cls_conn->dd_data;
2759         struct iscsi_session *session = conn->session;
2760         struct sock *sk;
2761         unsigned long flags;
2762
2763         BUG_ON(!conn->sock);
2764         sk = conn->sock->sk;
2765         write_lock_bh(&sk->sk_callback_lock);
2766         set_bit(SUSPEND_BIT, &conn->suspend_rx);
2767         write_unlock_bh(&sk->sk_callback_lock);
2768
2769         mutex_lock(&conn->xmitmutex);
2770
2771         spin_lock_irqsave(session->host->host_lock, flags);
2772         spin_lock(&session->lock);
2773         conn->stop_stage = flag;
2774         conn->c_stage = ISCSI_CONN_STOPPED;
2775         set_bit(SUSPEND_BIT, &conn->suspend_tx);
2776
2777         if (flag != STOP_CONN_SUSPEND)
2778                 session->conn_cnt--;
2779
2780         if (session->conn_cnt == 0 || session->leadconn == conn)
2781                 session->state = ISCSI_STATE_FAILED;
2782
2783         spin_unlock(&session->lock);
2784         spin_unlock_irqrestore(session->host->host_lock, flags);
2785
2786         if (flag == STOP_CONN_TERM || flag == STOP_CONN_RECOVER) {
2787                 struct iscsi_cmd_task *ctask;
2788                 struct iscsi_mgmt_task *mtask;
2789
2790                 /*
2791                  * Socket must go now.
2792                  */
2793                 sock_hold(conn->sock->sk);
2794                 iscsi_conn_restore_callbacks(conn);
2795                 sock_put(conn->sock->sk);
2796
2797                 /*
2798                  * flush xmit queues.
2799                  */
2800                 spin_lock_bh(&session->lock);
2801                 while (__kfifo_get(conn->writequeue, (void*)&ctask,
2802                             sizeof(void*)) ||
2803                         __kfifo_get(conn->xmitqueue, (void*)&ctask,
2804                             sizeof(void*))) {
2805                         struct iscsi_r2t_info *r2t;
2806
2807                         /*
2808                          * flush ctask's r2t queues
2809                          */
2810                         while (__kfifo_get(ctask->r2tqueue, (void*)&r2t,
2811                                 sizeof(void*)))
2812                                 __kfifo_put(ctask->r2tpool.queue, (void*)&r2t,
2813                                             sizeof(void*));
2814
2815                         spin_unlock_bh(&session->lock);
2816                         local_bh_disable();
2817                         iscsi_ctask_cleanup(conn, ctask);
2818                         local_bh_enable();
2819                         spin_lock_bh(&session->lock);
2820                 }
2821                 conn->ctask = NULL;
2822                 while (__kfifo_get(conn->immqueue, (void*)&mtask,
2823                            sizeof(void*)) ||
2824                         __kfifo_get(conn->mgmtqueue, (void*)&mtask,
2825                            sizeof(void*))) {
2826                         __kfifo_put(session->mgmtpool.queue,
2827                                     (void*)&mtask, sizeof(void*));
2828                 }
2829                 conn->mtask = NULL;
2830                 spin_unlock_bh(&session->lock);
2831
2832                 /*
2833                  * release socket only after we stopped data_xmit()
2834                  * activity and flushed all outstandings
2835                  */
2836                 sock_release(conn->sock);
2837                 conn->sock = NULL;
2838
2839                 /*
2840                  * for connection level recovery we should not calculate
2841                  * header digest. conn->hdr_size used for optimization
2842                  * in hdr_extract() and will be re-negotiated at
2843                  * set_param() time.
2844                  */
2845                 if (flag == STOP_CONN_RECOVER) {
2846                         conn->hdr_size = sizeof(struct iscsi_hdr);
2847                         conn->hdrdgst_en = 0;
2848                         conn->datadgst_en = 0;
2849                 }
2850         }
2851         mutex_unlock(&conn->xmitmutex);
2852 }
2853
2854 static int
2855 iscsi_conn_send_generic(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
2856                         char *data, uint32_t data_size)
2857 {
2858         struct iscsi_session *session = conn->session;
2859         struct iscsi_nopout *nop = (struct iscsi_nopout *)hdr;
2860         struct iscsi_mgmt_task *mtask;
2861
2862         spin_lock_bh(&session->lock);
2863         if (session->state == ISCSI_STATE_TERMINATE) {
2864                 spin_unlock_bh(&session->lock);
2865                 return -EPERM;
2866         }
2867         if (hdr->opcode == (ISCSI_OP_LOGIN | ISCSI_OP_IMMEDIATE) ||
2868             hdr->opcode == (ISCSI_OP_TEXT | ISCSI_OP_IMMEDIATE))
2869                 /*
2870                  * Login and Text are sent serially, in
2871                  * request-followed-by-response sequence.
2872                  * Same mtask can be used. Same ITT must be used.
2873                  * Note that login_mtask is preallocated at conn_create().
2874                  */
2875                 mtask = conn->login_mtask;
2876         else {
2877                 BUG_ON(conn->c_stage == ISCSI_CONN_INITIAL_STAGE);
2878                 BUG_ON(conn->c_stage == ISCSI_CONN_STOPPED);
2879
2880                 if (!__kfifo_get(session->mgmtpool.queue,
2881                                  (void*)&mtask, sizeof(void*))) {
2882                         spin_unlock_bh(&session->lock);
2883                         return -ENOSPC;
2884                 }
2885         }
2886
2887         /*
2888          * pre-format CmdSN and ExpStatSN for outgoing PDU.
2889          */
2890         if (hdr->itt != cpu_to_be32(ISCSI_RESERVED_TAG)) {
2891                 hdr->itt = mtask->itt | (conn->id << CID_SHIFT) |
2892                            (session->age << AGE_SHIFT);
2893                 nop->cmdsn = cpu_to_be32(session->cmdsn);
2894                 if (conn->c_stage == ISCSI_CONN_STARTED &&
2895                     !(hdr->opcode & ISCSI_OP_IMMEDIATE))
2896                         session->cmdsn++;
2897         } else
2898                 /* do not advance CmdSN */
2899                 nop->cmdsn = cpu_to_be32(session->cmdsn);
2900
2901         nop->exp_statsn = cpu_to_be32(conn->exp_statsn);
2902
2903         memcpy(&mtask->hdr, hdr, sizeof(struct iscsi_hdr));
2904
2905         iscsi_buf_init_virt(&mtask->headbuf, (char*)&mtask->hdr,
2906                                     sizeof(struct iscsi_hdr));
2907
2908         spin_unlock_bh(&session->lock);
2909
2910         if (data_size) {
2911                 memcpy(mtask->data, data, data_size);
2912                 mtask->data_count = data_size;
2913         } else
2914                 mtask->data_count = 0;
2915
2916         mtask->xmstate = XMSTATE_IMM_HDR;
2917
2918         if (mtask->data_count) {
2919                 iscsi_buf_init_iov(&mtask->sendbuf, (char*)mtask->data,
2920                                     mtask->data_count);
2921         }
2922
2923         debug_scsi("mgmtpdu [op 0x%x hdr->itt 0x%x datalen %d]\n",
2924                    hdr->opcode, hdr->itt, data_size);
2925
2926         /*
2927          * since send_pdu() could be called at least from two contexts,
2928          * we need to serialize __kfifo_put, so we don't have to take
2929          * additional lock on fast data-path
2930          */
2931         if (hdr->opcode & ISCSI_OP_IMMEDIATE)
2932                 __kfifo_put(conn->immqueue, (void*)&mtask, sizeof(void*));
2933         else
2934                 __kfifo_put(conn->mgmtqueue, (void*)&mtask, sizeof(void*));
2935
2936         scsi_queue_work(session->host, &conn->xmitwork);
2937         return 0;
2938 }
2939
2940 static int
2941 iscsi_eh_host_reset(struct scsi_cmnd *sc)
2942 {
2943         struct iscsi_cmd_task *ctask = (struct iscsi_cmd_task *)sc->SCp.ptr;
2944         struct iscsi_conn *conn = ctask->conn;
2945         struct iscsi_session *session = conn->session;
2946
2947         spin_lock_bh(&session->lock);
2948         if (session->state == ISCSI_STATE_TERMINATE) {
2949                 debug_scsi("failing host reset: session terminated "
2950                            "[CID %d age %d]", conn->id, session->age);
2951                 spin_unlock_bh(&session->lock);
2952                 return FAILED;
2953         }
2954         spin_unlock_bh(&session->lock);
2955
2956         debug_scsi("failing connection CID %d due to SCSI host reset "
2957                    "[itt 0x%x age %d]", conn->id, ctask->itt,
2958                    session->age);
2959         iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);
2960
2961         return SUCCESS;
2962 }
2963
2964 static void
2965 iscsi_tmabort_timedout(unsigned long data)
2966 {
2967         struct iscsi_cmd_task *ctask = (struct iscsi_cmd_task *)data;
2968         struct iscsi_conn *conn = ctask->conn;
2969         struct iscsi_session *session = conn->session;
2970
2971         spin_lock(&session->lock);
2972         if (conn->tmabort_state == TMABORT_INITIAL) {
2973                 __kfifo_put(session->mgmtpool.queue,
2974                                 (void*)&ctask->mtask, sizeof(void*));
2975                 conn->tmabort_state = TMABORT_TIMEDOUT;
2976                 debug_scsi("tmabort timedout [sc %lx itt 0x%x]\n",
2977                         (long)ctask->sc, ctask->itt);
2978                 /* unblock eh_abort() */
2979                 wake_up(&conn->ehwait);
2980         }
2981         spin_unlock(&session->lock);
2982 }
2983
2984 static int
2985 iscsi_eh_abort(struct scsi_cmnd *sc)
2986 {
2987         int rc;
2988         struct iscsi_cmd_task *ctask = (struct iscsi_cmd_task *)sc->SCp.ptr;
2989         struct iscsi_conn *conn = ctask->conn;
2990         struct iscsi_session *session = conn->session;
2991
2992         conn->eh_abort_cnt++;
2993         debug_scsi("aborting [sc %lx itt 0x%x]\n", (long)sc, ctask->itt);
2994
2995         /*
2996          * two cases for ERL=0 here:
2997          *
2998          * 1) connection-level failure;
2999          * 2) recovery due protocol error;
3000          */
3001         mutex_lock(&conn->xmitmutex);
3002         spin_lock_bh(&session->lock);
3003         if (session->state != ISCSI_STATE_LOGGED_IN) {
3004                 if (session->state == ISCSI_STATE_TERMINATE) {
3005                         spin_unlock_bh(&session->lock);
3006                         mutex_unlock(&conn->xmitmutex);
3007                         goto failed;
3008                 }
3009                 spin_unlock_bh(&session->lock);
3010         } else {
3011                 struct iscsi_tm *hdr = &conn->tmhdr;
3012
3013                 /*
3014                  * Still LOGGED_IN...
3015                  */
3016
3017                 if (!ctask->sc || sc->SCp.phase != session->age) {
3018                         /*
3019                          * 1) ctask completed before time out. But session
3020                          *    is still ok => Happy Retry.
3021                          * 2) session was re-open during time out of ctask.
3022                          */
3023                         spin_unlock_bh(&session->lock);
3024                         mutex_unlock(&conn->xmitmutex);
3025                         goto success;
3026                 }
3027                 conn->tmabort_state = TMABORT_INITIAL;
3028                 spin_unlock_bh(&session->lock);
3029
3030                 /*
3031                  * ctask timed out but session is OK
3032                  * ERL=0 requires task mgmt abort to be issued on each
3033                  * failed command. requests must be serialized.
3034                  */
3035                 memset(hdr, 0, sizeof(struct iscsi_tm));
3036                 hdr->opcode = ISCSI_OP_SCSI_TMFUNC | ISCSI_OP_IMMEDIATE;
3037                 hdr->flags = ISCSI_TM_FUNC_ABORT_TASK;
3038                 hdr->flags |= ISCSI_FLAG_CMD_FINAL;
3039                 memcpy(hdr->lun, ctask->hdr.lun, sizeof(hdr->lun));
3040                 hdr->rtt = ctask->hdr.itt;
3041                 hdr->refcmdsn = ctask->hdr.cmdsn;
3042
3043                 rc = iscsi_conn_send_generic(conn, (struct iscsi_hdr *)hdr,
3044                                              NULL, 0);
3045                 if (rc) {
3046                         iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);
3047                         debug_scsi("abort sent failure [itt 0x%x]", ctask->itt);
3048                 } else {
3049                         struct iscsi_r2t_info *r2t;
3050
3051                         /*
3052                          * TMF abort vs. TMF response race logic
3053                          */
3054                         spin_lock_bh(&session->lock);
3055                         ctask->mtask = (struct iscsi_mgmt_task *)
3056                                 session->mgmt_cmds[(hdr->itt & ITT_MASK) -
3057                                                         ISCSI_MGMT_ITT_OFFSET];
3058                         /*
3059                          * have to flush r2tqueue to avoid r2t leaks
3060                          */
3061                         while (__kfifo_get(ctask->r2tqueue, (void*)&r2t,
3062                                 sizeof(void*))) {
3063                                 __kfifo_put(ctask->r2tpool.queue, (void*)&r2t,
3064                                         sizeof(void*));
3065                         }
3066                         if (conn->tmabort_state == TMABORT_INITIAL) {
3067                                 conn->tmfcmd_pdus_cnt++;
3068                                 conn->tmabort_timer.expires = 3*HZ + jiffies;
3069                                 conn->tmabort_timer.function =
3070                                                 iscsi_tmabort_timedout;
3071                                 conn->tmabort_timer.data = (unsigned long)ctask;
3072                                 add_timer(&conn->tmabort_timer);
3073                                 debug_scsi("abort sent [itt 0x%x]", ctask->itt);
3074                         } else {
3075                                 if (!ctask->sc ||
3076                                     conn->tmabort_state == TMABORT_SUCCESS) {
3077                                         conn->tmabort_state = TMABORT_INITIAL;
3078                                         spin_unlock_bh(&session->lock);
3079                                         mutex_unlock(&conn->xmitmutex);
3080                                         goto success;
3081                                 }
3082                                 conn->tmabort_state = TMABORT_INITIAL;
3083                                 iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);
3084                         }
3085                         spin_unlock_bh(&session->lock);
3086                 }
3087         }
3088         mutex_unlock(&conn->xmitmutex);
3089
3090
3091         /*
3092          * block eh thread until:
3093          *
3094          * 1) abort response;
3095          * 2) abort timeout;
3096          * 3) session re-opened;
3097          * 4) session terminated;
3098          */
3099         for (;;) {
3100                 int p_state = session->state;
3101
3102                 rc = wait_event_interruptible(conn->ehwait,
3103                         (p_state == ISCSI_STATE_LOGGED_IN ?
3104                          (session->state == ISCSI_STATE_TERMINATE ||
3105                           conn->tmabort_state != TMABORT_INITIAL) :
3106                          (session->state == ISCSI_STATE_TERMINATE ||
3107                           session->state == ISCSI_STATE_LOGGED_IN)));
3108                 if (rc) {
3109                         /* shutdown.. */
3110                         session->state = ISCSI_STATE_TERMINATE;
3111                         goto failed;
3112                 }
3113
3114                 if (signal_pending(current))
3115                         flush_signals(current);
3116
3117                 if (session->state == ISCSI_STATE_TERMINATE)
3118                         goto failed;
3119
3120                 spin_lock_bh(&session->lock);
3121                 if (sc->SCp.phase == session->age &&
3122                    (conn->tmabort_state == TMABORT_TIMEDOUT ||
3123                     conn->tmabort_state == TMABORT_FAILED)) {
3124                         conn->tmabort_state = TMABORT_INITIAL;
3125                         if (!ctask->sc) {
3126                                 /*
3127                                  * ctask completed before tmf abort response or
3128                                  * time out.
3129                                  * But session is still ok => Happy Retry.
3130                                  */
3131                                 spin_unlock_bh(&session->lock);
3132                                 break;
3133                         }
3134                         spin_unlock_bh(&session->lock);
3135                         iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);
3136                         continue;
3137                 }
3138                 spin_unlock_bh(&session->lock);
3139                 break;
3140         }
3141
3142 success:
3143         debug_scsi("abort success [sc %lx itt 0x%x]\n", (long)sc, ctask->itt);
3144         rc = SUCCESS;
3145         goto exit;
3146
3147 failed:
3148         debug_scsi("abort failed [sc %lx itt 0x%x]\n", (long)sc, ctask->itt);
3149         rc = FAILED;
3150
3151 exit:
3152         del_timer_sync(&conn->tmabort_timer);
3153
3154         mutex_lock(&conn->xmitmutex);
3155         if (conn->sock) {
3156                 struct sock *sk = conn->sock->sk;
3157
3158                 write_lock_bh(&sk->sk_callback_lock);
3159                 iscsi_ctask_cleanup(conn, ctask);
3160                 write_unlock_bh(&sk->sk_callback_lock);
3161         }
3162         mutex_unlock(&conn->xmitmutex);
3163         return rc;
3164 }
3165
3166 static int
3167 iscsi_r2tpool_alloc(struct iscsi_session *session)
3168 {
3169         int i;
3170         int cmd_i;
3171
3172         /*
3173          * initialize per-task: R2T pool and xmit queue
3174          */
3175         for (cmd_i = 0; cmd_i < session->cmds_max; cmd_i++) {
3176                 struct iscsi_cmd_task *ctask = session->cmds[cmd_i];
3177
3178                 /*
3179                  * pre-allocated x4 as much r2ts to handle race when
3180                  * target acks DataOut faster than we data_xmit() queues
3181                  * could replenish r2tqueue.
3182                  */
3183
3184                 /* R2T pool */
3185                 if (iscsi_pool_init(&ctask->r2tpool, session->max_r2t * 4,
3186                         (void***)&ctask->r2ts, sizeof(struct iscsi_r2t_info))) {
3187                         goto r2t_alloc_fail;
3188                 }
3189
3190                 /* R2T xmit queue */
3191                 ctask->r2tqueue = kfifo_alloc(
3192                       session->max_r2t * 4 * sizeof(void*), GFP_KERNEL, NULL);
3193                 if (ctask->r2tqueue == ERR_PTR(-ENOMEM)) {
3194                         iscsi_pool_free(&ctask->r2tpool, (void**)ctask->r2ts);
3195                         goto r2t_alloc_fail;
3196                 }
3197
3198                 /*
3199                  * number of
3200                  * Data-Out PDU's within R2T-sequence can be quite big;
3201                  * using mempool
3202                  */
3203                 ctask->datapool = mempool_create_slab_pool(ISCSI_DTASK_DEFAULT_MAX,
3204                                                            taskcache);
3205                 if (ctask->datapool == NULL) {
3206                         kfifo_free(ctask->r2tqueue);
3207                         iscsi_pool_free(&ctask->r2tpool, (void**)ctask->r2ts);
3208                         goto r2t_alloc_fail;
3209                 }
3210                 INIT_LIST_HEAD(&ctask->dataqueue);
3211         }
3212
3213         return 0;
3214
3215 r2t_alloc_fail:
3216         for (i = 0; i < cmd_i; i++) {
3217                 mempool_destroy(session->cmds[i]->datapool);
3218                 kfifo_free(session->cmds[i]->r2tqueue);
3219                 iscsi_pool_free(&session->cmds[i]->r2tpool,
3220                                 (void**)session->cmds[i]->r2ts);
3221         }
3222         return -ENOMEM;
3223 }
3224
3225 static void
3226 iscsi_r2tpool_free(struct iscsi_session *session)
3227 {
3228         int i;
3229
3230         for (i = 0; i < session->cmds_max; i++) {
3231                 mempool_destroy(session->cmds[i]->datapool);
3232                 kfifo_free(session->cmds[i]->r2tqueue);
3233                 iscsi_pool_free(&session->cmds[i]->r2tpool,
3234                                 (void**)session->cmds[i]->r2ts);
3235         }
3236 }
3237
3238 static struct scsi_host_template iscsi_sht = {
3239         .name                   = "iSCSI Initiator over TCP/IP, v."
3240                                   ISCSI_VERSION_STR,
3241         .queuecommand           = iscsi_queuecommand,
3242         .change_queue_depth     = iscsi_change_queue_depth,
3243         .can_queue              = ISCSI_XMIT_CMDS_MAX - 1,
3244         .sg_tablesize           = ISCSI_SG_TABLESIZE,
3245         .cmd_per_lun            = ISCSI_DEF_CMD_PER_LUN,
3246         .eh_abort_handler       = iscsi_eh_abort,
3247         .eh_host_reset_handler  = iscsi_eh_host_reset,
3248         .use_clustering         = DISABLE_CLUSTERING,
3249         .proc_name              = "iscsi_tcp",
3250         .this_id                = -1,
3251 };
3252
3253 static struct iscsi_transport iscsi_tcp_transport;
3254
3255 static struct iscsi_cls_session *
3256 iscsi_session_create(struct scsi_transport_template *scsit,
3257                      uint32_t initial_cmdsn, uint32_t *sid)
3258 {
3259         struct Scsi_Host *shost;
3260         struct iscsi_session *session;
3261         int cmd_i;
3262
3263         shost = iscsi_transport_create_session(scsit, &iscsi_tcp_transport);
3264         if (!shost)
3265                 return NULL; 
3266
3267         session = iscsi_hostdata(shost->hostdata);
3268         memset(session, 0, sizeof(struct iscsi_session));
3269         session->host = shost;
3270         session->state = ISCSI_STATE_FREE;
3271         session->mgmtpool_max = ISCSI_MGMT_CMDS_MAX;
3272         session->cmds_max = ISCSI_XMIT_CMDS_MAX;
3273         session->cmdsn = initial_cmdsn;
3274         session->exp_cmdsn = initial_cmdsn + 1;
3275         session->max_cmdsn = initial_cmdsn + 1;
3276         session->max_r2t = 1;
3277         *sid = shost->host_no;
3278
3279         /* initialize SCSI PDU commands pool */
3280         if (iscsi_pool_init(&session->cmdpool, session->cmds_max,
3281                 (void***)&session->cmds, sizeof(struct iscsi_cmd_task)))
3282                 goto cmdpool_alloc_fail;
3283
3284         /* pre-format cmds pool with ITT */
3285         for (cmd_i = 0; cmd_i < session->cmds_max; cmd_i++)
3286                 session->cmds[cmd_i]->itt = cmd_i;
3287
3288         spin_lock_init(&session->lock);
3289         INIT_LIST_HEAD(&session->connections);
3290
3291         /* initialize immediate command pool */
3292         if (iscsi_pool_init(&session->mgmtpool, session->mgmtpool_max,
3293                 (void***)&session->mgmt_cmds, sizeof(struct iscsi_mgmt_task)))
3294                 goto mgmtpool_alloc_fail;
3295
3296
3297         /* pre-format immediate cmds pool with ITT */
3298         for (cmd_i = 0; cmd_i < session->mgmtpool_max; cmd_i++) {
3299                 session->mgmt_cmds[cmd_i]->itt = ISCSI_MGMT_ITT_OFFSET + cmd_i;
3300                 session->mgmt_cmds[cmd_i]->data = kmalloc(
3301                         DEFAULT_MAX_RECV_DATA_SEGMENT_LENGTH, GFP_KERNEL);
3302                 if (!session->mgmt_cmds[cmd_i]->data) {
3303                         int j;
3304
3305                         for (j = 0; j < cmd_i; j++)
3306                                 kfree(session->mgmt_cmds[j]->data);
3307                         goto immdata_alloc_fail;
3308                 }
3309         }
3310
3311         if (iscsi_r2tpool_alloc(session))
3312                 goto r2tpool_alloc_fail;
3313
3314         return hostdata_session(shost->hostdata);
3315
3316 r2tpool_alloc_fail:
3317         for (cmd_i = 0; cmd_i < session->mgmtpool_max; cmd_i++)
3318                 kfree(session->mgmt_cmds[cmd_i]->data);
3319 immdata_alloc_fail:
3320         iscsi_pool_free(&session->mgmtpool, (void**)session->mgmt_cmds);
3321 mgmtpool_alloc_fail:
3322         iscsi_pool_free(&session->cmdpool, (void**)session->cmds);
3323 cmdpool_alloc_fail:
3324         iscsi_transport_destroy_session(shost);
3325         return NULL;
3326 }
3327
3328 static void
3329 iscsi_session_destroy(struct iscsi_cls_session *cls_session)
3330 {
3331         struct Scsi_Host *shost = iscsi_session_to_shost(cls_session);
3332         struct iscsi_session *session = iscsi_hostdata(shost->hostdata);
3333         int cmd_i;
3334         struct iscsi_data_task *dtask, *n;
3335
3336         for (cmd_i = 0; cmd_i < session->cmds_max; cmd_i++) {
3337                 struct iscsi_cmd_task *ctask = session->cmds[cmd_i];
3338                 list_for_each_entry_safe(dtask, n, &ctask->dataqueue, item) {
3339                         list_del(&dtask->item);
3340                         mempool_free(dtask, ctask->datapool);
3341                 }
3342         }
3343
3344         for (cmd_i = 0; cmd_i < session->mgmtpool_max; cmd_i++)
3345                 kfree(session->mgmt_cmds[cmd_i]->data);
3346
3347         iscsi_r2tpool_free(session);
3348         iscsi_pool_free(&session->mgmtpool, (void**)session->mgmt_cmds);
3349         iscsi_pool_free(&session->cmdpool, (void**)session->cmds);
3350
3351         iscsi_transport_destroy_session(shost);
3352 }
3353
3354 static int
3355 iscsi_conn_set_param(struct iscsi_cls_conn *cls_conn, enum iscsi_param param,
3356                      uint32_t value)
3357 {
3358         struct iscsi_conn *conn = cls_conn->dd_data;
3359         struct iscsi_session *session = conn->session;
3360
3361         spin_lock_bh(&session->lock);
3362         if (conn->c_stage != ISCSI_CONN_INITIAL_STAGE &&
3363             conn->stop_stage != STOP_CONN_RECOVER) {
3364                 printk(KERN_ERR "iscsi_tcp: can not change parameter [%d]\n",
3365                        param);
3366                 spin_unlock_bh(&session->lock);
3367                 return 0;
3368         }
3369         spin_unlock_bh(&session->lock);
3370
3371         switch(param) {
3372         case ISCSI_PARAM_MAX_RECV_DLENGTH: {
3373                 char *saveptr = conn->data;
3374                 gfp_t flags = GFP_KERNEL;
3375
3376                 if (conn->data_size >= value) {
3377                         conn->max_recv_dlength = value;
3378                         break;
3379                 }
3380
3381                 spin_lock_bh(&session->lock);
3382                 if (conn->stop_stage == STOP_CONN_RECOVER)
3383                         flags = GFP_ATOMIC;
3384                 spin_unlock_bh(&session->lock);
3385
3386                 if (value <= PAGE_SIZE)
3387                         conn->data = kmalloc(value, flags);
3388                 else
3389                         conn->data = (void*)__get_free_pages(flags,
3390                                                              get_order(value));
3391                 if (conn->data == NULL) {
3392                         conn->data = saveptr;
3393                         return -ENOMEM;
3394                 }
3395                 if (conn->data_size <= PAGE_SIZE)
3396                         kfree(saveptr);
3397                 else
3398                         free_pages((unsigned long)saveptr,
3399                                    get_order(conn->data_size));
3400                 conn->max_recv_dlength = value;
3401                 conn->data_size = value;
3402                 }
3403                 break;
3404         case ISCSI_PARAM_MAX_XMIT_DLENGTH:
3405                 conn->max_xmit_dlength =  value;
3406                 break;
3407         case ISCSI_PARAM_HDRDGST_EN:
3408                 conn->hdrdgst_en = value;
3409                 conn->hdr_size = sizeof(struct iscsi_hdr);
3410                 if (conn->hdrdgst_en) {
3411                         conn->hdr_size += sizeof(__u32);
3412                         if (!conn->tx_tfm)
3413                                 conn->tx_tfm = crypto_alloc_tfm("crc32c", 0);
3414                         if (!conn->tx_tfm)
3415                                 return -ENOMEM;
3416                         if (!conn->rx_tfm)
3417                                 conn->rx_tfm = crypto_alloc_tfm("crc32c", 0);
3418                         if (!conn->rx_tfm) {
3419                                 crypto_free_tfm(conn->tx_tfm);
3420                                 return -ENOMEM;
3421                         }
3422                 } else {
3423                         if (conn->tx_tfm)
3424                                 crypto_free_tfm(conn->tx_tfm);
3425                         if (conn->rx_tfm)
3426                                 crypto_free_tfm(conn->rx_tfm);
3427                 }
3428                 break;
3429         case ISCSI_PARAM_DATADGST_EN:
3430                 conn->datadgst_en = value;
3431                 if (conn->datadgst_en) {
3432                         if (!conn->data_tx_tfm)
3433                                 conn->data_tx_tfm =
3434                                     crypto_alloc_tfm("crc32c", 0);
3435                         if (!conn->data_tx_tfm)
3436                                 return -ENOMEM;
3437                         if (!conn->data_rx_tfm)
3438                                 conn->data_rx_tfm =
3439                                     crypto_alloc_tfm("crc32c", 0);
3440                         if (!conn->data_rx_tfm) {
3441                                 crypto_free_tfm(conn->data_tx_tfm);
3442                                 return -ENOMEM;
3443                         }
3444                 } else {
3445                         if (conn->data_tx_tfm)
3446                                 crypto_free_tfm(conn->data_tx_tfm);
3447                         if (conn->data_rx_tfm)
3448                                 crypto_free_tfm(conn->data_rx_tfm);
3449                 }
3450                 conn->sendpage = conn->datadgst_en ?
3451                         sock_no_sendpage : conn->sock->ops->sendpage;
3452                 break;
3453         case ISCSI_PARAM_INITIAL_R2T_EN:
3454                 session->initial_r2t_en = value;
3455                 break;
3456         case ISCSI_PARAM_MAX_R2T:
3457                 if (session->max_r2t == roundup_pow_of_two(value))
3458                         break;
3459                 iscsi_r2tpool_free(session);
3460                 session->max_r2t = value;
3461                 if (session->max_r2t & (session->max_r2t - 1))
3462                         session->max_r2t = roundup_pow_of_two(session->max_r2t);
3463                 if (iscsi_r2tpool_alloc(session))
3464                         return -ENOMEM;
3465                 break;
3466         case ISCSI_PARAM_IMM_DATA_EN:
3467                 session->imm_data_en = value;
3468                 break;
3469         case ISCSI_PARAM_FIRST_BURST:
3470                 session->first_burst = value;
3471                 break;
3472         case ISCSI_PARAM_MAX_BURST:
3473                 session->max_burst = value;
3474                 break;
3475         case ISCSI_PARAM_PDU_INORDER_EN:
3476                 session->pdu_inorder_en = value;
3477                 break;
3478         case ISCSI_PARAM_DATASEQ_INORDER_EN:
3479                 session->dataseq_inorder_en = value;
3480                 break;
3481         case ISCSI_PARAM_ERL:
3482                 session->erl = value;
3483                 break;
3484         case ISCSI_PARAM_IFMARKER_EN:
3485                 BUG_ON(value);
3486                 session->ifmarker_en = value;
3487                 break;
3488         case ISCSI_PARAM_OFMARKER_EN:
3489                 BUG_ON(value);
3490                 session->ofmarker_en = value;
3491                 break;
3492         default:
3493                 break;
3494         }
3495
3496         return 0;
3497 }
3498
3499 static int
3500 iscsi_session_get_param(struct iscsi_cls_session *cls_session,
3501                         enum iscsi_param param, uint32_t *value)
3502 {
3503         struct Scsi_Host *shost = iscsi_session_to_shost(cls_session);
3504         struct iscsi_session *session = iscsi_hostdata(shost->hostdata);
3505
3506         switch(param) {
3507         case ISCSI_PARAM_INITIAL_R2T_EN:
3508                 *value = session->initial_r2t_en;
3509                 break;
3510         case ISCSI_PARAM_MAX_R2T:
3511                 *value = session->max_r2t;
3512                 break;
3513         case ISCSI_PARAM_IMM_DATA_EN:
3514                 *value = session->imm_data_en;
3515                 break;
3516         case ISCSI_PARAM_FIRST_BURST:
3517                 *value = session->first_burst;
3518                 break;
3519         case ISCSI_PARAM_MAX_BURST:
3520                 *value = session->max_burst;
3521                 break;
3522         case ISCSI_PARAM_PDU_INORDER_EN:
3523                 *value = session->pdu_inorder_en;
3524                 break;
3525         case ISCSI_PARAM_DATASEQ_INORDER_EN:
3526                 *value = session->dataseq_inorder_en;
3527                 break;
3528         case ISCSI_PARAM_ERL:
3529                 *value = session->erl;
3530                 break;
3531         case ISCSI_PARAM_IFMARKER_EN:
3532                 *value = session->ifmarker_en;
3533                 break;
3534         case ISCSI_PARAM_OFMARKER_EN:
3535                 *value = session->ofmarker_en;
3536                 break;
3537         default:
3538                 return ISCSI_ERR_PARAM_NOT_FOUND;
3539         }
3540
3541         return 0;
3542 }
3543
3544 static int
3545 iscsi_conn_get_param(struct iscsi_cls_conn *cls_conn,
3546                      enum iscsi_param param, uint32_t *value)
3547 {
3548         struct iscsi_conn *conn = cls_conn->dd_data;
3549
3550         switch(param) {
3551         case ISCSI_PARAM_MAX_RECV_DLENGTH:
3552                 *value = conn->max_recv_dlength;
3553                 break;
3554         case ISCSI_PARAM_MAX_XMIT_DLENGTH:
3555                 *value = conn->max_xmit_dlength;
3556                 break;
3557         case ISCSI_PARAM_HDRDGST_EN:
3558                 *value = conn->hdrdgst_en;
3559                 break;
3560         case ISCSI_PARAM_DATADGST_EN:
3561                 *value = conn->datadgst_en;
3562                 break;
3563         default:
3564                 return ISCSI_ERR_PARAM_NOT_FOUND;
3565         }
3566
3567         return 0;
3568 }
3569
3570 static void
3571 iscsi_conn_get_stats(struct iscsi_cls_conn *cls_conn, struct iscsi_stats *stats)
3572 {
3573         struct iscsi_conn *conn = cls_conn->dd_data;
3574
3575         stats->txdata_octets = conn->txdata_octets;
3576         stats->rxdata_octets = conn->rxdata_octets;
3577         stats->scsicmd_pdus = conn->scsicmd_pdus_cnt;
3578         stats->dataout_pdus = conn->dataout_pdus_cnt;
3579         stats->scsirsp_pdus = conn->scsirsp_pdus_cnt;
3580         stats->datain_pdus = conn->datain_pdus_cnt;
3581         stats->r2t_pdus = conn->r2t_pdus_cnt;
3582         stats->tmfcmd_pdus = conn->tmfcmd_pdus_cnt;
3583         stats->tmfrsp_pdus = conn->tmfrsp_pdus_cnt;
3584         stats->custom_length = 3;
3585         strcpy(stats->custom[0].desc, "tx_sendpage_failures");
3586         stats->custom[0].value = conn->sendpage_failures_cnt;
3587         strcpy(stats->custom[1].desc, "rx_discontiguous_hdr");
3588         stats->custom[1].value = conn->discontiguous_hdr_cnt;
3589         strcpy(stats->custom[2].desc, "eh_abort_cnt");
3590         stats->custom[2].value = conn->eh_abort_cnt;
3591 }
3592
3593 static int
3594 iscsi_conn_send_pdu(struct iscsi_cls_conn *cls_conn, struct iscsi_hdr *hdr,
3595                     char *data, uint32_t data_size)
3596 {
3597         struct iscsi_conn *conn = cls_conn->dd_data;
3598         int rc;
3599
3600         mutex_lock(&conn->xmitmutex);
3601         rc = iscsi_conn_send_generic(conn, hdr, data, data_size);
3602         mutex_unlock(&conn->xmitmutex);
3603
3604         return rc;
3605 }
3606
3607 static struct iscsi_transport iscsi_tcp_transport = {
3608         .owner                  = THIS_MODULE,
3609         .name                   = "tcp",
3610         .caps                   = CAP_RECOVERY_L0 | CAP_MULTI_R2T | CAP_HDRDGST
3611                                   | CAP_DATADGST,
3612         .host_template          = &iscsi_sht,
3613         .hostdata_size          = sizeof(struct iscsi_session),
3614         .conndata_size          = sizeof(struct iscsi_conn),
3615         .max_conn               = 1,
3616         .max_cmd_len            = ISCSI_TCP_MAX_CMD_LEN,
3617         .create_session         = iscsi_session_create,
3618         .destroy_session        = iscsi_session_destroy,
3619         .create_conn            = iscsi_conn_create,
3620         .bind_conn              = iscsi_conn_bind,
3621         .destroy_conn           = iscsi_conn_destroy,
3622         .set_param              = iscsi_conn_set_param,
3623         .get_conn_param         = iscsi_conn_get_param,
3624         .get_session_param      = iscsi_session_get_param,
3625         .start_conn             = iscsi_conn_start,
3626         .stop_conn              = iscsi_conn_stop,
3627         .send_pdu               = iscsi_conn_send_pdu,
3628         .get_stats              = iscsi_conn_get_stats,
3629 };
3630
3631 static int __init
3632 iscsi_tcp_init(void)
3633 {
3634         if (iscsi_max_lun < 1) {
3635                 printk(KERN_ERR "Invalid max_lun value of %u\n", iscsi_max_lun);
3636                 return -EINVAL;
3637         }
3638         iscsi_tcp_transport.max_lun = iscsi_max_lun;
3639
3640         taskcache = kmem_cache_create("iscsi_taskcache",
3641                         sizeof(struct iscsi_data_task), 0,
3642                         SLAB_HWCACHE_ALIGN, NULL, NULL);
3643         if (!taskcache)
3644                 return -ENOMEM;
3645
3646         if (!iscsi_register_transport(&iscsi_tcp_transport))
3647                 kmem_cache_destroy(taskcache);
3648
3649         return 0;
3650 }
3651
3652 static void __exit
3653 iscsi_tcp_exit(void)
3654 {
3655         iscsi_unregister_transport(&iscsi_tcp_transport);
3656         kmem_cache_destroy(taskcache);
3657 }
3658
3659 module_init(iscsi_tcp_init);
3660 module_exit(iscsi_tcp_exit);