⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iscsi.h

📁 iscsi企业级target.很好用
💻 H
字号:
/* * Copyright (C) 2002-2003 Ardis Technolgies <roman@ardistech.com> * * Released under the terms of the GNU GPL v2.0. */#ifndef __ISCSI_H__#define __ISCSI_H__#include <linux/pagemap.h>#include <linux/seq_file.h>#include <linux/mm.h>#include <linux/crypto.h>#include <net/sock.h>#include "iscsi_hdr.h"#include "iet_u.h"struct iscsi_sess_param {	int initial_r2t;	int immediate_data;	int max_connections;	int max_recv_data_length;	int max_xmit_data_length;	int max_burst_length;	int first_burst_length;	int default_wait_time;	int default_retain_time;	int max_outstanding_r2t;	int data_pdu_inorder;	int data_sequence_inorder;	int error_recovery_level;	int header_digest;	int data_digest;	int ofmarker;	int ifmarker;	int ofmarkint;	int ifmarkint;};struct iscsi_trgt_param {	int wthreads;	int target_type;	int queued_cmnds;};struct tio {	u32 pg_cnt;	pgoff_t idx;	u32 offset;	u32 size;	struct page **pvec;	atomic_t count;};struct network_thread_info {	struct task_struct *task;	unsigned long flags;	struct list_head active_conns;	spinlock_t nthread_lock;	void (*old_state_change)(struct sock *);	void (*old_data_ready)(struct sock *, int);};struct worker_thread_info;struct worker_thread {	struct task_struct *w_task;	struct list_head w_list;	struct worker_thread_info *w_info;};struct worker_thread_info {	spinlock_t wthread_lock;	u32 nr_running_wthreads;	struct list_head wthread_list;	struct list_head work_queue;	wait_queue_head_t wthread_sleep;};struct iscsi_cmnd;struct target_type {	int id;	int (*execute_cmnd) (struct iscsi_cmnd *);};enum iscsi_device_state {	IDEV_RUNNING,	IDEV_DEL,};struct iscsi_target {	struct list_head t_list;	u32 tid;	char name[ISCSI_NAME_LEN];	struct iscsi_sess_param sess_param;	struct iscsi_trgt_param trgt_param;	atomic_t nr_volumes;	struct list_head volumes;	struct list_head session_list;	struct network_thread_info nthread_info;	struct worker_thread_info wthread_info;	struct semaphore target_sem;};struct iscsi_queue {	spinlock_t queue_lock;	struct iscsi_cmnd *ordered_cmnd;	struct list_head wait_list;	int active_cnt;};struct iet_volume {	u32 lun;	enum iscsi_device_state l_state;	atomic_t l_count;	struct iscsi_target *target;	struct list_head list;	struct iscsi_queue queue;	u8 scsi_id[SCSI_ID_LEN];	u32 blk_shift;	u64 blk_cnt;	struct iotype *iotype;	void *private;};#define IET_HASH_ORDER		8#define	cmnd_hashfn(itt)	hash_long((itt), IET_HASH_ORDER)struct iscsi_session {	struct list_head list;	struct iscsi_target *target;	char *initiator;	u64 sid;	u32 exp_cmd_sn;	u32 max_cmd_sn;	struct iscsi_sess_param param;	u32 max_queued_cmnds;	struct list_head conn_list;	struct list_head pending_list;	spinlock_t cmnd_hash_lock;	struct list_head cmnd_hash[1 << IET_HASH_ORDER];	u32 next_ttt;};enum connection_state_bit {	CONN_ACTIVE,	CONN_CLOSING,};#define ISCSI_CONN_IOV_MAX	(((256 << 10) >> PAGE_SHIFT) + 1)struct iscsi_conn {	struct list_head list;			/* list entry in session list */	struct iscsi_session *session;		/* owning session */	u16 cid;	unsigned long state;	u32 stat_sn;	u32 exp_stat_sn;	int hdigest_type;	int ddigest_type;	struct list_head poll_list;	struct file *file;	struct socket *sock;	spinlock_t list_lock;	atomic_t nr_cmnds;	atomic_t nr_busy_cmnds;	struct list_head pdu_list;		/* in/outcoming pdus */	struct list_head write_list;		/* list of data pdus to be sent */	struct iscsi_cmnd *read_cmnd;	struct msghdr read_msg;	struct iovec read_iov[ISCSI_CONN_IOV_MAX];	u32 read_size;	u32 read_overflow;	int read_state;	struct iscsi_cmnd *write_cmnd;	struct iovec write_iov[ISCSI_CONN_IOV_MAX];	struct iovec *write_iop;	struct tio *write_tcmnd;	u32 write_size;	u32 write_offset;	int write_state;	struct crypto_tfm *rx_digest_tfm;	struct crypto_tfm *tx_digest_tfm;};struct iscsi_pdu {	struct iscsi_hdr bhs;	void *ahs;	unsigned int ahssize;	unsigned int datasize;};typedef void (iet_show_info_t)(struct seq_file *seq, struct iscsi_target *target);struct iscsi_cmnd {	struct list_head list;	struct list_head conn_list;	unsigned long state;	unsigned long flags;	struct iscsi_conn *conn;	struct iet_volume *lun;	struct iscsi_pdu pdu;	struct list_head pdu_list;	struct list_head hash_list;	struct tio *tio;	u32 r2t_sn;	u32 r2t_length;	u32 is_unsolicited_data;	u32 target_task_tag;	u32 outstanding_r2t;	u32 hdigest;	u32 ddigest;	struct iscsi_cmnd *req;};#define ISCSI_OP_SCSI_REJECT	ISCSI_OP_VENDOR1_CMD#define ISCSI_OP_PDU_REJECT	ISCSI_OP_VENDOR2_CMD#define ISCSI_OP_DATA_REJECT	ISCSI_OP_VENDOR3_CMD#define ISCSI_OP_SCSI_ABORT	ISCSI_OP_VENDOR4_CMD/* iscsi.c */extern struct iscsi_cmnd *cmnd_alloc(struct iscsi_conn *, int);extern void cmnd_rx_start(struct iscsi_cmnd *);extern void cmnd_rx_end(struct iscsi_cmnd *);extern void cmnd_tx_start(struct iscsi_cmnd *);extern void cmnd_tx_end(struct iscsi_cmnd *);extern void cmnd_release(struct iscsi_cmnd *, int);extern void send_data_rsp(struct iscsi_cmnd *, int (*)(struct iscsi_cmnd *));extern void send_scsi_rsp(struct iscsi_cmnd *, int (*)(struct iscsi_cmnd *));/* conn.c */extern struct iscsi_conn *conn_lookup(struct iscsi_session *, u16);extern int conn_add(struct iscsi_session *, struct conn_info *);extern int conn_del(struct iscsi_session *, struct conn_info *);extern int conn_free(struct iscsi_conn *);extern void conn_close(struct iscsi_conn *);extern void conn_info_show(struct seq_file *, struct iscsi_session *);/* nthread.c */extern int nthread_init(struct iscsi_target *);extern int nthread_start(struct iscsi_target *);extern int nthread_stop(struct iscsi_target *);extern void nthread_wakeup(struct iscsi_target *);/* wthread.c */extern int wthread_init(struct iscsi_target *);extern int wthread_start(struct iscsi_target *);extern int wthread_stop(struct iscsi_target *);extern void wthread_queue(struct iscsi_cmnd *);extern struct target_type *target_type_array[];/* target.c */extern int target_lock(struct iscsi_target *, int);extern void target_unlock(struct iscsi_target *);struct iscsi_target *target_lookup_by_id(u32);extern int target_add(struct target_info *);extern int target_del(u32 id);/* config.c */extern int iet_procfs_init(void);extern void iet_procfs_exit(void);extern int iet_info_show(struct seq_file *, iet_show_info_t *);/* session.c */extern struct file_operations session_seq_fops;extern struct iscsi_session *session_lookup(struct iscsi_target *, u64);extern int session_add(struct iscsi_target *, struct session_info *);extern int session_del(struct iscsi_target *, u64);/* volume.c */extern struct file_operations volume_seq_fops;extern int volume_add(struct iscsi_target *, struct volume_info *);extern int iscsi_volume_del(struct iscsi_target *, struct volume_info *);extern void iscsi_volume_destroy(struct iet_volume *);extern struct iet_volume *volume_lookup(struct iscsi_target *, u32);extern struct iet_volume *volume_get(struct iscsi_target *, u32);extern void volume_put(struct iet_volume *);/* tio.c */extern int tio_init(void);extern void tio_exit(void);extern struct tio *tio_alloc(int);extern void tio_get(struct tio *);extern void tio_put(struct tio *);extern void tio_set(struct tio *, u32, loff_t);extern int tio_read(struct iet_volume *, struct tio *);extern int tio_write(struct iet_volume *, struct tio *);extern int tio_sync(struct iet_volume *, struct tio *);/* iotype.c */extern struct iotype *get_iotype(const char *name);extern void put_iotype(struct iotype *iot);/* params.c */extern int iscsi_param_set(struct iscsi_target *, struct iscsi_param_info *, int);/* target_disk.c */extern struct target_type disk_ops;/* event.c */extern int event_send(u32, u64, u32, u32, int);extern int event_init(void);extern void event_exit(void);#define get_pgcnt(size, offset)	((((size) + ((offset) & ~PAGE_CACHE_MASK)) + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT)static inline void iscsi_cmnd_get_length(struct iscsi_pdu *pdu){#if defined(__BIG_ENDIAN)	pdu->ahssize = pdu->bhs.length.ahslength * 4;	pdu->datasize = pdu->bhs.length.datalength;#elif defined(__LITTLE_ENDIAN)	pdu->ahssize = (pdu->bhs.length & 0xff) * 4;	pdu->datasize = be32_to_cpu(pdu->bhs.length & ~0xff);#else#error#endif}static inline void iscsi_cmnd_set_length(struct iscsi_pdu *pdu){#if defined(__BIG_ENDIAN)	pdu->bhs.length.ahslength = pdu->ahssize / 4;	pdu->bhs.length.datalength = pdu->datasize;#elif defined(__LITTLE_ENDIAN)	pdu->bhs.length = cpu_to_be32(pdu->datasize) | (pdu->ahssize / 4);#else#error#endif}#define cmnd_hdr(cmnd) ((struct iscsi_scsi_cmd_hdr *) (&((cmnd)->pdu.bhs)))#define cmnd_ttt(cmnd) cpu_to_be32((cmnd)->pdu.bhs.ttt)#define cmnd_itt(cmnd) cpu_to_be32((cmnd)->pdu.bhs.itt)#define cmnd_opcode(cmnd) ((cmnd)->pdu.bhs.opcode & ISCSI_OPCODE_MASK)#define cmnd_scsicode(cmnd) cmnd_hdr(cmnd)->scb[0]#define	SECTOR_SIZE_BITS	9enum cmnd_flags {	CMND_hashed,	CMND_queued,	CMND_final,	CMND_waitio,	CMND_close,	CMND_lunit,	CMND_pending,};#define set_cmnd_hashed(cmnd)	set_bit(CMND_hashed, &(cmnd)->flags)#define cmnd_hashed(cmnd)	test_bit(CMND_hashed, &(cmnd)->flags)#define set_cmnd_queued(cmnd)	set_bit(CMND_queued, &(cmnd)->flags)#define cmnd_queued(cmnd)	test_bit(CMND_queued, &(cmnd)->flags)#define set_cmnd_final(cmnd)	set_bit(CMND_final, &(cmnd)->flags)#define cmnd_final(cmnd)	test_bit(CMND_final, &(cmnd)->flags)#define set_cmnd_waitio(cmnd)	set_bit(CMND_waitio, &(cmnd)->flags)#define cmnd_waitio(cmnd)	test_bit(CMND_waitio, &(cmnd)->flags)#define set_cmnd_close(cmnd)	set_bit(CMND_close, &(cmnd)->flags)#define cmnd_close(cmnd)	test_bit(CMND_close, &(cmnd)->flags)#define set_cmnd_lunit(cmnd)	set_bit(CMND_lunit, &(cmnd)->flags)#define cmnd_lunit(cmnd)	test_bit(CMND_lunit, &(cmnd)->flags)#define set_cmnd_pending(cmnd)	set_bit(CMND_pending, &(cmnd)->flags)#define clear_cmnd_pending(cmnd)	clear_bit(CMND_pending, &(cmnd)->flags)#define cmnd_pending(cmnd)	test_bit(CMND_pending, &(cmnd)->flags)#define VENDOR_ID	"IET"#define PRODUCT_ID	"VIRTUAL-DISK"#define PRODUCT_REV	"0"#endif	/* __ISCSI_H__ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -