~ubuntu-branches/ubuntu/quantal/linux-linaro-mx51/quantal

« back to all changes in this revision

Viewing changes to ubuntu/iscsitarget/iscsi.c

  • Committer: Package Import Robot
  • Author(s): John Rigby, John Rigby
  • Date: 2011-09-26 10:44:23 UTC
  • Revision ID: package-import@ubuntu.com-20110926104423-3o58a3c1bj7x00rs
Tags: 3.0.0-1007.9
[ John Rigby ]

Enable crypto modules and remove crypto-modules from
exclude-module files
LP: #826021

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 * Copyright (C) 2002-2003 Ardis Technolgies <roman@ardistech.com>
3
 
 * Copyright (C) 2008 Arne Redlich <agr@powerkom-dd.de>
4
 
 *
5
 
 * Released under the terms of the GNU GPL v2.0.
6
 
 */
7
 
 
8
 
#include <linux/module.h>
9
 
#include <linux/hash.h>
10
 
#include <net/tcp.h>
11
 
#include <scsi/scsi.h>
12
 
 
13
 
#include "iscsi.h"
14
 
#include "iscsi_dbg.h"
15
 
#include "iotype.h"
16
 
 
17
 
unsigned long debug_enable_flags;
18
 
unsigned long worker_thread_pool_size;
19
 
 
20
 
static struct kmem_cache *iscsi_cmnd_cache;
21
 
static u8 dummy_data[PAGE_SIZE];
22
 
 
23
 
static int ctr_major;
24
 
static char ctr_name[] = "ietctl";
25
 
extern struct file_operations ctr_fops;
26
 
 
27
 
static u32 cmnd_write_size(struct iscsi_cmnd *cmnd)
28
 
{
29
 
        struct iscsi_scsi_cmd_hdr *hdr = cmnd_hdr(cmnd);
30
 
 
31
 
        if (hdr->flags & ISCSI_CMD_WRITE)
32
 
                return be32_to_cpu(hdr->data_length);
33
 
        return 0;
34
 
}
35
 
 
36
 
static u32 cmnd_read_size(struct iscsi_cmnd *cmnd)
37
 
{
38
 
        struct iscsi_scsi_cmd_hdr *hdr = cmnd_hdr(cmnd);
39
 
 
40
 
        if (hdr->flags & ISCSI_CMD_READ) {
41
 
                struct iscsi_rlength_ahdr *ahdr =
42
 
                        (struct iscsi_rlength_ahdr *)cmnd->pdu.ahs;
43
 
 
44
 
                if (!(hdr->flags & ISCSI_CMD_WRITE))
45
 
                        return be32_to_cpu(hdr->data_length);
46
 
                if (ahdr && ahdr->ahstype == ISCSI_AHSTYPE_RLENGTH)
47
 
                        return be32_to_cpu(ahdr->read_length);
48
 
        }
49
 
        return 0;
50
 
}
51
 
 
52
 
static void iscsi_device_queue_cmnd(struct iscsi_cmnd *cmnd)
53
 
{
54
 
        set_cmnd_waitio(cmnd);
55
 
        wthread_queue(cmnd);
56
 
}
57
 
 
58
 
static void iscsi_scsi_queuecmnd(struct iscsi_cmnd *cmnd)
59
 
{
60
 
        struct iscsi_queue *queue = &cmnd->lun->queue;
61
 
 
62
 
        dprintk(D_GENERIC, "%p\n", cmnd);
63
 
 
64
 
        if ((cmnd->pdu.bhs.flags & ISCSI_CMD_ATTR_MASK) != ISCSI_CMD_UNTAGGED &&
65
 
            (cmnd->pdu.bhs.flags & ISCSI_CMD_ATTR_MASK) != ISCSI_CMD_SIMPLE) {
66
 
                cmnd->pdu.bhs.flags &= ~ISCSI_CMD_ATTR_MASK;
67
 
                cmnd->pdu.bhs.flags |= ISCSI_CMD_UNTAGGED;
68
 
        }
69
 
 
70
 
        spin_lock(&queue->queue_lock);
71
 
 
72
 
        set_cmnd_queued(cmnd);
73
 
 
74
 
        switch (cmnd->pdu.bhs.flags & ISCSI_CMD_ATTR_MASK) {
75
 
        case ISCSI_CMD_UNTAGGED:
76
 
        case ISCSI_CMD_SIMPLE:
77
 
                if (!list_empty(&queue->wait_list) || queue->ordered_cmnd)
78
 
                        goto pending;
79
 
                queue->active_cnt++;
80
 
                break;
81
 
 
82
 
        default:
83
 
                BUG();
84
 
        }
85
 
        spin_unlock(&queue->queue_lock);
86
 
 
87
 
        iscsi_device_queue_cmnd(cmnd);
88
 
        return;
89
 
 pending:
90
 
        assert(list_empty(&cmnd->list));
91
 
 
92
 
        list_add_tail(&cmnd->list, &queue->wait_list);
93
 
        spin_unlock(&queue->queue_lock);
94
 
        return;
95
 
}
96
 
 
97
 
static void iscsi_scsi_dequeuecmnd(struct iscsi_cmnd *cmnd)
98
 
{
99
 
        struct iscsi_queue *queue;
100
 
 
101
 
        if (!cmnd->lun)
102
 
                return;
103
 
        queue = &cmnd->lun->queue;
104
 
        spin_lock(&queue->queue_lock);
105
 
        switch (cmnd->pdu.bhs.flags & ISCSI_CMD_ATTR_MASK) {
106
 
        case ISCSI_CMD_UNTAGGED:
107
 
        case ISCSI_CMD_SIMPLE:
108
 
                --queue->active_cnt;
109
 
                break;
110
 
        case ISCSI_CMD_ORDERED:
111
 
        case ISCSI_CMD_HEAD_OF_QUEUE:
112
 
        case ISCSI_CMD_ACA:
113
 
                BUG();
114
 
        default:
115
 
                /* Should the iscsi_scsi_queuecmnd func reject this ? */
116
 
                break;
117
 
        }
118
 
 
119
 
        while (!list_empty(&queue->wait_list)) {
120
 
                cmnd = list_entry(queue->wait_list.next, struct iscsi_cmnd, list);
121
 
                switch ((cmnd->pdu.bhs.flags & ISCSI_CMD_ATTR_MASK)) {
122
 
                case ISCSI_CMD_UNTAGGED:
123
 
                case ISCSI_CMD_SIMPLE:
124
 
                        list_del_init(&cmnd->list);
125
 
                        queue->active_cnt++;
126
 
                        iscsi_device_queue_cmnd(cmnd);
127
 
                        break;
128
 
                case ISCSI_CMD_ORDERED:
129
 
                case ISCSI_CMD_HEAD_OF_QUEUE:
130
 
                case ISCSI_CMD_ACA:
131
 
                        BUG();
132
 
                }
133
 
        }
134
 
 
135
 
        spin_unlock(&queue->queue_lock);
136
 
 
137
 
        return;
138
 
}
139
 
 
140
 
/**
141
 
 * create a new command.
142
 
 *
143
 
 * iscsi_cmnd_create -
144
 
 * @conn: ptr to connection (for i/o)
145
 
 *
146
 
 * @return    ptr to command or NULL
147
 
 */
148
 
 
149
 
struct iscsi_cmnd *cmnd_alloc(struct iscsi_conn *conn, int req)
150
 
{
151
 
        struct iscsi_cmnd *cmnd;
152
 
 
153
 
        /* TODO: async interface is necessary ? */
154
 
        cmnd = kmem_cache_alloc(iscsi_cmnd_cache, GFP_KERNEL|__GFP_NOFAIL);
155
 
 
156
 
        memset(cmnd, 0, sizeof(*cmnd));
157
 
        INIT_LIST_HEAD(&cmnd->list);
158
 
        INIT_LIST_HEAD(&cmnd->pdu_list);
159
 
        INIT_LIST_HEAD(&cmnd->conn_list);
160
 
        INIT_LIST_HEAD(&cmnd->hash_list);
161
 
        cmnd->conn = conn;
162
 
        spin_lock(&conn->list_lock);
163
 
        atomic_inc(&conn->nr_cmnds);
164
 
        if (req)
165
 
                list_add_tail(&cmnd->conn_list, &conn->pdu_list);
166
 
        spin_unlock(&conn->list_lock);
167
 
        cmnd->tio = NULL;
168
 
 
169
 
        dprintk(D_GENERIC, "%p:%p\n", conn, cmnd);
170
 
 
171
 
        return cmnd;
172
 
}
173
 
 
174
 
/**
175
 
 * create a new command used as response.
176
 
 *
177
 
 * iscsi_cmnd_create_rsp_cmnd -
178
 
 * @cmnd: ptr to request command
179
 
 *
180
 
 * @return    ptr to response command or NULL
181
 
 */
182
 
 
183
 
static struct iscsi_cmnd *iscsi_cmnd_create_rsp_cmnd(struct iscsi_cmnd *cmnd, int final)
184
 
{
185
 
        struct iscsi_cmnd *rsp = cmnd_alloc(cmnd->conn, 0);
186
 
 
187
 
        if (final)
188
 
                set_cmnd_final(rsp);
189
 
        list_add_tail(&rsp->pdu_list, &cmnd->pdu_list);
190
 
        rsp->req = cmnd;
191
 
        return rsp;
192
 
}
193
 
 
194
 
static struct iscsi_cmnd *get_rsp_cmnd(struct iscsi_cmnd *req)
195
 
{
196
 
        return list_entry(req->pdu_list.prev, struct iscsi_cmnd, pdu_list);
197
 
}
198
 
 
199
 
static void iscsi_cmnds_init_write(struct list_head *send)
200
 
{
201
 
        struct iscsi_cmnd *cmnd = list_entry(send->next, struct iscsi_cmnd, list);
202
 
        struct iscsi_conn *conn = cmnd->conn;
203
 
        struct list_head *pos, *next;
204
 
 
205
 
        spin_lock(&conn->list_lock);
206
 
 
207
 
        list_for_each_safe(pos, next, send) {
208
 
                cmnd = list_entry(pos, struct iscsi_cmnd, list);
209
 
 
210
 
                dprintk(D_GENERIC, "%p:%x\n", cmnd, cmnd_opcode(cmnd));
211
 
 
212
 
                list_del_init(&cmnd->list);
213
 
                assert(conn == cmnd->conn);
214
 
                list_add_tail(&cmnd->list, &conn->write_list);
215
 
        }
216
 
 
217
 
        spin_unlock(&conn->list_lock);
218
 
 
219
 
        nthread_wakeup(conn->session->target);
220
 
}
221
 
 
222
 
static void iscsi_cmnd_init_write(struct iscsi_cmnd *cmnd)
223
 
{
224
 
        LIST_HEAD(head);
225
 
 
226
 
        if (!list_empty(&cmnd->list)) {
227
 
                eprintk("%x %x %x %x %lx %u %u %u %u %u %u %u %d %d\n",
228
 
                        cmnd_itt(cmnd), cmnd_ttt(cmnd), cmnd_opcode(cmnd),
229
 
                        cmnd_scsicode(cmnd), cmnd->flags, cmnd->r2t_sn,
230
 
                        cmnd->r2t_length, cmnd->is_unsolicited_data,
231
 
                        cmnd->target_task_tag, cmnd->outstanding_r2t,
232
 
                        cmnd->hdigest, cmnd->ddigest,
233
 
                        list_empty(&cmnd->pdu_list), list_empty(&cmnd->hash_list));
234
 
 
235
 
                assert(list_empty(&cmnd->list));
236
 
        }
237
 
        list_add(&cmnd->list, &head);
238
 
        iscsi_cmnds_init_write(&head);
239
 
}
240
 
 
241
 
static void do_send_data_rsp(struct iscsi_cmnd *cmnd)
242
 
