2
* Copyright (C) 2002-2003 Ardis Technolgies <roman@ardistech.com>
4
* Released under the terms of the GNU GPL v2.0.
10
#include <linux/pagemap.h>
11
#include <linux/seq_file.h>
13
#include <linux/crypto.h>
14
#include <linux/scatterlist.h>
17
#include "iscsi_hdr.h"
20
struct iscsi_sess_param {
24
int max_recv_data_length;
25
int max_xmit_data_length;
27
int first_burst_length;
28
int default_wait_time;
29
int default_retain_time;
30
int max_outstanding_r2t;
32
int data_sequence_inorder;
33
int error_recovery_level;
42
struct iscsi_trgt_param {
60
struct network_thread_info {
61
struct task_struct *task;
63
struct list_head active_conns;
65
spinlock_t nthread_lock;
67
void (*old_state_change)(struct sock *);
68
void (*old_data_ready)(struct sock *, int);
69
void (*old_write_space)(struct sock *);
72
struct worker_thread_info;
74
struct worker_thread {
75
struct task_struct *w_task;
76
struct list_head w_list;
77
struct worker_thread_info *w_info;
80
struct worker_thread_info {
81
spinlock_t wthread_lock;
83
u32 nr_running_wthreads;
85
struct list_head wthread_list;
86
struct list_head work_queue;
88
wait_queue_head_t wthread_sleep;
95
int (*execute_cmnd) (struct iscsi_cmnd *);
98
enum iscsi_device_state {
103
struct iscsi_target {
104
struct list_head t_list;
107
char name[ISCSI_NAME_LEN];
109
struct iscsi_sess_param sess_param;
110
struct iscsi_trgt_param trgt_param;
113
struct list_head volumes;
114
struct list_head session_list;
116
struct network_thread_info nthread_info;
117
/* Points either to own list or global pool */
118
struct worker_thread_info * wthread_info;
120
struct semaphore target_sem;
124
spinlock_t queue_lock;
125
struct iscsi_cmnd *ordered_cmnd;
126
struct list_head wait_list;
133
enum iscsi_device_state l_state;
136
struct iscsi_target *target;
137
struct list_head list;
139
struct iscsi_queue queue;
141
u8 scsi_id[SCSI_ID_LEN];
142
u8 scsi_sn[SCSI_SN_LEN];
148
spinlock_t reserve_lock;
152
struct iotype *iotype;
162
#define LUReadonly(lu) test_bit(LU_READONLY, &(lu)->flags)
163
#define SetLUReadonly(lu) set_bit(LU_READONLY, &(lu)->flags)
165
#define LUWCache(lu) test_bit(LU_WCACHE, &(lu)->flags)
166
#define SetLUWCache(lu) set_bit(LU_WCACHE, &(lu)->flags)
167
#define ClearLUWCache(lu) clear_bit(LU_WCACHE, &(lu)->flags)
169
#define LURCache(lu) test_bit(LU_RCACHE, &(lu)->flags)
170
#define SetLURCache(lu) set_bit(LU_RCACHE, &(lu)->flags)
171
#define ClearLURCache(lu) clear_bit(LU_RCACHE, &(lu)->flags)
173
#define IET_HASH_ORDER 8
174
#define cmnd_hashfn(itt) hash_long((itt), IET_HASH_ORDER)
176
struct iscsi_session {
177
struct list_head list;
178
struct iscsi_target *target;
186
struct iscsi_sess_param param;
187
u32 max_queued_cmnds;
189
struct list_head conn_list;
191
struct list_head pending_list;
193
spinlock_t cmnd_hash_lock;
194
struct list_head cmnd_hash[1 << IET_HASH_ORDER];
199
enum connection_state_bit {
205
#define ISCSI_CONN_IOV_MAX (((256 << 10) >> PAGE_SHIFT) + 1)
208
struct list_head list; /* list entry in session list */
209
struct iscsi_session *session; /* owning session */
220
struct list_head poll_list;
224
spinlock_t list_lock;
226
atomic_t nr_busy_cmnds;
227
struct list_head pdu_list; /* in/outcoming pdus */
228
struct list_head write_list; /* list of data pdus to be sent */
230
struct iscsi_cmnd *read_cmnd;
231
struct msghdr read_msg;
232
struct iovec read_iov[ISCSI_CONN_IOV_MAX];
237
struct iscsi_cmnd *write_cmnd;
238
struct iovec write_iov[ISCSI_CONN_IOV_MAX];
239
struct iovec *write_iop;
240
struct tio *write_tcmnd;
245
struct hash_desc rx_hash;
246
struct hash_desc tx_hash;
247
struct scatterlist hash_sg[ISCSI_CONN_IOV_MAX];
251
struct iscsi_hdr bhs;
253
unsigned int ahssize;
254
unsigned int datasize;
257
typedef void (iet_show_info_t)(struct seq_file *seq, struct iscsi_target *target);
260
struct list_head list;
261
struct list_head conn_list;
263
struct iscsi_conn *conn;
264
struct iet_volume *lun;
266
struct iscsi_pdu pdu;
267
struct list_head pdu_list;
269
struct list_head hash_list;
275
u32 is_unsolicited_data;
282
struct iscsi_cmnd *req;
285
#define ISCSI_OP_SCSI_REJECT ISCSI_OP_VENDOR1_CMD
286
#define ISCSI_OP_PDU_REJECT ISCSI_OP_VENDOR2_CMD
287
#define ISCSI_OP_DATA_REJECT ISCSI_OP_VENDOR3_CMD
288
#define ISCSI_OP_SCSI_ABORT ISCSI_OP_VENDOR4_CMD
291
extern unsigned long worker_thread_pool_size;
292
extern struct iscsi_cmnd *cmnd_alloc(struct iscsi_conn *, int);
293
extern void cmnd_rx_start(struct iscsi_cmnd *);
294
extern void cmnd_rx_end(struct iscsi_cmnd *);
295
extern void cmnd_tx_start(struct iscsi_cmnd *);
296
extern void cmnd_tx_end(struct iscsi_cmnd *);
297
extern void cmnd_release(struct iscsi_cmnd *, int);
298
extern void send_data_rsp(struct iscsi_cmnd *, int (*)(struct iscsi_cmnd *));
299
extern void send_scsi_rsp(struct iscsi_cmnd *, int (*)(struct iscsi_cmnd *));
302
extern struct iscsi_conn *conn_lookup(struct iscsi_session *, u16);
303
extern int conn_add(struct iscsi_session *, struct conn_info *);
304
extern int conn_del(struct iscsi_session *, struct conn_info *);
305
extern int conn_free(struct iscsi_conn *);
306
extern void conn_close(struct iscsi_conn *);
307
extern void conn_info_show(struct seq_file *, struct iscsi_session *);
310
extern int nthread_init(struct iscsi_target *);
311
extern int nthread_start(struct iscsi_target *);
312
extern int nthread_stop(struct iscsi_target *);
313
extern void __nthread_wakeup(struct network_thread_info *);
314
extern void nthread_wakeup(struct iscsi_target *);
317
extern int wthread_init(struct worker_thread_info *info);
318
extern int wthread_start(struct worker_thread_info *info, int wthreads, u32 tid);
319
extern int wthread_stop(struct worker_thread_info *info);
320
extern void wthread_queue(struct iscsi_cmnd *);
321
extern struct target_type *target_type_array[];
322
extern int wthread_module_init(void);
323
extern void wthread_module_exit(void);
324
extern struct worker_thread_info *worker_thread_pool;
327
extern int target_lock(struct iscsi_target *, int);
328
extern void target_unlock(struct iscsi_target *);
329
struct iscsi_target *target_lookup_by_id(u32);
330
extern int target_add(struct target_info *);
331
extern int target_del(u32 id);
332
extern struct seq_operations iet_seq_op;
335
extern int iet_procfs_init(void);
336
extern void iet_procfs_exit(void);
337
extern int iet_info_show(struct seq_file *, iet_show_info_t *);
340
extern struct file_operations session_seq_fops;
341
extern struct iscsi_session *session_lookup(struct iscsi_target *, u64);
342
extern int session_add(struct iscsi_target *, struct session_info *);
343
extern int session_del(struct iscsi_target *, u64);
346
extern struct file_operations volume_seq_fops;
347
extern int volume_add(struct iscsi_target *, struct volume_info *);
348
extern int iscsi_volume_del(struct iscsi_target *, struct volume_info *);
349
extern void iscsi_volume_destroy(struct iet_volume *);
350
extern struct iet_volume *volume_lookup(struct iscsi_target *, u32);
351
extern struct iet_volume *volume_get(struct iscsi_target *, u32);
352
extern void volume_put(struct iet_volume *);
353
extern int volume_reserve(struct iet_volume *volume, u64 sid);
354
extern int volume_release(struct iet_volume *volume, u64 sid, int force);
355
extern int is_volume_reserved(struct iet_volume *volume, u64 sid);
358
extern int tio_init(void);
359
extern void tio_exit(void);
360
extern struct tio *tio_alloc(int);
361
extern void tio_get(struct tio *);
362
extern void tio_put(struct tio *);
363
extern void tio_set(struct tio *, u32, loff_t);
364
extern int tio_read(struct iet_volume *, struct tio *);
365
extern int tio_write(struct iet_volume *, struct tio *);
366
extern int tio_sync(struct iet_volume *, struct tio *);
369
extern struct iotype *get_iotype(const char *name);
370
extern void put_iotype(struct iotype *iot);
373
extern int iscsi_param_set(struct iscsi_target *, struct iscsi_param_info *, int);
376
extern struct target_type disk_ops;
379
extern int event_send(u32, u64, u32, u32, int);
380
extern int event_init(void);
381
extern void event_exit(void);
383
#define get_pgcnt(size, offset) ((((size) + ((offset) & ~PAGE_CACHE_MASK)) + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT)
385
static inline void iscsi_cmnd_get_length(struct iscsi_pdu *pdu)
387
#if defined(__BIG_ENDIAN)
388
pdu->ahssize = pdu->bhs.length.ahslength * 4;
389
pdu->datasize = pdu->bhs.length.datalength;
390
#elif defined(__LITTLE_ENDIAN)
391
pdu->ahssize = (pdu->bhs.length & 0xff) * 4;
392
pdu->datasize = be32_to_cpu(pdu->bhs.length & ~0xff);
398
static inline void iscsi_cmnd_set_length(struct iscsi_pdu *pdu)
400
#if defined(__BIG_ENDIAN)
401
pdu->bhs.length.ahslength = pdu->ahssize / 4;
402
pdu->bhs.length.datalength = pdu->datasize;
403
#elif defined(__LITTLE_ENDIAN)
404
pdu->bhs.length = cpu_to_be32(pdu->datasize) | (pdu->ahssize / 4);
410
#define cmnd_hdr(cmnd) ((struct iscsi_scsi_cmd_hdr *) (&((cmnd)->pdu.bhs)))
411
#define cmnd_ttt(cmnd) cpu_to_be32((cmnd)->pdu.bhs.ttt)
412
#define cmnd_itt(cmnd) cpu_to_be32((cmnd)->pdu.bhs.itt)
413
#define cmnd_opcode(cmnd) ((cmnd)->pdu.bhs.opcode & ISCSI_OPCODE_MASK)
414
#define cmnd_scsicode(cmnd) cmnd_hdr(cmnd)->scb[0]
416
#define SECTOR_SIZE_BITS 9
430
#define set_cmnd_hashed(cmnd) set_bit(CMND_hashed, &(cmnd)->flags)
431
#define cmnd_hashed(cmnd) test_bit(CMND_hashed, &(cmnd)->flags)
433
#define set_cmnd_queued(cmnd) set_bit(CMND_queued, &(cmnd)->flags)
434
#define cmnd_queued(cmnd) test_bit(CMND_queued, &(cmnd)->flags)
436
#define set_cmnd_final(cmnd) set_bit(CMND_final, &(cmnd)->flags)
437
#define cmnd_final(cmnd) test_bit(CMND_final, &(cmnd)->flags)
439
#define set_cmnd_waitio(cmnd) set_bit(CMND_waitio, &(cmnd)->flags)
440
#define cmnd_waitio(cmnd) test_bit(CMND_waitio, &(cmnd)->flags)
442
#define set_cmnd_close(cmnd) set_bit(CMND_close, &(cmnd)->flags)
443
#define cmnd_close(cmnd) test_bit(CMND_close, &(cmnd)->flags)
445
#define set_cmnd_lunit(cmnd) set_bit(CMND_lunit, &(cmnd)->flags)
446
#define cmnd_lunit(cmnd) test_bit(CMND_lunit, &(cmnd)->flags)
448
#define set_cmnd_pending(cmnd) set_bit(CMND_pending, &(cmnd)->flags)
449
#define clear_cmnd_pending(cmnd) clear_bit(CMND_pending, &(cmnd)->flags)
450
#define cmnd_pending(cmnd) test_bit(CMND_pending, &(cmnd)->flags)
452
#define set_cmnd_tmfabort(cmnd) set_bit(CMND_tmfabort, &(cmnd)->flags)
453
#define cmnd_tmfabort(cmnd) test_bit(CMND_tmfabort, &(cmnd)->flags)
455
#define set_cmnd_rxstart(cmnd) set_bit(CMND_rxstart, &(cmnd)->flags)
456
#define cmnd_rxstart(cmnd) test_bit(CMND_rxstart, &(cmnd)->flags)
458
#define VENDOR_ID "IET"
459
#define PRODUCT_ID "VIRTUAL-DISK"
460
#define PRODUCT_REV "0"
462
#endif /* __ISCSI_H__ */