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