{
243
 
        struct iscsi_conn *conn = cmnd->conn;
244
 
        struct iscsi_cmnd *data_cmnd;
245
 
        struct tio *tio = cmnd->tio;
246
 
        struct iscsi_scsi_cmd_hdr *req = cmnd_hdr(cmnd);
247
 
        struct iscsi_data_in_hdr *rsp;
248
 
        u32 pdusize, expsize, scsisize, size, offset, sn;
249
 
        LIST_HEAD(send);
250
 
 
251
 
        dprintk(D_GENERIC, "%p\n", cmnd);
252
 
        pdusize = conn->session->param.max_xmit_data_length;
253
 
        expsize = cmnd_read_size(cmnd);
254
 
        size = min(expsize, tio->size);
255
 
        offset = 0;
256
 
        sn = 0;
257
 
 
258
 
        while (1) {
259
 
                data_cmnd = iscsi_cmnd_create_rsp_cmnd(cmnd, size <= pdusize);
260
 
                tio_get(tio);
261
 
                data_cmnd->tio = tio;
262
 
                rsp = (struct iscsi_data_in_hdr *)&data_cmnd->pdu.bhs;
263
 
 
264
 
                rsp->opcode = ISCSI_OP_SCSI_DATA_IN;
265
 
                rsp->itt = req->itt;
266
 
                rsp->ttt = cpu_to_be32(ISCSI_RESERVED_TAG);
267
 
                rsp->buffer_offset = offset;
268
 
                rsp->data_sn = cpu_to_be32(sn);
269
 
 
270
 
                if (size <= pdusize) {
271
 
                        data_cmnd->pdu.datasize = size;
272
 
                        rsp->flags = ISCSI_FLG_FINAL | ISCSI_FLG_STATUS;
273
 
 
274
 
                        scsisize = tio->size;
275
 
                        if (scsisize < expsize) {
276
 
                                rsp->flags |= ISCSI_FLG_RESIDUAL_UNDERFLOW;
277
 
                                size = expsize - scsisize;
278
 
                        } else if (scsisize > expsize) {
279
 
                                rsp->flags |= ISCSI_FLG_RESIDUAL_OVERFLOW;
280
 
                                size = scsisize - expsize;
281
 
                        } else
282
 
                                size = 0;
283
 
                        rsp->residual_count = cpu_to_be32(size);
284
 
                        list_add_tail(&data_cmnd->list, &send);
285
 
 
286
 
                        break;
287
 
                }
288
 
 
289
 
                data_cmnd->pdu.datasize = pdusize;
290
 
 
291
 
                size -= pdusize;
292
 
                offset += pdusize;
293
 
                sn++;
294
 
 
295
 
                list_add_tail(&data_cmnd->list, &send);
296
 
        }
297
 
 
298
 
        iscsi_cmnds_init_write(&send);
299
 
}
300
 
 
301
 
static struct iscsi_cmnd *create_scsi_rsp(struct iscsi_cmnd *req)
302
 
{
303
 
        struct iscsi_cmnd *rsp;
304
 
        struct iscsi_scsi_cmd_hdr *req_hdr = cmnd_hdr(req);
305
 
        struct iscsi_scsi_rsp_hdr *rsp_hdr;
306
 
        struct iscsi_sense_data *sense;
307
 
 
308
 
        rsp = iscsi_cmnd_create_rsp_cmnd(req, 1);
309
 
 
310
 
        rsp_hdr = (struct iscsi_scsi_rsp_hdr *)&rsp->pdu.bhs;
311
 
        rsp_hdr->opcode = ISCSI_OP_SCSI_RSP;
312
 
        rsp_hdr->flags = ISCSI_FLG_FINAL;
313
 
        rsp_hdr->response = ISCSI_RESPONSE_COMMAND_COMPLETED;
314
 
        rsp_hdr->cmd_status = req->status;
315
 
        rsp_hdr->itt = req_hdr->itt;
316
 
 
317
 
        if (req->status == SAM_STAT_CHECK_CONDITION) {
318
 
                assert(!rsp->tio);
319
 
                rsp->tio = tio_alloc(1);
320
 
                sense = (struct iscsi_sense_data *)
321
 
                        page_address(rsp->tio->pvec[0]);
322
 
 
323
 
                assert(sense);
324
 
                clear_page(sense);
325
 
                sense->length = cpu_to_be16(IET_SENSE_BUF_SIZE);
326
 
 
327
 
                memcpy(sense->data, req->sense_buf, IET_SENSE_BUF_SIZE);
328
 
                rsp->pdu.datasize = sizeof(struct iscsi_sense_data) +
329
 
                        IET_SENSE_BUF_SIZE;
330
 
 
331
 
                rsp->tio->size = (rsp->pdu.datasize + 3) & -4;
332
 
                rsp->tio->offset = 0;
333
 
        }
334
 
 
335
 
        return rsp;
336
 
}
337
 
 
338
 
void iscsi_cmnd_set_sense(struct iscsi_cmnd *cmnd, u8 sense_key, u8 asc,
339
 
                          u8 ascq)
340
 
{
341
 
        cmnd->status = SAM_STAT_CHECK_CONDITION;
342
 
 
343
 
        cmnd->sense_buf[0] = 0xf0;
344
 
        cmnd->sense_buf[2] = sense_key;
345
 
        cmnd->sense_buf[7] = 6; // Additional sense length
346
 
        cmnd->sense_buf[12] = asc;
347
 
        cmnd->sense_buf[13] = ascq;
348
 
 
349
 
        /* Call to ACA/UAI handler */
350
 
}
351
 
 
352
 
static struct iscsi_cmnd *create_sense_rsp(struct iscsi_cmnd *req,
353
 
                                           u8 sense_key, u8 asc, u8 ascq)
354
 
{
355
 
        iscsi_cmnd_set_sense(req, sense_key, asc, ascq);
356
 
        return create_scsi_rsp(req);
357
 
}
358
 
 
359
 
void send_scsi_rsp(struct iscsi_cmnd *req, void (*func)(struct iscsi_cmnd *))
360
 
{
361
 
        struct iscsi_cmnd *rsp;
362
 
        struct iscsi_scsi_rsp_hdr *rsp_hdr;
363
 
        u32 size;
364
 
 
365
 
        func(req);
366
 
        rsp = create_scsi_rsp(req);
367
 
 
368
 
        switch (req->status) {
369
 
        case SAM_STAT_GOOD:
370
 
        case SAM_STAT_RESERVATION_CONFLICT:
371
 
                rsp_hdr = (struct iscsi_scsi_rsp_hdr *) &rsp->pdu.bhs;
372
 
                if ((size = cmnd_read_size(req)) != 0) {
373
 
                        rsp_hdr->flags |= ISCSI_FLG_RESIDUAL_UNDERFLOW;
374
 
                        rsp_hdr->residual_count = cpu_to_be32(size);
375
 
                }
376
 
                break;
377
 
        default:
378
 
                break;
379
 
        }
380
 
 
381
 
        iscsi_cmnd_init_write(rsp);
382
 
}
383
 
 
384
 
void send_data_rsp(struct iscsi_cmnd *req, void (*func)(struct iscsi_cmnd *))
385
 
{
386
 
        struct iscsi_cmnd *rsp;
387
 
 
388
 
        func(req);
389
 
 
390
 
        if (req->status == SAM_STAT_GOOD)
391
 
                do_send_data_rsp(req);
392
 
        else {
393
 
                rsp = create_scsi_rsp(req);
394
 
                iscsi_cmnd_init_write(rsp);
395
 
        }
396
 
}
397
 
 
398
 
/**
399
 
 * Free a command.
400
 
 * Also frees the additional header.
401
 
 *
402
 
 * iscsi_cmnd_remove -
403
 
 * @cmnd: ptr to command
404
 
 */
405
 
 
406
 
static void iscsi_cmnd_remove(struct iscsi_cmnd *cmnd)
407
 
{
408
 
        struct iscsi_conn *conn;
409
 
 
410
 
        if (!cmnd)
411
 
                return;
412
 
 
413
 
        if (cmnd_timer_active(cmnd)) {
414
 
                clear_cmnd_timer_active(cmnd);
415
 
                del_timer_sync(&cmnd->timer);
416
 
        }
417
 
 
418
 
        dprintk(D_GENERIC, "%p\n", cmnd);
419
 
        conn = cmnd->conn;
420
 
        kfree(cmnd->pdu.ahs);
421
 
 
422
 
        if (!list_empty(&cmnd->list)) {
423
 
                struct iscsi_scsi_cmd_hdr *req = cmnd_hdr(cmnd);
424
 
 
425
 
                eprintk("cmnd %p still on some list?, %x, %x, %x, %x, %x, %x, %x %lx\n",
426
 
                        cmnd, req->opcode, req->scb[0], req->flags, req->itt,
427
 
                        be32_to_cpu(req->data_length),
428
 
                        req->cmd_sn, be32_to_cpu(cmnd->pdu.datasize),
429
 
                        conn->state);
430
 
 
431
 
                if (cmnd->req) {
432
 
                        struct iscsi_scsi_cmd_hdr *req = cmnd_hdr(cmnd->req);
433
 
                        eprintk("%p %x %u\n", req, req->opcode, req->scb[0]);
434
 
                }
435
 
                dump_stack();
436
 
                BUG();
437
 
        }
438
 
        list_del(&cmnd->list);
439
 
        spin_lock(&conn->list_lock);
440
 
        atomic_dec(&conn->nr_cmnds);
441
 
        list_del(&cmnd->conn_list);
442
 
        spin_unlock(&conn->list_lock);
443
 
 
444
 
        if (cmnd->tio)
445
 
                tio_put(cmnd->tio);
446
 
 
447
 
        kmem_cache_free(iscsi_cmnd_cache, cmnd);
448
 
}
449
 
 
450
 
static void cmnd_skip_pdu(struct iscsi_cmnd *cmnd)
451
 
{
452
 
        struct iscsi_conn *conn = cmnd->conn;
453
 
        struct tio *tio = cmnd->tio;
454
 
        char *addr;
455
 
        u32 size;
456
 
        int i;
457
 
 
458
 
        eprintk("%x %x %x %u\n", cmnd_itt(cmnd), cmnd_opcode(cmnd),
459
 
                cmnd_hdr(cmnd)->scb[0], cmnd->pdu.datasize);
460
 
 
461
 
        if (!(size = cmnd->pdu.datasize))
462
 
                return;
463
 
 
464
 
        if (tio)
465
 
                assert(tio->pg_cnt > 0);
466
 
        else
467
 
                tio = cmnd->tio = tio_alloc(1);
468
 
 
469
 
        addr = page_address(tio->pvec[0]);
470
 
        assert(addr);
471
 
        size = (size + 3) & -4;
472
 
        conn->read_size = size;
473
 
        for (i = 0; size > PAGE_CACHE_SIZE; i++, size -= PAGE_CACHE_SIZE) {
474
 
                assert(i < ISCSI_CONN_IOV_MAX);
475
 
                conn->read_iov[i].iov_base = addr;
476
 
                conn->read_iov[i].iov_len = PAGE_CACHE_SIZE;
477
 
        }
478
 
        conn->read_iov[i].iov_base = addr;
479
 
        conn->read_iov[i].iov_len = size;
480
 
        conn->read_msg.msg_iov = conn->read_iov;
481
 
        conn->read_msg.msg_iovlen = ++i;
482
 
}
483
 
 
484
 
static void iscsi_cmnd_reject(struct iscsi_cmnd *req, int reason)
485
 
{
486
 
        struct iscsi_cmnd *rsp;
487
 
        struct iscsi_reject_hdr *rsp_hdr;
488
 
        struct tio *tio;
489
 
        char *addr;
490
 
 
491
 
        rsp = iscsi_cmnd_create_rsp_cmnd(req, 1);
492
 
        rsp_hdr = (struct iscsi_reject_hdr *)&rsp->pdu.bhs;
493
 
 
494
 
        rsp_hdr->opcode = ISCSI_OP_REJECT;
495
 
        rsp_hdr->ffffffff = ISCSI_RESERVED_TAG;
496
 
        rsp_hdr->reason = reason;
497
 
 
498
 
        rsp->tio = tio = tio_alloc(1);
499
 
        addr = page_address(tio->pvec[0]);
500
 
        clear_page(addr);
501
 
        memcpy(addr, &req->pdu.bhs, sizeof(struct iscsi_hdr));
502
 
        tio->size = rsp->pdu.datasize = sizeof(struct iscsi_hdr);
503
 
        cmnd_skip_pdu(req);
504
 
 
505
 
        req->pdu.bhs.opcode = ISCSI_OP_PDU_REJECT;
506
 
}
507
 
 
508
 
