File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / istgt / src / istgt_lu.h
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Oct 9 09:13:23 2012 UTC (12 years, 6 months ago) by misho
Branches: istgt, MAIN
CVS tags: v20121028, v20120901, HEAD
dhcp 4.1 r7

    1: /*
    2:  * Copyright (C) 2008-2012 Daisuke Aoyama <aoyama@peach.ne.jp>.
    3:  * All rights reserved.
    4:  *
    5:  * Redistribution and use in source and binary forms, with or without
    6:  * modification, are permitted provided that the following conditions
    7:  * are met:
    8:  * 1. Redistributions of source code must retain the above copyright
    9:  *    notice, this list of conditions and the following disclaimer.
   10:  * 2. Redistributions in binary form must reproduce the above copyright
   11:  *    notice, this list of conditions and the following disclaimer in the
   12:  *    documentation and/or other materials provided with the distribution.
   13:  *
   14:  * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   15:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   16:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   17:  * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
   18:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   19:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   20:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   21:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   22:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   23:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   24:  * SUCH DAMAGE.
   25:  *
   26:  */
   27: 
   28: #ifndef ISTGT_LU_H
   29: #define ISTGT_LU_H
   30: 
   31: #include <pthread.h>
   32: #include <time.h>
   33: #ifdef HAVE_UUID_H
   34: #include <uuid.h>
   35: #endif
   36: #include "istgt.h"
   37: #include "istgt_queue.h"
   38: 
   39: #define MAX_LU_LUN 64
   40: #define MAX_LU_LUN_SLOT 8
   41: #define MAX_LU_TSIH 256
   42: #define MAX_LU_MAP 256
   43: #define MAX_LU_SERIAL_STRING 32
   44: #define MAX_LU_RESERVE 256
   45: #define MAX_LU_RESERVE_IPT 256
   46: #define MAX_LU_QUEUE_DEPTH 256
   47: 
   48: #define USE_LU_TAPE_DLT8000
   49: 
   50: #define DEFAULT_LU_BLOCKLEN 512
   51: #define DEFAULT_LU_BLOCKLEN_DISK DEFAULT_LU_BLOCKLEN
   52: #define DEFAULT_LU_BLOCKLEN_DVD 2048
   53: #define DEFAULT_LU_BLOCKLEN_TAPE DEFAULT_LU_BLOCKLEN
   54: #define DEFAULT_LU_QUEUE_DEPTH 32
   55: #define DEFAULT_LU_ROTATIONRATE 7200	/* 7200 rpm */
   56: #define DEFAULT_LU_FORMFACTOR 0x02	/* 3.5 inch */
   57: 
   58: #if defined (__FreeBSD__)
   59: #define DEFAULT_LU_VENDOR "FreeBSD"
   60: #elif defined (__NetBSD__)
   61: #define DEFAULT_LU_VENDOR "NetBSD"
   62: #elif defined (__OpenBSD__)
   63: #define DEFAULT_LU_VENDOR "OpenBSD"
   64: #else
   65: //#define DEFAULT_LU_VENDOR "PEACHNW"
   66: #define DEFAULT_LU_VENDOR "FreeBSD"
   67: #endif
   68: 
   69: #define DEFAULT_LU_VENDOR_DISK DEFAULT_LU_VENDOR
   70: #define DEFAULT_LU_VENDOR_DVD  DEFAULT_LU_VENDOR
   71: #ifndef USE_LU_TAPE_DLT8000
   72: #define DEFAULT_LU_VENDOR_TAPE DEFAULT_LU_VENDOR
   73: #else
   74: #define DEFAULT_LU_VENDOR_TAPE "QUANTUM"
   75: #endif /* !USE_LU_TAPE_DLT8000 */
   76: #define DEFAULT_LU_PRODUCT      "iSCSI UNIT"
   77: #define DEFAULT_LU_PRODUCT_DISK "iSCSI DISK"
   78: #define DEFAULT_LU_PRODUCT_DVD  "iSCSI DVD"
   79: #ifndef USE_LU_TAPE_DLT8000
   80: #define DEFAULT_LU_PRODUCT_TAPE "iSCSI TAPE"
   81: #else
   82: #define DEFAULT_LU_PRODUCT_TAPE "DLT8000"
   83: #endif /* !USE_LU_TAPE_DLT8000 */
   84: #define DEFAULT_LU_REVISION "0001"
   85: #define DEFAULT_LU_REVISION_DISK DEFAULT_LU_REVISION
   86: #define DEFAULT_LU_REVISION_DVD  DEFAULT_LU_REVISION
   87: #ifndef USE_LU_TAPE_DLT8000
   88: #define DEFAULT_LU_REVISION_TAPE DEFAULT_LU_REVISION
   89: #else
   90: #define DEFAULT_LU_REVISION_TAPE "C001"
   91: #endif /* !USE_LU_TAPE_DLT8000 */
   92: #define MAX_INQUIRY_SERIAL 16
   93: 
   94: #define ISTGT_LU_WORK_BLOCK_SIZE (1ULL * 1024ULL * 1024ULL)
   95: #define ISTGT_LU_WORK_ATS_BLOCK_SIZE (1ULL * 1024ULL * 1024ULL)
   96: #define ISTGT_LU_MAX_WRITE_CACHE_SIZE (8ULL * 1024ULL * 1024ULL)
   97: #define ISTGT_LU_MEDIA_SIZE_MIN (1ULL * 1024ULL * 1024ULL)
   98: #define ISTGT_LU_MEDIA_EXTEND_UNIT (256ULL * 1024ULL * 1024ULL)
   99: #define ISTGT_LU_1GB (1ULL * 1024ULL * 1024ULL * 1024ULL)
  100: #define ISTGT_LU_1MB (1ULL * 1024ULL * 1024ULL)
  101: 
  102: typedef enum {
  103: 	ISTGT_LU_FLAG_MEDIA_READONLY = 0x00000001,
  104: 	ISTGT_LU_FLAG_MEDIA_AUTOSIZE = 0x00000002,
  105: 	ISTGT_LU_FLAG_MEDIA_EXTEND   = 0x00000010,
  106: 	ISTGT_LU_FLAG_MEDIA_DYNAMIC  = 0x00000020,
  107: } ISTGT_LU_FLAG;
  108: 
  109: typedef enum {
  110: 	ISTGT_LU_TYPE_NONE = 0,
  111: 	ISTGT_LU_TYPE_PASS = 1,
  112: 	ISTGT_LU_TYPE_DISK = 2,
  113: 	ISTGT_LU_TYPE_DVD = 3,
  114: 	ISTGT_LU_TYPE_TAPE = 4,
  115: } ISTGT_LU_TYPE;
  116: 
  117: typedef enum {
  118: 	ISTGT_LU_LUN_TYPE_NONE = 0,
  119: 	ISTGT_LU_LUN_TYPE_DEVICE = 1,
  120: 	ISTGT_LU_LUN_TYPE_STORAGE = 2,
  121: 	ISTGT_LU_LUN_TYPE_REMOVABLE = 3,
  122: 	ISTGT_LU_LUN_TYPE_SLOT = 4,
  123: } ISTGT_LU_LUN_TYPE;
  124: 
  125: typedef struct istgt_lu_device_t {
  126: 	char *file;
  127: } ISTGT_LU_DEVICE;
  128: 
  129: typedef struct istgt_lu_storage_t {
  130: 	int fd;
  131: 	char *file;
  132: 	uint64_t size;
  133: } ISTGT_LU_STORAGE;
  134: 
  135: typedef struct istgt_lu_removable_t {
  136: 	int type;
  137: 	int id;
  138: 	int flags;
  139: 	int fd;
  140: 	char *file;
  141: 	uint64_t size;
  142: } ISTGT_LU_REMOVABLE;
  143: 
  144: typedef struct istgt_lu_slot_t {
  145: 	int maxslot;
  146: 	int present[MAX_LU_LUN_SLOT];
  147: 	int flags[MAX_LU_LUN_SLOT];
  148: 	char *file[MAX_LU_LUN_SLOT];
  149: 	uint64_t size[MAX_LU_LUN_SLOT];
  150: } ISTGT_LU_SLOT;
  151: 
  152: typedef struct istgt_lu_lun_t {
  153: 	int type;
  154: 	union {
  155: 		ISTGT_LU_DEVICE device;
  156: 		ISTGT_LU_STORAGE storage;
  157: 		ISTGT_LU_REMOVABLE removable;
  158: 		ISTGT_LU_SLOT slot;
  159: 	} u;
  160: 	int rotationrate;
  161: 	int formfactor;
  162: 	int readcache;
  163: 	int writecache;
  164: 	char *serial;
  165: 	void *spec;
  166: } ISTGT_LU_LUN;
  167: typedef ISTGT_LU_LUN *ISTGT_LU_LUN_Ptr;
  168: 
  169: typedef struct istgt_lu_tsih_t {
  170: 	int tag;
  171: 	uint16_t tsih;
  172: 	char *initiator_port;
  173: } ISTGT_LU_TSIH;
  174: 
  175: typedef enum {
  176: 	AAS_ACTIVE_OPTIMIZED = 0x00,
  177: 	AAS_ACTIVE_NON_OPTIMIZED = 0x01,
  178: 	AAS_STANDBY = 0x02,
  179: 	AAS_UNAVAILABLE = 0x03,
  180: 	AAS_TRANSITIONING = 0x0F,
  181: 
  182: 	AAS_STATUS_NO = 0x0000,
  183: 	AAS_STATUS_STPG = 0x0100,
  184: 	AAS_STATUS_IMPLICIT = 0x0200,
  185: } ISTGT_LU_AAS;
  186: 
  187: typedef struct istgt_lu_map_t {
  188: 	int pg_tag;
  189: 	int pg_aas;
  190: 	int ig_tag;
  191: } ISTGT_LU_MAP;
  192: 
  193: typedef struct istgt_lu_t {
  194: 	int num;
  195: 	char *name;
  196: 	char *alias;
  197: 
  198: 	char *inq_vendor;
  199: 	char *inq_product;
  200: 	char *inq_revision;
  201: 	char *inq_serial;
  202: 
  203: 	ISTGT_Ptr istgt;
  204: 	ISTGT_STATE state;
  205: 	pthread_mutex_t mutex;
  206: 	pthread_mutex_t state_mutex;
  207: 	pthread_mutex_t queue_mutex;
  208: 	pthread_cond_t queue_cond;
  209: 	pthread_t thread;
  210: 
  211: 	uint16_t last_tsih;
  212: 
  213: 	int no_auth_chap;
  214: 	int auth_chap;
  215: 	int auth_chap_mutual;
  216: 	int auth_group;
  217: 	int header_digest;
  218: 	int data_digest;
  219: 
  220: 	int MaxOutstandingR2T;
  221: 	int DefaultTime2Wait;
  222: 	int DefaultTime2Retain;
  223: 	int FirstBurstLength;
  224: 	int MaxBurstLength;
  225: 	int MaxRecvDataSegmentLength;
  226: 	int InitialR2T;
  227: 	int ImmediateData;
  228: 	int DataPDUInOrder;
  229: 	int DataSequenceInOrder;
  230: 	int ErrorRecoveryLevel;
  231: 
  232: 	int type;
  233: 	int online;
  234: 	int readonly;
  235: 	int blocklen;
  236: 	int queue_depth;
  237: 	int queue_check;
  238: 
  239: 	int maxlun;
  240: 	ISTGT_LU_LUN lun[MAX_LU_LUN];
  241: 	int maxtsih;
  242: 	ISTGT_LU_TSIH tsih[MAX_LU_TSIH];
  243: 	int maxmap;
  244: 	ISTGT_LU_MAP map[MAX_LU_MAP];
  245: } ISTGT_LU;
  246: typedef ISTGT_LU *ISTGT_LU_Ptr;
  247: 
  248: typedef struct istgt_lu_cmd_t {
  249: 	struct iscsi_pdu_t *pdu;
  250: 	ISTGT_LU_Ptr lu;
  251: 
  252: 	int I_bit;
  253: 	int F_bit;
  254: 	int R_bit;
  255: 	int W_bit;
  256: 	int Attr_bit;
  257: 	uint64_t lun;
  258: 	uint32_t task_tag;
  259: 	uint32_t transfer_len;
  260: 	uint32_t CmdSN;
  261: 	uint8_t *cdb;
  262: 
  263: 	uint8_t *iobuf;
  264: 	size_t iobufsize;
  265: 	uint8_t *data;
  266: 	size_t data_len;
  267: 	size_t alloc_len;
  268: 
  269: 	int status;
  270: 	uint8_t *sense_data;
  271: 	size_t sense_data_len;
  272: 	size_t sense_alloc_len;
  273: } ISTGT_LU_CMD;
  274: typedef ISTGT_LU_CMD *ISTGT_LU_CMD_Ptr;
  275: 
  276: enum {
  277: 	ISTGT_LU_TASK_RESULT_IMMEDIATE = 0,
  278: 	ISTGT_LU_TASK_RESULT_QUEUE_OK = 1,
  279: 	ISTGT_LU_TASK_RESULT_QUEUE_FULL = 2,
  280: } ISTGT_LU_TASK_RESULT;
  281: 
  282: enum {
  283: 	ISTGT_LU_TASK_RESPONSE = 0,
  284: 	ISTGT_LU_TASK_REQPDU = 1,
  285: 	ISTGT_LU_TASK_REQUPDPDU = 2,
  286: } ISTGT_LU_TASK_TYPE;
  287: 
  288: typedef struct istgt_lu_task_t {
  289: 	int type;
  290: 
  291: 	struct istgt_conn_t *conn;
  292: 	char initiator_name[MAX_INITIATOR_NAME];
  293: 	char initiator_port[MAX_INITIATOR_NAME];
  294: 	ISTGT_LU_CMD lu_cmd;
  295: 	int lun;
  296: 	pthread_t thread;
  297: 	int use_cond;
  298: 	pthread_mutex_t trans_mutex;
  299: 	pthread_cond_t trans_cond;
  300: 	pthread_cond_t exec_cond;
  301: 
  302: 	time_t create_time;
  303: 	int condwait;
  304: 
  305: 	int dup_iobuf;
  306: 	uint8_t *iobuf;
  307: 	uint8_t *data;
  308: 	uint8_t *sense_data;
  309: 	size_t alloc_len;
  310: 
  311: 	int offset;
  312: 	int req_execute;
  313: 	int req_transfer_out;
  314: 	int error;
  315: 	int abort;
  316: 	int execute;
  317: 	int complete;
  318: 	int lock;
  319: } ISTGT_LU_TASK;
  320: typedef ISTGT_LU_TASK *ISTGT_LU_TASK_Ptr;
  321: 
  322: /* lu_disk.c */
  323: typedef struct istgt_lu_pr_key_t {
  324: 	uint64_t key;
  325: 
  326: 	/* transport IDs */
  327: 	char *registered_initiator_port;
  328: 	char *registered_target_port;
  329: 	/* PERSISTENT RESERVE OUT received from */
  330: 	int pg_idx; /* relative target port */
  331: 	int pg_tag; /* target port group */
  332: 
  333: 	int ninitiator_ports;
  334: 	char **initiator_ports;
  335: 	int all_tpg;
  336: } ISTGT_LU_PR_KEY;
  337: 
  338: typedef struct istgt_lu_disk_t {
  339: 	ISTGT_LU_Ptr lu;
  340: 	int num;
  341: 	int lun;
  342: 
  343: 	int fd;
  344: 	const char *file;
  345: 	const char *disktype;
  346: 	void *exspec;
  347: 	uint64_t fsize;
  348: 	uint64_t foffset;
  349: 	uint64_t size;
  350: 	uint64_t blocklen;
  351: 	uint64_t blockcnt;
  352: 
  353: #ifdef HAVE_UUID_H
  354: 	uuid_t uuid;
  355: #endif /* HAVE_UUID_H */
  356: 
  357: 	/* cache flags */
  358: 	int read_cache;
  359: 	int write_cache;
  360: 	/* parts for cache */
  361: 	int wbufsize;
  362: 	uint8_t *wbuf;
  363: 	uint64_t woffset;
  364: 	uint64_t wnbytes;
  365: 	int req_write_cache;
  366: 	int err_write_cache;
  367: 
  368: 	/* thin provisioning */
  369: 	int thin_provisioning;
  370: 
  371: 	/* for ats */
  372: 	pthread_mutex_t ats_mutex;
  373: 	int watssize;
  374: 	uint8_t *watsbuf;
  375: 
  376: 	int queue_depth;
  377: 	pthread_mutex_t cmd_queue_mutex;
  378: 	ISTGT_QUEUE cmd_queue;
  379: 	pthread_mutex_t wait_lu_task_mutex;
  380: 	ISTGT_LU_TASK_Ptr wait_lu_task;
  381: 
  382: 	/* PERSISTENT RESERVE */
  383: 	int npr_keys;
  384: 	ISTGT_LU_PR_KEY pr_keys[MAX_LU_RESERVE];
  385: 	uint32_t pr_generation;
  386: 
  387: 	char *rsv_port;
  388: 	uint64_t rsv_key;
  389: 	int rsv_scope;
  390: 	int rsv_type;
  391: 
  392: 	/* SCSI sense code */
  393: 	volatile int sense;
  394: 
  395: 	/* entry */
  396: 	int (*open)(struct istgt_lu_disk_t *spec, int flags, int mode);
  397: 	int (*close)(struct istgt_lu_disk_t *spec);
  398: 	int64_t (*seek)(struct istgt_lu_disk_t *spec, uint64_t offset);
  399: 	int64_t (*read)(struct istgt_lu_disk_t *spec, void *buf, uint64_t nbytes);
  400: 	int64_t (*write)(struct istgt_lu_disk_t *spec, const void *buf, uint64_t nbytes);
  401: 	int64_t (*sync)(struct istgt_lu_disk_t *spec, uint64_t offset, uint64_t nbytes);
  402: 	int (*allocate)(struct istgt_lu_disk_t *spec);
  403: 	int (*setcache)(struct istgt_lu_disk_t *spec);
  404: } ISTGT_LU_DISK;
  405: 
  406: #endif /* ISTGT_LU_H */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>