Annotation of embedaddon/istgt/src/istgt_lu.h, revision 1.1.1.2

1.1       misho       1: /*
1.1.1.2 ! misho       2:  * Copyright (C) 2008-2012 Daisuke Aoyama <aoyama@peach.ne.jp>.
1.1       misho       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>
1.1.1.2 ! misho      33: #ifdef HAVE_UUID_H
        !            34: #include <uuid.h>
        !            35: #endif
1.1       misho      36: #include "istgt.h"
1.1.1.2 ! misho      37: #include "istgt_queue.h"
1.1       misho      38: 
1.1.1.2 ! misho      39: #define MAX_LU_LUN 64
1.1       misho      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)
1.1.1.2 ! misho      95: #define ISTGT_LU_WORK_ATS_BLOCK_SIZE (1ULL * 1024ULL * 1024ULL)
1.1       misho      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;
1.1.1.2 ! misho     237:        int queue_check;
1.1       misho     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;
1.1.1.2 ! misho     264:        size_t iobufsize;
1.1       misho     265:        uint8_t *data;
1.1.1.2 ! misho     266:        size_t data_len;
        !           267:        size_t alloc_len;
1.1       misho     268: 
                    269:        int status;
                    270:        uint8_t *sense_data;
1.1.1.2 ! misho     271:        size_t sense_data_len;
        !           272:        size_t sense_alloc_len;
1.1       misho     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,
1.1.1.2 ! misho     285:        ISTGT_LU_TASK_REQUPDPDU = 2,
1.1       misho     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;
1.1.1.2 ! misho     309:        size_t alloc_len;
1.1       misho     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: 
1.1.1.2 ! misho     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: 
1.1       misho     406: #endif /* ISTGT_LU_H */

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