static void cmnd_set_sn(struct iscsi_cmnd *cmnd, int set_stat_sn)
509
 
{
510
 
        struct iscsi_conn *conn = cmnd->conn;
511
 
        struct iscsi_session *sess = conn->session;
512
 
 
513
 
        if (set_stat_sn)
514
 
                cmnd->pdu.bhs.sn = cpu_to_be32(conn->stat_sn++);
515
 
        cmnd->pdu.bhs.exp_sn = cpu_to_be32(sess->exp_cmd_sn);
516
 
        cmnd->pdu.bhs.max_sn = cpu_to_be32(sess->exp_cmd_sn + sess->max_queued_cmnds);
517
 
}
518
 
 
519
 
static void update_stat_sn(struct iscsi_cmnd *cmnd)
520
 
{
521
 
        struct iscsi_conn *conn = cmnd->conn;
522
 
        u32 exp_stat_sn;
523
 
 
524
 
        cmnd->pdu.bhs.exp_sn = exp_stat_sn = be32_to_cpu(cmnd->pdu.bhs.exp_sn);
525
 
        dprintk(D_GENERIC, "%x,%x\n", cmnd_opcode(cmnd), exp_stat_sn);
526
 
        if ((int)(exp_stat_sn - conn->exp_stat_sn) > 0 &&
527
 
            (int)(exp_stat_sn - conn->stat_sn) <= 0) {
528
 
                // free pdu resources
529
 
                cmnd->conn->exp_stat_sn = exp_stat_sn;
530
 
        }
531
 
}
532
 
 
533
 
static int check_cmd_sn(struct iscsi_cmnd *cmnd)
534
 
{
535
 
        struct iscsi_session *session = cmnd->conn->session;
536
 
        u32 cmd_sn;
537
 
 
538
 
        cmnd->pdu.bhs.sn = cmd_sn = be32_to_cpu(cmnd->pdu.bhs.sn);
539
 
 
540
 
        dprintk(D_GENERIC, "cmd_sn(%u) exp_cmd_sn(%u) max_cmd_sn(%u)\n",
541
 
                cmd_sn, session->exp_cmd_sn, session->max_cmd_sn);
542
 
 
543
 
        if  (between(cmd_sn, session->exp_cmd_sn, session->max_cmd_sn))
544
 
                return 0;
545
 
        else if (cmnd_immediate(cmnd))
546
 
                return 0;
547
 
 
548
 
        eprintk("sequence error: cmd_sn(%u) exp_cmd_sn(%u) max_cmd_sn(%u)\n",
549
 
                cmd_sn, session->exp_cmd_sn, session->max_cmd_sn);
550
 
 
551
 
        set_cmnd_tmfabort(cmnd);
552
 
 
553
 
        return -ISCSI_REASON_PROTOCOL_ERROR;
554
 
}
555
 
 
556
 
static struct iscsi_cmnd *__cmnd_find_hash(struct iscsi_session *session, u32 itt, u32 ttt)
557
 
{
558
 
        struct list_head *head;
559
 
        struct iscsi_cmnd *cmnd;
560
 
 
561
 
        head = &session->cmnd_hash[cmnd_hashfn(itt)];
562
 
 
563
 
        list_for_each_entry(cmnd, head, hash_list) {
564
 
                if (cmnd->pdu.bhs.itt == itt) {
565
 
                        if ((ttt != ISCSI_RESERVED_TAG) && (ttt != cmnd->target_task_tag))
566
 
                                continue;
567
 
                        return cmnd;
568
 
                }
569
 
        }
570
 
 
571
 
        return NULL;
572
 
}
573
 
 
574
 
static struct iscsi_cmnd *cmnd_find_hash(struct iscsi_session *session, u32 itt, u32 ttt)
575
 
{
576
 
        struct iscsi_cmnd *cmnd;
577
 
 
578
 
        spin_lock(&session->cmnd_hash_lock);
579
 
 
580
 
        cmnd = __cmnd_find_hash(session, itt, ttt);
581
 
 
582
 
        spin_unlock(&session->cmnd_hash_lock);
583
 
 
584
 
        return cmnd;
585
 
}
586
 
 
587
 
static int cmnd_insert_hash_ttt(struct iscsi_cmnd *cmnd, u32 ttt)
588
 
{
589
 
        struct iscsi_session *session = cmnd->conn->session;
590
 
        struct iscsi_cmnd *tmp;
591
 
        struct list_head *head;
592
 
        int err = 0;
593
 
        u32 itt = cmnd->pdu.bhs.itt;
594
 
 
595
 
        head = &session->cmnd_hash[cmnd_hashfn(itt)];
596
 
 
597
 
        spin_lock(&session->cmnd_hash_lock);
598
 
 
599
 
        tmp = __cmnd_find_hash(session, itt, ttt);
600
 
        if (!tmp) {
601
 
                list_add_tail(&cmnd->hash_list, head);
602
 
                set_cmnd_hashed(cmnd);
603
 
        } else
604
 
                err = -ISCSI_REASON_TASK_IN_PROGRESS;
605
 
 
606
 
        spin_unlock(&session->cmnd_hash_lock);
607
 
 
608
 
        return err;
609
 
}
610
 
 
611
 
static int cmnd_insert_hash(struct iscsi_cmnd *cmnd)
612
 
{
613
 
        int err;
614
 
 
615
 
        dprintk(D_GENERIC, "%p:%x\n", cmnd, cmnd->pdu.bhs.itt);
616
 
 
617
 
        if (cmnd->pdu.bhs.itt == ISCSI_RESERVED_TAG)
618
 
                return -ISCSI_REASON_PROTOCOL_ERROR;
619
 
 
620
 
        err = cmnd_insert_hash_ttt(cmnd, ISCSI_RESERVED_TAG);
621
 
        if (!err) {
622
 
                update_stat_sn(cmnd);
623
 
                err = check_cmd_sn(cmnd);
624
 
        } else if (!cmnd_immediate(cmnd))
625
 
                set_cmnd_tmfabort(cmnd);
626
 
 
627
 
        return err;
628
 
}
629
 
 
630
 
static void __cmnd_remove_hash(struct iscsi_cmnd *cmnd)
631
 
{
632
 
        list_del(&cmnd->hash_list);
633
 
}
634
 
 
635
 
static void cmnd_remove_hash(struct iscsi_cmnd *cmnd)
636
 
{
637
 
        struct iscsi_session *session = cmnd->conn->session;
638
 
        struct iscsi_cmnd *tmp;
639
 
 
640
 
        spin_lock(&session->cmnd_hash_lock);
641
 
 
642
 
        tmp = __cmnd_find_hash(session, cmnd->pdu.bhs.itt,
643
 
                               cmnd->target_task_tag);
644
 
        if (tmp && tmp == cmnd)
645
 
                __cmnd_remove_hash(tmp);
646
 
        else
647
 
                eprintk("%p:%x not found\n", cmnd, cmnd_itt(cmnd));
648
 
 
649
 
        spin_unlock(&session->cmnd_hash_lock);
650
 
}
651
 
 
652
 
static void cmnd_skip_data(struct iscsi_cmnd *req)
653
 
{
654
 
        struct iscsi_cmnd *rsp;
655
 
        struct iscsi_scsi_rsp_hdr *rsp_hdr;
656
 
        u32 size;
657
 
 
658
 
        rsp = get_rsp_cmnd(req);
659
 
        rsp_hdr = (struct iscsi_scsi_rsp_hdr *)&rsp->pdu.bhs;
660
 
        if (cmnd_opcode(rsp) != ISCSI_OP_SCSI_RSP) {
661
 
                eprintk("unexpected response command %u\n", cmnd_opcode(rsp));
662
 
                return;
663
 
        }
664
 
 
665
 
        size = cmnd_write_size(req);
666
 
        if (size) {
667
 
                rsp_hdr->flags |= ISCSI_FLG_RESIDUAL_UNDERFLOW;
668
 
                rsp_hdr->residual_count = cpu_to_be32(size);
669
 
        }
670
 
        size = cmnd_read_size(req);
671
 
        if (size) {
672
 
                if (cmnd_hdr(req)->flags & ISCSI_CMD_WRITE) {
673
 
                        rsp_hdr->flags |= ISCSI_FLG_BIRESIDUAL_UNDERFLOW;
674
 
                        rsp_hdr->bi_residual_count = cpu_to_be32(size);
675
 
                } else {
676
 
                        rsp_hdr->flags |= ISCSI_FLG_RESIDUAL_UNDERFLOW;
677
 
                        rsp_hdr->residual_count = cpu_to_be32(size);
678
 
                }
679
 
        }
680
 
        req->pdu.bhs.opcode =
681
 
                (req->pdu.bhs.opcode & ~ISCSI_OPCODE_MASK) | ISCSI_OP_SCSI_REJECT;
682
 
 
683
 
        cmnd_skip_pdu(req);
684
 
}
685
 
 
686
 
static int cmnd_recv_pdu(struct iscsi_conn *conn, struct tio *tio, u32 offset, u32 size)
687
 
{
688
 
        int idx, i;
689
 
        char *addr;
690
 
 
691
 
        dprintk(D_GENERIC, "%p %u,%u\n", tio, offset, size);
692
 
        offset += tio->offset;
693
 
 
694
 
        if (!(offset < tio->offset + tio->size) ||
695
 
            !(offset + size <= tio->offset + tio->size)) {
696
 
                eprintk("%u %u %u %u", offset, size, tio->offset, tio->size);
697
 
                return -EIO;
698
 
        }
699
 
        assert(offset < tio->offset + tio->size);
700
 
        assert(offset + size <= tio->offset + tio->size);
701
 
 
702
 
        idx = offset >> PAGE_CACHE_SHIFT;
703
 
        offset &= ~PAGE_CACHE_MASK;
704
 
 
705
 
        conn->read_msg.msg_iov = conn->read_iov;
706
 
        conn->read_size = size = (size + 3) & -4;
707
 
        conn->read_overflow = 0;
708
 
 
709
 
        i = 0;
710
 
        while (1) {
711
 
                assert(tio->pvec[idx]);
712
 
                addr = page_address(tio->pvec[idx]);
713
 
                assert(addr);
714
 
                conn->read_iov[i].iov_base =  addr + offset;
715
 
                if (offset + size <= PAGE_CACHE_SIZE) {
716
 
                        conn->read_iov[i].iov_len = size;
717
 
                        conn->read_msg.msg_iovlen = ++i;
718
 
                        break;
719
 
                }
720
 
                conn->read_iov[i].iov_len = PAGE_CACHE_SIZE - offset;
721
 
                size -= conn->read_iov[i].iov_len;
722
 
                offset = 0;
723
 
                if (++i >= ISCSI_CONN_IOV_MAX) {
724
 
                        conn->read_msg.msg_iovlen = i;
725
 
                        conn->read_overflow = size;
726
 
                        conn->read_size -= size;
727
 
                        break;
728
 
                }
729
 
 
730
 
                idx++;
731
 
        }
732
 
 
733
 
        return 0;
734
 
}
735
 
 
736
 
static void set_offset_and_length(struct iet_volume *lu, u8 *cmd, loff_t *off, u32 *len)
737
 
{
738
 
        assert(lu);
739
 
 
740
 
        switch (cmd[0]) {
741
 
        case READ_6:
742
 
        case WRITE_6:
743
 
                *off = ((cmd[1] & 0x1f) << 16) + (cmd[2] << 8) + cmd[3];
744
 
                *len = cmd[4];
745
 
                if (!*len)
746
 
                        *len = 256;
747
 
                break;
748
 
        case READ_10:
749
 
        case WRITE_10:
750
 
        case WRITE_VERIFY:
751
 
                *off = (u32)cmd[2] << 24 | (u32)cmd[3] << 16 |
752
 
                        (u32)cmd[4] << 8 | (u32)cmd[5];
753
 
                *len = (cmd[7] << 8) + cmd[8];
754
 
                break;
755
 
        case READ_16:
756
 
        case WRITE_16:
757
 
                *off = (u64)cmd[2] << 56 | (u64)cmd[3] << 48 |
758
 
                        (u64)cmd[4] << 40 | (u64)cmd[5] << 32 |
759
 
                        (u64)cmd[6] << 24 | (u64)cmd[7] << 16 |
760
 
                        (u64)cmd[8] << 8 | (u64)cmd[9];
761
 
                *len = (u32)cmd[10] << 24 | (u32)cmd[11] << 16 |
762
 
                        (u32)cmd[12] << 8 | (u32)cmd[13];
763
 
                break;
764
 
        default:
765
 
                BUG();
766
 
        }
767
 
 
768
 
        *off <<= lu->blk_shift;
769
 
        *len <<= lu->blk_shift;
770
 
}
771
 
 
772
 
static u32 translate_lun(u16 * data)
773
 
{
774
 
        u8 *p = (u8 *) data;
775
 
        u32 lun = ~0U;
776
 
 
777
 
        switch (*p >> 6) {
778
 
        case 0:
779
 
                lun = p[1];
780
 
                break;
781
 
        case 1:
782
 
                lun = (0x3f & p[0]) << 8 | p[1];
783
 
                break;
784
 
        case 2:
785
 
        case 3:
786
 
        default:
787
 
                eprintk("%u %u %u %u\n", data[0], data[1], data[2], data[3]);
788
 
                break;
789
 
        }
790
 
 
791
 
        return lun;
792
 
}
793
 
 
794
 
static void send_r2t(struct iscsi_cmnd *req)
795
 
{
796
 
        struct iscsi_cmnd *rsp;
797
 
        struct iscsi_r2t_hdr *rsp_hdr;
798
 
        u32 length, offset, burst;
799
 
        LIST_HEAD(send);
800
 
 
801
 
        length = req->r2t_length;
802
 
        burst = req->conn->session->param.max_burst_length;
803
 
        offset = be32_to_cpu(cmnd_hdr(req)->data_length) - length;
804
 
 
805
 
        do {
806
 
                rsp = iscsi_cmnd_create_rsp_cmnd(req, 0);
807
 
                rsp->pdu.bhs.ttt = req->target_task_tag;
808
 
 
809
 
                rsp_hdr = (struct iscsi_r2t_hdr *)&rsp->pdu.bhs;
810
 
                rsp_hdr->opcode = ISCSI_OP_R2T;
811
 
                rsp_hdr->flags = ISCSI_FLG_FINAL;
812
 
                memcpy(rsp_hdr->lun, cmnd_hdr(req)->lun, 8);
813
 
                rsp_hdr->itt = cmnd_hdr(req)->itt;
814
 
                rsp_hdr->r2t_sn = cpu_to_be32(req->r2t_sn++);
815
 
                rsp_hdr->buffer_offset = cpu_to_be32(offset);
816
 
                if (length > burst) {
817
 
                        rsp_hdr->data_length = cpu_to_be32(burst);
818
 
                        length -= burst;
819
 
                        offset += burst;
820
 
                } else {
821
 
                        rsp_hdr->data_length = cpu_to_be32(length);
822
 
                        length = 0;
823
 
                }
824
 
 
825
 
                dprintk(D_WRITE, "%x %u %u %u %u\n", cmnd_itt(req),
826
 
                        be32_to_cpu(rsp_hdr->data_length),
827
 
                        be32_to_cpu(rsp_hdr->buffer_offset),
828
 
                        be32_to_cpu(rsp_hdr->r2t_sn), req->outstanding_r2t);
829
 
 
830
 
                list_add_tail(&rsp->list, &send);
831
 
 
832
 
                if (++req->outstanding_r2t >= req->conn->session->param.max_outstanding_r2t)
833
 
                        break;
834
 
 
835
 
        } while (length);
836
 
 
837
 
        iscsi_cmnds_init_write(&send);
838
 
}
839
 
 
840
 
static void scsi_cmnd_exec(struct iscsi_cmnd *cmnd)
841
 
{
842
 
        assert(!cmnd->r2t_length);
843
 
 
844
 
        if (cmnd->lun) {
845
 
                iscsi_scsi_queuecmnd(cmnd);
846
 
        } else {
847
 
                iscsi_device_queue_cmnd(cmnd);
848
 
        }
849
 
}
850
 
 
851
 
static int nop_out_start(struct iscsi_conn *conn, struct iscsi_cmnd *cmnd)
852
 
{
853
 
        u32 size, tmp;
854
 
        int i, err = 0;
855
 
 
856
 
        if (cmnd_ttt(cmnd) != cpu_to_be32(ISCSI_RESERVED_TAG)) {
857
 
                cmnd->req = cmnd_find_hash(conn->session, cmnd->pdu.bhs.itt,
858
 
                                           cmnd->pdu.bhs.ttt);
859
 
                if (!cmnd->req) {
860
 
                        /*
861
 
                         * We didn't request this NOP-Out (by sending a
862
 
                         * NOP-In, see 10.18.2 of the RFC) or our fake NOP-Out
863
 
                         * timed out.
864
 
                         */
865
 
                        eprintk("initiator bug %x\n", cmnd_itt(cmnd));
866
 
                        err = -ISCSI_REASON_PROTOCOL_ERROR;
867
 
                        goto out;
868
 
                }
869
 
 
870
 
                del_timer_sync(&cmnd->req->timer);
871
 
                clear_cmnd_timer_active(cmnd->req);
872
 
                dprintk(D_GENERIC, "NOP-Out: %p, ttt %x, timer %p\n",
873
 
                        cmnd->req, cmnd_ttt(cmnd->req), &cmnd->req->timer);
874
 
        }
875
 
 
876
 
        if (cmnd_itt(cmnd) == cpu_to_be32(ISCSI_RESERVED_TAG)) {
877
 
                if (!cmnd_immediate(cmnd))
878
 
                        eprintk("%s\n", "initiator bug!");
879
 
                update_stat_sn(cmnd);
880
 
                err = check_cmd_sn(cmnd);
881
 
                if (err)
882
 
                        goto out;
883
 
        } else if ((err = cmnd_insert_hash(cmnd)) < 0) {
884
 
                eprintk("ignore this request %x\n", cmnd_itt(cmnd));
885
 
                goto out;
886
 
        }
887
 
 
888
 
        if ((size = cmnd->pdu.datasize)) {
889
 
                size = (size + 3) & -4;
890
 
                conn->read_msg.msg_iov = conn->read_iov;
891
 
                if (cmnd->pdu.bhs.itt != cpu_to_be32(ISCSI_RESERVED_TAG)) {
892
 
                        struct tio *tio;
893
 
                        int pg_cnt = get_pgcnt(size, 0);
894
 
 
895
 
                        assert(pg_cnt < ISCSI_CONN_IOV_MAX);
896
 
                        cmnd->tio = tio = tio_alloc(pg_cnt);
897
 
                        tio_set(tio, size, 0);
898
 
 
899
 
                        for (i = 0; i < pg_cnt; i++) {
900
 
                                conn->read_iov[i].iov_base
901
 
                                        = page_address(tio->pvec[i]);
902
 
                                tmp = min_t(u32, size, PAGE_CACHE_SIZE);
903
 
                                conn->read_iov[i].iov_len = tmp;
904
 
                                conn->read_size += tmp;
905
 
                                size -= tmp;
906
 
                        }
907
 
                } else {
908
 
                        for (i = 0; i < ISCSI_CONN_IOV_MAX; i++) {
909
 
                                conn->read_iov[i].iov_base = dummy_data;
910
 
                                tmp = min_t(u32, size, sizeof(dummy_data));
911
 
                                conn->read_iov[i].iov_len = tmp;
912
 
                                conn->read_size += tmp;
913
 
                                size -= tmp;
914
 
                        }
915
 
                }
916
 
                assert(!size);
917
 
                conn->read_overflow = size;
918
 
                conn->read_msg.msg_iovlen = i;
919
 
        }
920
 
 
921
 
out:
922
 
        return err;
923
 
}
924
 
 
925
 
static u32 get_next_ttt(struct iscsi_session *session)
926
 
{
927
 
        u32 ttt;
928
 
 
929
 
        if (session->next_ttt == ISCSI_RESERVED_TAG)
930
 
                session->next_ttt++;
931
 
        ttt = session->next_ttt++;
932
 
 
933
 
        return cpu_to_be32(ttt);
934
 
}
935
 
 
936
 
static void scsi_cmnd_start(struct iscsi_conn *conn, struct iscsi_cmnd *req)
937
 
{
938
 
        struct iscsi_scsi_cmd_hdr *req_hdr = cmnd_hdr(req);
939
 
 
940
 
        dprintk(D_GENERIC, "scsi command: %02x\n", req_hdr->scb[0]);
941
 
 
942
 
        req->lun = volume_get(conn->session->target, translate_lun(req_hdr->lun));
943
 
        if (!req->lun) {
944
 
                switch (req_hdr->scb[0]) {
945
 
                case INQUIRY:
946
 
                case REPORT_LUNS:
947
 
                        break;
948
 
                default:
949
 
                        eprintk("%x %x\n", cmnd_itt(req), req_hdr->scb[0]);
950
 
                        create_sense_rsp(req, ILLEGAL_REQUEST, 0x25, 0x0);
951
 
                        cmnd_skip_data(req);
952
 
                        goto out;
953
 
                }
954
 
        } else
955
 
                set_cmnd_lunit(req);
956
 
 
957
 
        switch (req_hdr->scb[0]) {
958
 
        case SERVICE_ACTION_IN:
959
 
                if ((req_hdr->scb[1] & 0x1f) != 0x10)
960
 
                        goto error;
961
 
        case INQUIRY:
962
 
        case REPORT_LUNS:
963
 
        case TEST_UNIT_READY:
964
 
        case SYNCHRONIZE_CACHE:
965
 
        case VERIFY:
966
 
        case VERIFY_16:
967
 
        case START_STOP:
968
 
        case READ_CAPACITY:
969
 
        case MODE_SENSE:
970
 
        case REQUEST_SENSE:
971
 
        case RESERVE:
972
 
        case RELEASE:
973
 
        {
974
 
                if (!(req_hdr->flags & ISCSI_CMD_FINAL) || req->pdu.datasize) {
975
 
                        /* unexpected unsolicited data */
976
 
                        eprintk("%x %x\n", cmnd_itt(req), req_hdr->scb[0]);
977
 
                        create_sense_rsp(req, ABORTED_COMMAND, 0xc, 0xc);
978
 
                        cmnd_skip_data(req);
979
 
                }
980
 
                break;
981
 
        }
982
 
        case READ_6:
983
 
        case READ_10:
984
 
        case READ_16:
985
 
        {
986
 
                loff_t offset;
987
 
                u32 length;
988
 
 
989
 
                if (!(req_hdr->flags & ISCSI_CMD_FINAL) || req->pdu.datasize) {
990
 
                        /* unexpected unsolicited data */
991
 
                        eprintk("%x %x\n", cmnd_itt(req), req_hdr->scb[0]);
992
 
                        create_sense_rsp(req, ABORTED_COMMAND, 0xc, 0xc);
993
 
                        cmnd_skip_data(req);
994
 
                        break;
995
 
                }
996
 
 
997
 
                set_offset_and_length(req->lun, req_hdr->scb, &offset, &length);
998
 
                req->tio = tio_alloc(get_pgcnt(length, offset));
999
 
                tio_set(req->tio, length, offset);
1000
 
                break;
1001
 
        }
1002
 
        case WRITE_6:
1003
 
        case WRITE_10:
1004
 
        case WRITE_16:
1005
 
        case WRITE_VERIFY:
1006
 
        {
1007
 
                struct iscsi_sess_param *param = &conn->session->param;
1008
 
                loff_t offset;
1009
 
                u32 length;
1010
 
 
1011
 
                req->r2t_length = be32_to_cpu(req_hdr->data_length) - req->pdu.datasize;
1012
 
                req->is_unsolicited_data = !(req_hdr->flags & ISCSI_CMD_FINAL);
1013
 
                req->target_task_tag = get_next_ttt(conn->session);
1014
 
 
1015
 
                if (LUReadonly(req->lun)) {
1016
 
                        create_sense_rsp(req, DATA_PROTECT, 0x27, 0x0);
1017
 
                        cmnd_skip_data(req);
1018
 
                        break;
1019
 
                }
1020
 
 
1021
 
                if (!param->immediate_data && req->pdu.datasize)
1022
 
                        eprintk("%x %x\n", cmnd_itt(req), req_hdr->scb[0]);
1023
 
 
1024
 
                if (param->initial_r2t && !(req_hdr->flags & ISCSI_CMD_FINAL))
1025
 
                        eprintk("%x %x\n", cmnd_itt(req), req_hdr->scb[0]);
1026
 
 
1027
 
                if (req_hdr->scb[0] == WRITE_VERIFY && req_hdr->scb[1] & 0x02)
1028
 
                        eprintk("Verification is ignored %x\n", cmnd_itt(req));
1029
 
 
1030
 
                set_offset_and_length(req->lun, req_hdr->scb, &offset, &length);
1031
 
                if (cmnd_write_size(req) != length)
1032
 
                        eprintk("%x %u %u\n", cmnd_itt(req), cmnd_write_size(req), length);
1033
 
 
1034
 
                req->tio = tio_alloc(get_pgcnt(length, offset));
1035
 
                tio_set(req->tio, length, offset);
1036
 
 
1037
 
                if (req->pdu.datasize) {
1038
 
                        if (cmnd_recv_pdu(conn, req->tio, 0, req->pdu.datasize) < 0)
1039
 
                                assert(0);
1040
 
                }
1041
 
                break;
1042
 
        }
1043
 
        error:
1044
 
        default:
1045
 
                eprintk("Unsupported %x\n", req_hdr->scb[0]);
1046
 
                create_sense_rsp(req, ILLEGAL_REQUEST, 0x20, 0x0);
1047
 
                cmnd_skip_data(req);
1048
 
                break;
1049
 
        }
1050
 
 
1051
 
out:
1052
 
        return;
1053
 
}
1054
 
 
1055
 
static void data_out_start(struct iscsi_conn *conn, struct iscsi_cmnd *cmnd)
1056
 
{
1057
 
        struct iscsi_data_out_hdr *req = (struct iscsi_data_out_hdr *)&cmnd->pdu.bhs;
1058
 
        struct iscsi_cmnd *scsi_cmnd = NULL;
1059
 
        u32 offset = be32_to_cpu(req->buffer_offset);
1060
 
 
1061
 
        update_stat_sn(cmnd);
1062
 
 
1063
 
        cmnd->req = scsi_cmnd = cmnd_find_hash(conn->session, req->itt, req->ttt);
1064
 
        if (!scsi_cmnd) {
1065
 
                eprintk("unable to find scsi task %x %x\n",
1066
 
                        cmnd_itt(cmnd), cmnd_ttt(cmnd));
1067
 
                goto skip_data;
1068
 
        }
1069
 
 
1070
 
        if (scsi_cmnd->r2t_length < cmnd->pdu.datasize) {
1071
 
                eprintk("invalid data len %x %u %u\n",
1072
 
                        cmnd_itt(scsi_cmnd), cmnd->pdu.datasize, scsi_cmnd->r2t_length);
1073
 
                goto skip_data;
1074
 
        }
1075
 
 
1076
 
        if (scsi_cmnd->r2t_length + offset != cmnd_write_size(scsi_cmnd)) {
1077
 
                eprintk("%x %u %u %u\n", cmnd_itt(scsi_cmnd), scsi_cmnd->r2t_length,
1078
 
                        offset, cmnd_write_size(scsi_cmnd));
1079
 
                goto skip_data;
1080
 
        }
1081
 
 
1082
 
        scsi_cmnd->r2t_length -= cmnd->pdu.datasize;
1083
 
 
1084
 
        if (req->ttt == cpu_to_be32(ISCSI_RESERVED_TAG)) {
1085
 
                /* unsolicited burst data */
1086
 
                if (scsi_cmnd->pdu.bhs.flags & ISCSI_FLG_FINAL) {
1087
 
                        eprintk("unexpected data from %x %x\n",
1088
 
                                cmnd_itt(cmnd), cmnd_ttt(cmnd));
1089
 
                        goto skip_data;
1090
 
                }
1091
 
        }
1092
 
 
1093
 
        dprintk(D_WRITE, "%u %p %p %p %u %u\n", req->ttt, cmnd, scsi_cmnd,
1094
 
                scsi_cmnd->tio, offset, cmnd->pdu.datasize);
1095
 
 
1096
 
        if (cmnd_recv_pdu(conn, scsi_cmnd->tio, offset, cmnd->pdu.datasize) < 0)
1097
 
                goto skip_data;
1098
 
        return;
1099
 
 
1100
 
skip_data:
1101
 
        cmnd->pdu.bhs.opcode = ISCSI_OP_DATA_REJECT;
1102
 
        cmnd_skip_pdu(cmnd);
1103
 
        return;
1104
 
}
1105
 
 
1106
 
static void iscsi_session_push_cmnd(struct iscsi_cmnd *cmnd);
1107
 
 
1108
 
static void data_out_end(struct iscsi_conn *conn, struct iscsi_cmnd *cmnd)
1109
 
{
1110
 
        struct iscsi_data_out_hdr *req = (struct iscsi_data_out_hdr *) &cmnd->pdu.bhs;
1111
 
        struct iscsi_cmnd *scsi_cmnd;
1112
 
        u32 offset;
1113
 
 
1114
 
        assert(cmnd);
1115
 
        scsi_cmnd = cmnd->req;
1116
 
        assert(scsi_cmnd);
1117
 
 
1118
 
        if (conn->read_overflow) {
1119
 
                eprintk("%x %u\n", cmnd_itt(cmnd), conn->read_overflow);
1120
 
                assert(scsi_cmnd->tio);
1121
 
                offset = be32_to_cpu(req->buffer_offset);
1122
 
                offset += cmnd->pdu.datasize - conn->read_overflow;
1123
 
                if (cmnd_recv_pdu(conn, scsi_cmnd->tio, offset, conn->read_overflow) < 0)
1124
 
                        assert(0);
1125
 
                return;
1126
 
        }
1127
 
 
1128
 
        if (req->ttt == cpu_to_be32(ISCSI_RESERVED_TAG)) {
1129
 
                if (req->flags & ISCSI_FLG_FINAL) {
1130
 
                        scsi_cmnd->is_unsolicited_data = 0;
1131
 
                        iscsi_session_push_cmnd(scsi_cmnd);
1132
 
                }
1133
 
        } else {
1134
 
                /* TODO : proper error handling */
1135
 
                if (!(req->flags & ISCSI_FLG_FINAL) && scsi_cmnd->r2t_length == 0)
1136
 
                        eprintk("initiator error %x\n", cmnd_itt(scsi_cmnd));
1137
 
 
1138
 
                if (!(req->flags & ISCSI_FLG_FINAL))
1139
 
                        goto out;
1140
 
 
1141
 
                scsi_cmnd->outstanding_r2t--;
1142
 
 
1143
 
                if (scsi_cmnd->r2t_length == 0)
1144
 
                        assert(list_empty(&scsi_cmnd->pdu_list));
1145
 
 
1146
 
                iscsi_session_push_cmnd(scsi_cmnd);
1147
 
        }
1148
 
 
1149
 
out:
1150
 
        iscsi_cmnd_remove(cmnd);
1151
 
        return;
1152
 
}
1153
 
 
1154
 
static void __cmnd_abort(struct iscsi_cmnd *cmnd)
1155
 
{
1156
 
        if (cmnd_rxstart(cmnd))
1157
 
                set_cmnd_tmfabort(cmnd);
1158
 
 
1159
 
        if (cmnd_waitio(cmnd))
1160
 
                return;
1161
 
 
1162
 
        if (cmnd->conn->read_cmnd != cmnd)
1163
 
                cmnd_release(cmnd, 1);
1164
 
}
1165
 
 
1166
 
static int cmnd_abort(struct iscsi_session *session, struct iscsi_cmnd *req)
1167
 
{
1168
 
        struct iscsi_task_mgt_hdr *req_hdr =
1169
 
                                (struct iscsi_task_mgt_hdr *)&req->pdu.bhs;
1170
 
        struct iscsi_cmnd *cmnd;
1171
 
 
1172
 
        u32 min_cmd_sn = req_hdr->cmd_sn - session->max_queued_cmnds;
1173
 
 
1174
 
        req_hdr->ref_cmd_sn = be32_to_cpu(req_hdr->ref_cmd_sn);
1175
 
 
1176
 
        dprintk(D_GENERIC, "cmd_sn(%u) ref_cmd_sn(%u) min_cmd_sn(%u) rtt(%x)"
1177
 
                " lun(%d) cid(%u)\n",
1178
 
                req_hdr->cmd_sn, req_hdr->ref_cmd_sn, min_cmd_sn, req_hdr->rtt,
1179
 
                translate_lun(req_hdr->lun), req->conn->cid);
1180
 
 
1181
 
        if (after(req_hdr->ref_cmd_sn, req_hdr->cmd_sn))
1182
 
                return ISCSI_RESPONSE_FUNCTION_REJECTED;
1183
 
 
1184
 
        if (!(cmnd = cmnd_find_hash(session, req_hdr->rtt, ISCSI_RESERVED_TAG))) {
1185
 
                if (between(req_hdr->ref_cmd_sn, min_cmd_sn, req_hdr->cmd_sn))
1186
 
                        return ISCSI_RESPONSE_FUNCTION_COMPLETE;
1187
 
                else
1188
 
                        return ISCSI_RESPONSE_UNKNOWN_TASK;
1189
 
        }
1190
 
 
1191
 
        dprintk(D_GENERIC, "itt(%x) opcode(%x) scsicode(%x) lun(%d) cid(%u)\n",
1192
 
                cmnd_itt(cmnd), cmnd_opcode(cmnd), cmnd_scsicode(cmnd),
1193
 
                translate_lun(cmnd_hdr(cmnd)->lun), cmnd->conn->cid);
1194
 
 
1195
 
        if (cmnd_opcode(cmnd) == ISCSI_OP_SCSI_TASK_MGT_MSG)
1196
 
                return ISCSI_RESPONSE_FUNCTION_REJECTED;
1197
 
 
1198
 
        if (translate_lun(cmnd_hdr(cmnd)->lun) !=
1199
 
                                                translate_lun(req_hdr->lun))
1200
 
                return ISCSI_RESPONSE_FUNCTION_REJECTED;
1201
 
 
1202
 
        if (cmnd->conn && test_bit(CONN_ACTIVE, &cmnd->conn->state)) {
1203
 
                if (cmnd->conn->cid != req->conn->cid)
1204
 
                        return ISCSI_RESPONSE_FUNCTION_REJECTED;
1205
 
        } else {
1206
 
                /* Switch cmnd connection allegiance */
1207
 
        }
1208
 
 
1209
 
        __cmnd_abort(cmnd);
1210
 
 
1211
 
        return ISCSI_RESPONSE_FUNCTION_COMPLETE;
1212
 
}
1213
 
 
1214
 
static int target_reset(struct iscsi_cmnd *req, u32 lun, int all)
1215
 
{
1216
 
        struct iscsi_target *target = req->conn->session->target;
1217
 
        struct iscsi_session *session;
1218
 
        struct iscsi_conn *conn;
1219
 
        struct iscsi_cmnd *cmnd, *tmp;
1220
 
        struct iet_volume *volume;
1221
 
 
1222
 
        list_for_each_entry(session, &target->session_list, list) {
1223
 
                list_for_each_entry(conn, &session->conn_list, list) {
1224
 
                        list_for_each_entry_safe(cmnd, tmp, &conn->pdu_list, conn_list) {
1225
 
                                if (cmnd == req)
1226
 
                                        continue;
1227
 
 
1228
 
                                if (all)
1229
 
                                        __cmnd_abort(cmnd);
1230
 
                                else if (translate_lun(cmnd_hdr(cmnd)->lun)
1231
 
                                                                        == lun)
1232
 
                                        __cmnd_abort(cmnd);
1233
 
                        }
1234
 
                }
1235
 
        }
1236
 
 
1237
 
        list_for_each_entry(volume, &target->volumes, list) {
1238
 
                if (all || volume->lun == lun) {
1239
 
                        /* force release */
1240
 
                        volume_release(volume, 0, 1);
1241
 
                        /* power-on, reset, or bus device reset occurred */
1242
 
                        ua_establish_for_all_sessions(target, volume->lun,
1243
 
                                                      0x29, 0x0);
1244
 
                }
1245
 
        }
1246
 
 
1247
 
        return 0;
1248
 
}
1249
 
 
1250
 
static void task_set_abort(struct iscsi_cmnd *req)
1251
 
{
1252
 
        struct iscsi_session *session = req->conn->session;
1253
 
        struct iscsi_conn *conn;
1254
 
        struct iscsi_cmnd *cmnd, *tmp;
1255
 
 
1256
 
        list_for_each_entry(conn, &session->conn_list, list) {
1257
 
                list_for_each_entry_safe(cmnd, tmp, &conn->pdu_list, conn_list) {
1258
 
                        if (translate_lun(cmnd_hdr(cmnd)->lun)
1259
 
                                        != translate_lun(cmnd_hdr(req)->lun))
1260
 
                                continue;
1261
 
 
1262
 
                        if (before(cmnd_hdr(cmnd)->cmd_sn,
1263
 
                                        cmnd_hdr(req)->cmd_sn))
1264
 
                                __cmnd_abort(cmnd);
1265
 
                }
1266
 
        }
1267
 
}
1268
 
 
1269
 
static inline char *tmf_desc(int fun)
1270
 
{
1271
 
        static char *tmf_desc[] = {
1272
 
                "Unknown Function",
1273
 
                "Abort Task",
1274
 
                "Abort Task Set",
1275
 
                "Clear ACA",
1276
 
                "Clear Task Set",
1277
 
                "Logical Unit Reset",
1278
 
                "Target Warm Reset",
1279
 
                "Target Cold Reset",
1280
 
                "Task Reassign",
1281
 
        };
1282
 
 
1283
 
        if ((fun < ISCSI_FUNCTION_ABORT_TASK) ||
1284
 
                                (fun > ISCSI_FUNCTION_TASK_REASSIGN))
1285
 
                fun = 0;
1286
 
 
1287
 
        return tmf_desc[fun];
1288
 
}
1289
 
 
1290
 
static inline char *rsp_desc(int rsp)
1291
 
{
1292
 
        static char *rsp_desc[] = {
1293
 
                "Function Complete",
1294
 
                "Unknown Task",
1295
 
                "Unknown LUN",
1296
 
                "Task Allegiant",
1297
 
                "Failover Unsupported",
1298
 
                "Function Unsupported",
1299
 
                "No Authorization",
1300
 
                "Function Rejected",
1301
 
                "Unknown Response",
1302
 
        };
1303
 
 
1304
 
        if (((rsp < ISCSI_RESPONSE_FUNCTION_COMPLETE) ||
1305
 
                        (rsp > ISCSI_RESPONSE_NO_AUTHORIZATION)) &&
1306
 
                        (rsp != ISCSI_RESPONSE_FUNCTION_REJECTED))
1307
 
                rsp = 8;
1308
 
        else if (rsp == ISCSI_RESPONSE_FUNCTION_REJECTED)
1309
 
                rsp = 7;
1310
 
 
1311
 
        return rsp_desc[rsp];
1312
 
}
1313
 
 
1314
 
static void execute_task_management(struct iscsi_cmnd *req)
1315
 
{
1316
 
        struct iscsi_conn *conn = req->conn;
1317
 
        struct iscsi_session *session = conn->session;
1318
 
        struct iscsi_target *target = session->target;
1319
 
        struct iscsi_cmnd *rsp;
1320
 
        struct iscsi_task_mgt_hdr *req_hdr = (struct iscsi_task_mgt_hdr *)&req->pdu.bhs;
1321
 
        struct iscsi_task_rsp_hdr *rsp_hdr;
1322
 
        u32 lun;
1323
 
        int function = req_hdr->function & ISCSI_FUNCTION_MASK;
1324
 
 
1325
 
        rsp = iscsi_cmnd_create_rsp_cmnd(req, 1);
1326
 
        rsp_hdr = (struct iscsi_task_rsp_hdr *)&rsp->pdu.bhs;
1327
 
 
1328
 
        rsp_hdr->opcode = ISCSI_OP_SCSI_TASK_MGT_RSP;
1329
 
        rsp_hdr->flags = ISCSI_FLG_FINAL;
1330
 
        rsp_hdr->itt = req_hdr->itt;
1331
 
        rsp_hdr->response = ISCSI_RESPONSE_FUNCTION_COMPLETE;
1332
 
 
1333
 
        switch (function) {
1334
 
        case ISCSI_FUNCTION_ABORT_TASK:
1335
 
        case ISCSI_FUNCTION_ABORT_TASK_SET:
1336
 
        case ISCSI_FUNCTION_CLEAR_ACA:
1337
 
        case ISCSI_FUNCTION_CLEAR_TASK_SET:
1338
 
        case ISCSI_FUNCTION_LOGICAL_UNIT_RESET:
1339
 
                lun = translate_lun(req_hdr->lun);
1340
 
                if (!volume_lookup(target, lun)) {
1341
 
                        rsp_hdr->response = ISCSI_RESPONSE_UNKNOWN_LUN;
1342
 
                        goto out;
1343
 
                }
1344
 
        }
1345
 
 
1346
 
        switch (function) {
1347
 
        case ISCSI_FUNCTION_ABORT_TASK:
1348
 
                rsp_hdr->response = cmnd_abort(conn->session, req);
1349
 
                break;
1350
 
        case ISCSI_FUNCTION_ABORT_TASK_SET:
1351
 
                task_set_abort(req);
1352
 
                break;
1353
 
        case ISCSI_FUNCTION_CLEAR_ACA:
1354
 
                rsp_hdr->response = ISCSI_RESPONSE_FUNCTION_UNSUPPORTED;
1355
 
                break;
1356
 
        case ISCSI_FUNCTION_CLEAR_TASK_SET:
1357
 
                rsp_hdr->response = ISCSI_RESPONSE_FUNCTION_UNSUPPORTED;
1358
 
                break;
1359
 
        case ISCSI_FUNCTION_LOGICAL_UNIT_RESET:
1360
 
                target_reset(req, translate_lun(req_hdr->lun), 0);
1361
 
                break;
1362
 
        case ISCSI_FUNCTION_TARGET_WARM_RESET:
1363
 
        case ISCSI_FUNCTION_TARGET_COLD_RESET:
1364
 
                target_reset(req, 0, 1);
1365
 
                if (function == ISCSI_FUNCTION_TARGET_COLD_RESET)
1366
 
                        set_cmnd_close(rsp);
1367
 
                break;
1368
 
        case ISCSI_FUNCTION_TASK_REASSIGN:
1369
 
                rsp_hdr->response = ISCSI_RESPONSE_FUNCTION_UNSUPPORTED;
1370
 
                break;
1371
 
        default:
1372
 
                rsp_hdr->response = ISCSI_RESPONSE_FUNCTION_REJECTED;
1373
 
                break;
1374
 
        }
1375
 
out:
1376
 
        iprintk("%s (%02x) issued on tid:%d lun:%d by sid:%llu (%s)\n",
1377
 
                                tmf_desc(function), function, target->tid,
1378
 
                                translate_lun(req_hdr->lun), session->sid,
1379
 
                                rsp_desc(rsp_hdr->response));
1380
 
 
1381
 
        iscsi_cmnd_init_write(rsp);
1382
 
}
1383
 
 
1384
 
static void nop_hdr_setup(struct iscsi_hdr *hdr, u8 opcode, __be32 itt,
1385
 
                          __be32 ttt)
1386
 
{
1387
 
        hdr->opcode = opcode;
1388
 
        hdr->flags = ISCSI_FLG_FINAL;
1389
 
        hdr->itt = itt;
1390
 
        hdr->ttt = ttt;
1391
 
}
1392
 
 
1393
 
static void nop_out_exec(struct iscsi_cmnd *req)
1394
 
{
1395
 
        struct iscsi_cmnd *rsp;
1396
 
 
1397
 
        if (cmnd_itt(req) != cpu_to_be32(ISCSI_RESERVED_TAG)) {
1398
 
                rsp = iscsi_cmnd_create_rsp_cmnd(req, 1);
1399
 
 
1400
 
                nop_hdr_setup(&rsp->pdu.bhs, ISCSI_OP_NOP_IN, req->pdu.bhs.itt,
1401
 
                              cpu_to_be32(ISCSI_RESERVED_TAG));
1402
 
 
1403
 
                if (req->pdu.datasize)
1404
 
                        assert(req->tio);
1405
 
                else
1406
 
                        assert(!req->tio);
1407
 
 
1408
 
                if (req->tio) {
1409
 
                        tio_get(req->tio);
1410
 
                        rsp->tio = req->tio;
1411
 
                }
1412
 
 
1413
 
                assert(get_pgcnt(req->pdu.datasize, 0) < ISCSI_CONN_IOV_MAX);
1414
 
                rsp->pdu.datasize = req->pdu.datasize;
1415
 
                iscsi_cmnd_init_write(rsp);
1416
 
        } else {
1417
 
                if (req->req) {
1418
 
                        dprintk(D_GENERIC, "releasing NOP-Out %p, ttt %x; "
1419
 
                                "removing NOP-In %p, ttt %x\n", req->req,
1420
 
                                cmnd_ttt(req->req), req, cmnd_ttt(req));
1421
 
                        cmnd_release(req->req, 0);
1422
 
                }
1423
 
                iscsi_cmnd_remove(req);
1424
 
        }
1425
 
}
1426
 
 
1427
 
static void nop_in_timeout(unsigned long data)
1428
 
{
1429
 
        struct iscsi_cmnd *req = (struct iscsi_cmnd *)data;
1430
 
 
1431
 
        printk(KERN_INFO "NOP-In ping timed out - closing sid:cid %llu:%u\n",
1432
 
               req->conn->session->sid, req->conn->cid);
1433
 
        clear_cmnd_timer_active(req);
1434
 
        conn_close(req->conn);
1435
 
}
1436
 
 
1437
 
/* create a fake NOP-Out req and treat the NOP-In as our rsp to it */
1438
 
void send_nop_in(struct iscsi_conn *conn)
1439
 
{
1440
 
        struct iscsi_cmnd *req = cmnd_alloc(conn, 1);
1441
 
        struct iscsi_cmnd *rsp = iscsi_cmnd_create_rsp_cmnd(req, 0);
1442
 
 
1443
 
        req->target_task_tag = get_next_ttt(conn->session);
1444
 
 
1445
 
 
1446
 
        nop_hdr_setup(&req->pdu.bhs, ISCSI_OP_NOP_OUT,
1447
 
                      cpu_to_be32(ISCSI_RESERVED_TAG), req->target_task_tag);
1448
 
        nop_hdr_setup(&rsp->pdu.bhs, ISCSI_OP_NOP_IN,
1449
 
                      cpu_to_be32(ISCSI_RESERVED_TAG), req->target_task_tag);
1450
 
 
1451
 
        dprintk(D_GENERIC, "NOP-Out: %p, ttt %x, timer %p; "
1452
 
                "NOP-In: %p, ttt %x;\n", req, cmnd_ttt(req), &req->timer, rsp,
1453
 
                cmnd_ttt(rsp));
1454
 
 
1455
 
        init_timer(&req->timer);
1456
 
        req->timer.data = (unsigned long)req;
1457
 
        req->timer.function = nop_in_timeout;
1458
 
 
1459
 
        if (cmnd_insert_hash_ttt(req, req->target_task_tag)) {
1460
 
                eprintk("%s\n",
1461
 
                        "failed to insert fake NOP-Out into hash table");
1462
 
                cmnd_release(rsp, 0);
1463
 
                cmnd_release(req, 0);
1464
 
        } else
1465
 
                iscsi_cmnd_init_write(rsp);
1466
 
}
1467
 
 
1468
 
static void nop_in_tx_end(struct iscsi_cmnd *cmnd)
1469
 
{
1470
 
        struct iscsi_conn *conn = cmnd->conn;
1471
 
        u32 t;
1472
 
 
1473
 
        if (cmnd->pdu.bhs.ttt == cpu_to_be32(ISCSI_RESERVED_TAG))
1474
 
                return;
1475
 
 
1476
 
        /*
1477
 
         * NOP-In ping issued by the target.
1478
 
         * FIXME: Sanitize the NOP timeout earlier, during configuration
1479
 
         */
1480
 
        t = conn->session->target->trgt_param.nop_timeout;
1481
 
 
1482
 
        if (!t || t > conn->session->target->trgt_param.nop_interval) {
1483
 
                eprintk("Adjusting NOPTimeout of tid %u from %u to %u "
1484
 
                        "(== NOPInterval)\n", conn->session->target->tid,
1485
 
                        t,
1486
 
                        conn->session->target->trgt_param.nop_interval);
1487
 
                t = conn->session->target->trgt_param.nop_interval;
1488
 
                conn->session->target->trgt_param.nop_timeout = t;
1489
 
        }
1490
 
 
1491
 
        dprintk(D_GENERIC, "NOP-In %p, %x: timer %p\n", cmnd, cmnd_ttt(cmnd),
1492
 
                &cmnd->req->timer);
1493
 
 
1494
 
        set_cmnd_timer_active(cmnd->req);
1495
 
        mod_timer(&cmnd->req->timer, jiffies + HZ * t);
1496
 
}
1497
 
 
1498
 
static void logout_exec(struct iscsi_cmnd *req)
1499
 
{
1500
 
        struct iscsi_logout_req_hdr *req_hdr;
1501
 
        struct iscsi_cmnd *rsp;
1502
 
        struct iscsi_logout_rsp_hdr *rsp_hdr;
1503
 
 
1504
 
        req_hdr = (struct iscsi_logout_req_hdr *)&req->pdu.bhs;
1505
 
        rsp = iscsi_cmnd_create_rsp_cmnd(req, 1);
1506
 
        rsp_hdr = (struct iscsi_logout_rsp_hdr *)&rsp->pdu.bhs;
1507
 
        rsp_hdr->opcode = ISCSI_OP_LOGOUT_RSP;
1508
 
        rsp_hdr->flags = ISCSI_FLG_FINAL;
1509
 
        rsp_hdr->itt = req_hdr->itt;
1510
 
        set_cmnd_close(rsp);
1511
 
        iscsi_cmnd_init_write(rsp);
1512
 
}
1513
 
 
1514
 
static void iscsi_cmnd_exec(struct iscsi_cmnd *cmnd)
1515
 
{
1516
 
        dprintk(D_GENERIC, "%p,%x,%u\n", cmnd, cmnd_opcode(cmnd), cmnd->pdu.bhs.sn);
1517
 
 
1518
 
        switch (cmnd_opcode(cmnd)) {
1519
 
        case ISCSI_OP_NOP_OUT:
1520
 
                nop_out_exec(cmnd);
1521
 
                break;
1522
 
        case ISCSI_OP_SCSI_CMD:
1523
 
                scsi_cmnd_exec(cmnd);
1524
 
                break;
1525
 
        case ISCSI_OP_SCSI_TASK_MGT_MSG:
1526
 
                execute_task_management(cmnd);
1527
 
                break;
1528
 
        case ISCSI_OP_LOGOUT_CMD:
1529
 
                logout_exec(cmnd);
1530
 
                break;
1531
 
        case ISCSI_OP_SCSI_REJECT:
1532
 
                iscsi_cmnd_init_write(get_rsp_cmnd(cmnd));
1533
 
                break;
1534
 
        case ISCSI_OP_TEXT_CMD:
1535
 
        case ISCSI_OP_SNACK_CMD:
1536
 
                break;
1537
 
        default:
1538
 
                eprintk("unexpected cmnd op %x\n", cmnd_opcode(cmnd));
1539
 
                break;
1540
 
        }
1541
 
}
1542
 
 
1543
 
static void __cmnd_send_pdu(struct iscsi_conn *conn, struct tio *tio, u32 offset, u32 size)
1544
 
{
1545
 
        dprintk(D_GENERIC, "%p %u,%u\n", tio, offset, size);
1546
 
        offset += tio->offset;
1547
 
 
1548
 
        assert(offset <= tio->offset + tio->size);
1549
 
        assert(offset + size <= tio->offset + tio->size);
1550
 
 
1551
 
        conn->write_tcmnd = tio;
1552
 
        conn->write_offset = offset;
1553
 
        conn->write_size += size;
1554
 
}
1555
 
 
1556
 
static void cmnd_send_pdu(struct iscsi_conn *conn, struct iscsi_cmnd *cmnd)
1557
 
{
1558
 
        u32 size;
1559
 
        struct tio *tio;
1560
 
 
1561
 
        if (!cmnd->pdu.datasize)
1562
 
                return;
1563
 
 
1564
 
        size = (cmnd->pdu.datasize + 3) & -4;
1565
 
        tio = cmnd->tio;
1566
 
        assert(tio);
1567
 
        assert(tio->size == size);
1568
 
        __cmnd_send_pdu(conn, tio, 0, size);
1569
 
}
1570
 
 
1571
 
static void set_cork(struct socket *sock, int on)
1572
 
{
1573
 
        int opt = on;
1574
 
        mm_segment_t oldfs;
1575
 
 
1576
 
        oldfs = get_fs();
1577
 
        set_fs(get_ds());
1578
 
        sock->ops->setsockopt(sock, SOL_TCP, TCP_CORK, (void *)&opt, sizeof(opt));
1579
 
        set_fs(oldfs);
1580
 
}
1581
 
 
1582
 
void cmnd_release(struct iscsi_cmnd *cmnd, int force)
1583
 
{
1584
 
        struct iscsi_cmnd *req, *rsp;
1585
 
        int is_last = 0;
1586
 
 
1587
 
        if (!cmnd)
1588
 
                return;
1589
 
 
1590
 
/*      eprintk("%x %lx %d\n", cmnd_opcode(cmnd), cmnd->flags, force); */
1591
 
 
1592
 
        req = cmnd->req;
1593
 
        is_last = cmnd_final(cmnd);
1594
 
 
1595
 
        if (force) {
1596
 
                while (!list_empty(&cmnd->pdu_list)) {
1597
 
                        rsp = list_entry(cmnd->pdu_list.next, struct iscsi_cmnd, pdu_list);
1598
 
                        list_del_init(&rsp->list);
1599
 
                        list_del(&rsp->pdu_list);
1600
 
                        iscsi_cmnd_remove(rsp);
1601
 
                }
1602
 
                list_del_init(&cmnd->list);
1603
 
        } else
1604
 
                if (cmnd_queued(cmnd))
1605
 
                        iscsi_scsi_dequeuecmnd(cmnd);
1606
 
 
1607
 
        if (cmnd_hashed(cmnd))
1608
 
                cmnd_remove_hash(cmnd);
1609
 
 
1610
 
        if (cmnd_lunit(cmnd)) {
1611
 
                assert(cmnd->lun);
1612
 
                volume_put(cmnd->lun);
1613
 
        }
1614
 
 
1615
 
        list_del_init(&cmnd->pdu_list);
1616
 
        iscsi_cmnd_remove(cmnd);
1617
 
 
1618
 
        if (is_last) {
1619
 
                assert(!force);
1620
 
                assert(req);
1621
 
                cmnd_release(req, 0);
1622
 
        }
1623
 
 
1624
 
        return;
1625
 
}
1626
 
 
1627
 
void cmnd_tx_start(struct iscsi_cmnd *cmnd)
1628
 
{
1629
 
        struct iscsi_conn *conn = cmnd->conn;
1630
 
        struct iovec *iop;
1631
 
 
1632
 
        dprintk(D_GENERIC, "%p:%x\n", cmnd, cmnd_opcode(cmnd));
1633
 
        assert(cmnd);
1634
 
        iscsi_cmnd_set_length(&cmnd->pdu);
1635
 
 
1636
 
        set_cork(conn->sock, 1);
1637
 
 
1638
 
        conn->write_iop = iop = conn->write_iov;
1639
 
        iop->iov_base = &cmnd->pdu.bhs;
1640
 
        iop->iov_len = sizeof(cmnd->pdu.bhs);
1641
 
        iop++;
1642
 
        conn->write_size = sizeof(cmnd->pdu.bhs);
1643
 
 
1644
 
        switch (cmnd_opcode(cmnd)) {
1645
 
        case ISCSI_OP_NOP_IN:
1646
 
                if (cmnd->pdu.bhs.itt == ISCSI_RESERVED_TAG) {
1647
 
                        /* NOP-In ping generated by us. Don't advance StatSN. */
1648
 
                        cmnd_set_sn(cmnd, 0);
1649
 
                        cmnd_set_sn(cmnd->req, 0);
1650
 
                        cmnd->pdu.bhs.sn = cpu_to_be32(conn->stat_sn);
1651
 
                        cmnd->req->pdu.bhs.sn = cpu_to_be32(conn->stat_sn);
1652
 
                } else
1653
 
                        cmnd_set_sn(cmnd, 1);
1654
 
                cmnd_send_pdu(conn, cmnd);
1655
 
                break;
1656
 
        case ISCSI_OP_SCSI_RSP:
1657
 
                cmnd_set_sn(cmnd, 1);
1658
 
                cmnd_send_pdu(conn, cmnd);
1659
 
                break;
1660
 
        case ISCSI_OP_SCSI_TASK_MGT_RSP:
1661
 
                cmnd_set_sn(cmnd, 1);
1662
 
                break;
1663
 
        case ISCSI_OP_TEXT_RSP:
1664
 
                cmnd_set_sn(cmnd, 1);
1665
 
                break;
1666
 
        case ISCSI_OP_SCSI_DATA_IN:
1667
 
        {
1668
 
                struct iscsi_data_in_hdr *rsp = (struct iscsi_data_in_hdr *)&cmnd->pdu.bhs;
1669
 
                u32 offset;
1670
 
 
1671
 
                cmnd_set_sn(cmnd, (rsp->flags & ISCSI_FLG_FINAL) ? 1 : 0);
1672
 
                offset = rsp->buffer_offset;
1673
 
                rsp->buffer_offset = cpu_to_be32(offset);
1674
 
                __cmnd_send_pdu(conn, cmnd->tio, offset, cmnd->pdu.datasize);
1675
 
                break;
1676
 
        }
1677
 
        case ISCSI_OP_LOGOUT_RSP:
1678
 
                cmnd_set_sn(cmnd, 1);
1679
 
                break;
1680
 
        case ISCSI_OP_R2T:
1681
 
                cmnd_set_sn(cmnd, 0);
1682
 
                cmnd->pdu.bhs.sn = cpu_to_be32(conn->stat_sn);
1683
 
                break;
1684
 
        case ISCSI_OP_ASYNC_MSG:
1685
 
                cmnd_set_sn(cmnd, 1);
1686
 
                break;
1687
 
        case ISCSI_OP_REJECT:
1688
 
                cmnd_set_sn(cmnd, 1);
1689
 
                cmnd_send_pdu(conn, cmnd);
1690
 
                break;
1691
 
        default:
1692
 
                eprintk("unexpected cmnd op %x\n", cmnd_opcode(cmnd));
1693
 
                break;
1694
 
        }
1695
 
 
1696
 
        iop->iov_len = 0;
1697
 
        // move this?
1698
 
        conn->write_size = (conn->write_size + 3) & -4;
1699
 
        iscsi_dump_pdu(&cmnd->pdu);
1700
 
}
1701
 
 
1702
 
void cmnd_tx_end(struct iscsi_cmnd *cmnd)
1703
 
{
1704
 
        struct iscsi_conn *conn = cmnd->conn;
1705
 
 
1706
 
        dprintk(D_GENERIC, "%p:%x\n", cmnd, cmnd_opcode(cmnd));
1707
 
        switch (cmnd_opcode(cmnd)) {
1708
 
        case ISCSI_OP_NOP_IN:
1709
 
                nop_in_tx_end(cmnd);
1710
 
                break;
1711
 
        case ISCSI_OP_SCSI_RSP:
1712
 
        case ISCSI_OP_SCSI_TASK_MGT_RSP:
1713
 
        case ISCSI_OP_TEXT_RSP:
1714
 
        case ISCSI_OP_R2T:
1715
 
        case ISCSI_OP_ASYNC_MSG:
1716
 
        case ISCSI_OP_REJECT:
1717
 
        case ISCSI_OP_SCSI_DATA_IN:
1718
 
        case ISCSI_OP_LOGOUT_RSP:
1719
 
                break;
1720
 
        default:
1721
 
                eprintk("unexpected cmnd op %x\n", cmnd_opcode(cmnd));
1722
 
                assert(0);
1723
 
                break;
1724
 
        }
1725
 
 
1726
 
        if (cmnd_close(cmnd))
1727
 
                conn_close(conn);
1728
 
 
1729
 
        list_del_init(&cmnd->list);
1730
 
        set_cork(cmnd->conn->sock, 0);
1731
 
}
1732
 
 
1733
 
/**
1734
 
 * Push the command for execution.
1735
 
 * This functions reorders the commands.
1736
 
 * Called from the read thread.
1737
 
 *
1738
 
 * iscsi_session_push_cmnd -
1739
 
 * @cmnd: ptr to command
1740
 
 */
1741
 
 
1742
 
static void iscsi_session_push_cmnd(struct iscsi_cmnd *cmnd)
1743
 
{
1744
 
        struct iscsi_session *session = cmnd->conn->session;
1745
 
        struct list_head *entry;
1746
 
        u32 cmd_sn;
1747
 
 
1748
 
        if (cmnd->r2t_length) {
1749
 
                if (!cmnd->is_unsolicited_data)
1750
 
                        send_r2t(cmnd);
1751
 
                return;
1752
 
        }
1753
 
 
1754
 
        dprintk(D_GENERIC, "%p:%x %u,%u\n",
1755
 
                cmnd, cmnd_opcode(cmnd), cmnd->pdu.bhs.sn, session->exp_cmd_sn);
1756
 
 
1757
 
        if (cmnd_immediate(cmnd)) {
1758
 
                iscsi_cmnd_exec(cmnd);
1759
 
                return;
1760
 
        }
1761
 
 
1762
 
        cmd_sn = cmnd->pdu.bhs.sn;
1763
 
        if (cmd_sn == session->exp_cmd_sn) {
1764
 
                while (1) {
1765
 
                        session->exp_cmd_sn = ++cmd_sn;
1766
 
                        iscsi_cmnd_exec(cmnd);
1767
 
 
1768
 
                        if (list_empty(&session->pending_list))
1769
 
                                break;
1770
 
 
1771
 
                        cmnd = list_entry(session->pending_list.next, struct iscsi_cmnd, list);
1772
 
                        if (cmnd->pdu.bhs.sn != cmd_sn)
1773
 
                                break;
1774
 
 
1775
 
                        list_del_init(&cmnd->list);
1776
 
                        clear_cmnd_pending(cmnd);
1777
 
                }
1778
 
        } else {
1779
 
                set_cmnd_pending(cmnd);
1780
 
 
1781
 
                list_for_each(entry, &session->pending_list) {
1782
 
                        struct iscsi_cmnd *tmp = list_entry(entry, struct iscsi_cmnd, list);
1783
 
                        if (before(cmd_sn, tmp->pdu.bhs.sn))
1784
 
                                break;
1785
 
                }
1786
 
 
1787
 
                assert(list_empty(&cmnd->list));
1788
 
 
1789
 
                list_add_tail(&cmnd->list, entry);
1790
 
        }
1791
 
}
1792
 
 
1793
 
static int check_segment_length(struct iscsi_cmnd *cmnd)
1794
 
{
1795
 
        struct iscsi_conn *conn = cmnd->conn;
1796
 
        struct iscsi_sess_param *param = &conn->session->param;
1797
 
 
1798
 
        if (cmnd->pdu.datasize > param->max_recv_data_length) {
1799
 
                eprintk("data too long %x %u %u\n", cmnd_itt(cmnd),
1800
 
                        cmnd->pdu.datasize, param->max_recv_data_length);
1801
 
 
1802
 
                if (get_pgcnt(cmnd->pdu.datasize, 0) > ISCSI_CONN_IOV_MAX) {
1803
 
                        conn_close(conn);
1804
 
                        return -EINVAL;
1805
 
                }
1806
 
        }
1807
 
 
1808
 
        return 0;
1809
 
}
1810
 
 
1811
 
void cmnd_rx_start(struct iscsi_cmnd *cmnd)
1812
 
{
1813
 
        struct iscsi_conn *conn = cmnd->conn;
1814
 
        int err = 0;
1815
 
 
1816
 
        iscsi_dump_pdu(&cmnd->pdu);
1817
 
 
1818
 
        set_cmnd_rxstart(cmnd);
1819
 
        if (check_segment_length(cmnd) < 0)
1820
 
                return;
1821
 
 
1822
 
        switch (cmnd_opcode(cmnd)) {
1823
 
        case ISCSI_OP_NOP_OUT:
1824
 
                err = nop_out_start(conn, cmnd);
1825
 
                break;
1826
 
        case ISCSI_OP_SCSI_CMD:
1827
 
                if (!(err = cmnd_insert_hash(cmnd)))
1828
 
                        scsi_cmnd_start(conn, cmnd);
1829
 
                break;
1830
 
        case ISCSI_OP_SCSI_TASK_MGT_MSG:
1831
 
                err = cmnd_insert_hash(cmnd);
1832
 
                break;
1833
 
        case ISCSI_OP_SCSI_DATA_OUT:
1834
 
                data_out_start(conn, cmnd);
1835
 
                break;
1836
 
        case ISCSI_OP_LOGOUT_CMD:
1837
 
                err = cmnd_insert_hash(cmnd);
1838
 
                break;
1839
 
        case ISCSI_OP_TEXT_CMD:
1840
 
        case ISCSI_OP_SNACK_CMD:
1841
 
                err = -ISCSI_REASON_UNSUPPORTED_COMMAND;
1842
 
                break;
1843
 
        default:
1844
 
                err = -ISCSI_REASON_UNSUPPORTED_COMMAND;
1845
 
                break;
1846
 
        }
1847
 
 
1848
 
        if (err < 0) {
1849
 
                eprintk("%x %x %d\n", cmnd_opcode(cmnd), cmnd_itt(cmnd), err);
1850
 
                iscsi_cmnd_reject(cmnd, -err);
1851
 
        }
1852
 
}
1853
 
 
1854
 
void cmnd_rx_end(struct iscsi_cmnd *cmnd)
1855
 
{
1856
 
        struct iscsi_conn *conn = cmnd->conn;
1857
 
 
1858
 
        if (cmnd_tmfabort(cmnd)) {
1859
 
                cmnd_release(cmnd, 1);
1860
 
                return;
1861
 
        }
1862
 
 
1863
 
        dprintk(D_GENERIC, "%p:%x\n", cmnd, cmnd_opcode(cmnd));
1864
 
        switch (cmnd_opcode(cmnd)) {
1865
 
        case ISCSI_OP_SCSI_REJECT:
1866
 
        case ISCSI_OP_NOP_OUT:
1867
 
        case ISCSI_OP_SCSI_CMD:
1868
 
        case ISCSI_OP_SCSI_TASK_MGT_MSG:
1869
 
        case ISCSI_OP_TEXT_CMD:
1870
 
        case ISCSI_OP_LOGOUT_CMD:
1871
 
                iscsi_session_push_cmnd(cmnd);
1872
 
                break;
1873
 
        case ISCSI_OP_SCSI_DATA_OUT:
1874
 
                data_out_end(conn, cmnd);
1875
 
                break;
1876
 
        case ISCSI_OP_SNACK_CMD:
1877
 
                break;
1878
 
        case ISCSI_OP_PDU_REJECT:
1879
 
                iscsi_cmnd_init_write(get_rsp_cmnd(cmnd));
1880
 
                break;
1881
 
        case ISCSI_OP_DATA_REJECT:
1882
 
                cmnd_release(cmnd, 0);
1883
 
                break;
1884
 
        default:
1885
 
                eprintk("unexpected cmnd op %x\n", cmnd_opcode(cmnd));
1886
 
                BUG();
1887
 
                break;
1888
 
        }
1889
 
}
1890
 
 
1891
 
static void iscsi_exit(void)
1892
 
{
1893
 
        wthread_module_exit();
1894
 
 
1895
 
        unregister_chrdev(ctr_major, ctr_name);
1896
 
 
1897
 
        iet_procfs_exit();
1898
 
 
1899
 
        event_exit();
1900
 
 
1901
 
        tio_exit();
1902
 
 
1903
 
        iotype_exit();
1904
 
 
1905
 
        ua_exit();
1906
 
 
1907
 
        if (iscsi_cmnd_cache)
1908
 
                kmem_cache_destroy(iscsi_cmnd_cache);
1909
 
}
1910
 
 
1911
 
static int iscsi_init(void)
1912
 
{
1913
 
        int err = -ENOMEM;
1914
 
 
1915
 
        printk("iSCSI Enterprise Target Software - version %s\n", IET_VERSION_STRING);
1916
 
 
1917
 
        if ((ctr_major = register_chrdev(0, ctr_name, &ctr_fops)) < 0) {
1918
 
                eprintk("failed to register the control device %d\n", ctr_major);
1919
 
                return ctr_major;
1920
 
        }
1921
 
 
1922
 
        if ((err = iet_procfs_init()) < 0)
1923
 
                goto err;
1924
 
 
1925
 
        if ((err = event_init()) < 0)
1926
 
                goto err;
1927
 
 
1928
 
        iscsi_cmnd_cache = KMEM_CACHE(iscsi_cmnd, 0);
1929
 
        if (!iscsi_cmnd_cache)
1930
 
                goto err;
1931
 
 
1932
 
        err = ua_init();
1933
 
        if (err < 0)
1934
 
                goto err;
1935
 
 
1936
 
        if ((err = tio_init()) < 0)
1937
 
                goto err;
1938
 
 
1939
 
        if ((err = iotype_init()) < 0)
1940
 
                goto err;
1941
 
 
1942
 
        if ((err = wthread_module_init()) < 0)
1943
 
                goto err;
1944
 
 
1945
 
        return 0;
1946
 
 
1947
 
err:
1948
 
        iscsi_exit();
1949
 
        return err;
1950
 
}
1951
 
 
1952
 
module_param(worker_thread_pool_size, ulong, S_IRUGO);
1953
 
MODULE_PARM_DESC(worker_thread_pool_size,
1954
 
                 "Size of the worker thread pool "
1955
 
                 "(0 = dedicated threads per target (default))");
1956
 
 
1957
 
module_param(debug_enable_flags, ulong, S_IRUGO | S_IWUSR);
1958
 
MODULE_PARM_DESC(debug_enable_flags,
1959
 
                 "debug bitmask, low bits (0 ... 8) used, see iscsi_dbg.h");
1960
 
 
1961
 
module_init(iscsi_init);
1962
 
module_exit(iscsi_exit);
1963
 
 
1964
 
MODULE_VERSION(IET_VERSION_STRING);
1965
 
MODULE_LICENSE("GPL");
1966
 
MODULE_DESCRIPTION("iSCSI Enterprise Target");
1967
 
MODULE_AUTHOR("IET development team <iscsitarget-devel@lists.sourceforge.net>");