[BACK]Return to softraidvar.h CVS log [TXT][DIR] Up to [local] / sys / dev

Annotation of sys/dev/softraidvar.h, Revision 1.1

1.1     ! nbrk        1: /* $OpenBSD: softraidvar.h,v 1.32 2007/06/06 23:06:02 deraadt Exp $ */
        !             2: /*
        !             3:  * Copyright (c) 2006 Marco Peereboom <marco@peereboom.us>
        !             4:  *
        !             5:  * Permission to use, copy, modify, and distribute this software for any
        !             6:  * purpose with or without fee is hereby granted, provided that the above
        !             7:  * copyright notice and this permission notice appear in all copies.
        !             8:  *
        !             9:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
        !            10:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
        !            11:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
        !            12:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
        !            13:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
        !            14:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
        !            15:  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
        !            16:  */
        !            17:
        !            18: #include <dev/biovar.h>
        !            19:
        !            20: #include <sys/buf.h>
        !            21: #include <sys/queue.h>
        !            22: #include <sys/rwlock.h>
        !            23:
        !            24: #include <scsi/scsi_all.h>
        !            25: #include <scsi/scsi_disk.h>
        !            26: #include <scsi/scsiconf.h>
        !            27:
        !            28: #define DEVNAME(_s)     ((_s)->sc_dev.dv_xname)
        !            29:
        !            30: /* #define SR_DEBUG */
        !            31: #ifdef SR_DEBUG
        !            32: extern u_int32_t               sr_debug;
        !            33: #define DPRINTF(x...)          do { if (sr_debug) printf(x); } while(0)
        !            34: #define DNPRINTF(n,x...)       do { if (sr_debug & n) printf(x); } while(0)
        !            35: #define        SR_D_CMD                0x0001
        !            36: #define        SR_D_INTR               0x0002
        !            37: #define        SR_D_MISC               0x0004
        !            38: #define        SR_D_IOCTL              0x0008
        !            39: #define        SR_D_CCB                0x0010
        !            40: #define        SR_D_WU                 0x0020
        !            41: #define        SR_D_META               0x0040
        !            42: #define        SR_D_DIS                0x0080
        !            43: #define        SR_D_STATE              0x0100
        !            44: #else
        !            45: #define DPRINTF(x...)
        !            46: #define DNPRINTF(n,x...)
        !            47: #endif
        !            48:
        !            49: #define        SR_MAXFER               MAXPHYS
        !            50: #define        SR_MAX_LD               1
        !            51: #define        SR_MAX_CMDS             16
        !            52: #define        SR_MAX_STATES           7
        !            53:
        !            54: /* forward define to prevent dependency goo */
        !            55: struct sr_softc;
        !            56:
        !            57: #define SR_UUID_MAX            4
        !            58: struct sr_uuid {
        !            59:        u_int32_t               sui_id[SR_UUID_MAX];
        !            60: } __packed;
        !            61:
        !            62: struct sr_ccb {
        !            63:        struct buf              ccb_buf;        /* MUST BE FIRST!! */
        !            64:
        !            65:        struct sr_workunit      *ccb_wu;
        !            66:        struct sr_discipline    *ccb_dis;
        !            67:
        !            68:        int                     ccb_target;
        !            69:        int                     ccb_state;
        !            70: #define SR_CCB_FREE            0
        !            71: #define SR_CCB_INPROGRESS      1
        !            72: #define SR_CCB_OK              2
        !            73: #define SR_CCB_FAILED          3
        !            74:
        !            75:        TAILQ_ENTRY(sr_ccb)     ccb_link;
        !            76: } __packed;
        !            77:
        !            78: TAILQ_HEAD(sr_ccb_list, sr_ccb);
        !            79:
        !            80: struct sr_workunit {
        !            81:        struct scsi_xfer        *swu_xs;
        !            82:        struct sr_discipline    *swu_dis;
        !            83:
        !            84:        int                     swu_state;
        !            85: #define SR_WU_FREE             0
        !            86: #define SR_WU_INPROGRESS       1
        !            87: #define SR_WU_OK               2
        !            88: #define SR_WU_FAILED           3
        !            89: #define SR_WU_PARTIALLYFAILED  4
        !            90: #define SR_WU_DEFERRED         5
        !            91: #define SR_WU_PENDING          6
        !            92: #define SR_WU_RESTART          7
        !            93: #define SR_WU_REQUEUE          8
        !            94:
        !            95:        int                     swu_fake;       /* faked wu */
        !            96:        /* workunit io range */
        !            97:        daddr64_t               swu_blk_start;
        !            98:        daddr64_t               swu_blk_end;
        !            99:
        !           100:        /* in flight totals */
        !           101:        u_int32_t               swu_ios_complete;
        !           102:        u_int32_t               swu_ios_failed;
        !           103:        u_int32_t               swu_ios_succeeded;
        !           104:
        !           105:        /* number of ios that makes up the whole work unit */
        !           106:        u_int32_t               swu_io_count;
        !           107:
        !           108:        /* colliding wu */
        !           109:        struct sr_workunit      *swu_collider;
        !           110:
        !           111:        /* all ios that make up this workunit */
        !           112:        struct sr_ccb_list      swu_ccb;
        !           113:
        !           114:        TAILQ_ENTRY(sr_workunit) swu_link;
        !           115: };
        !           116:
        !           117: TAILQ_HEAD(sr_wu_list, sr_workunit);
        !           118:
        !           119: /* RAID 1 */
        !           120: #define SR_RAID1_NOWU          16
        !           121: struct sr_raid1 {
        !           122:        u_int32_t               sr1_counter;
        !           123: };
        !           124:
        !           125: /* RAID C */
        !           126: #define SR_RAIDC_NOWU          16
        !           127: struct sr_raidc {
        !           128:        u_int64_t               src_sid;
        !           129:        char                    src_key[64];
        !           130: };
        !           131:
        !           132: #define SR_META_SIZE           32      /* save space at chunk beginning */
        !           133: #define SR_META_OFFSET         16      /* skip 8192 bytes at chunk beginning */
        !           134: #define SR_META_VERSION                1       /* bump when sr_metadata changes */
        !           135: struct sr_metadata {
        !           136:        /* do not change order of ssd_magic, ssd_version & ssd_checksum */
        !           137:        u_int64_t               ssd_magic;      /* magic id */
        !           138: #define        SR_MAGIC                0x4d4152436372616dLLU
        !           139:        u_int8_t                ssd_version;    /* meta data version */
        !           140:        u_int8_t                ssd_pad1[3];
        !           141:        u_int32_t               ssd_flags;      /* flags */
        !           142:
        !           143:        /* meta-data */
        !           144:        u_int32_t               ssd_checksum;   /* xor of the structure */
        !           145:        u_int32_t               ssd_size;       /* sizeof(sr_metadata) */
        !           146:        u_int32_t               ssd_ondisk;     /* on disk version counter */
        !           147:        u_int32_t               ssd_pad2;
        !           148:        struct sr_uuid          ssd_uuid;       /* unique identifier */
        !           149:
        !           150:        /* virtual disk data */
        !           151:        u_int32_t               ssd_vd_ver;     /* vd structure version */
        !           152:        u_int32_t               ssd_vd_size;    /* vd structure size */
        !           153:        u_int32_t               ssd_vd_volid;   /* volume id */
        !           154:        u_int32_t               ssd_vd_chk;     /* vd structure xor */
        !           155:
        !           156:        /* chunk data */
        !           157:        u_int32_t               ssd_chunk_ver;  /* chunk structure version */
        !           158:        u_int32_t               ssd_chunk_no;   /* number of chunks */
        !           159:        u_int32_t               ssd_chunk_size; /* chunk structure size */
        !           160:        u_int32_t               ssd_chunk_id;   /* chunk identifier */
        !           161:        u_int32_t               ssd_chunk_chk;  /* chunk structure xor */
        !           162:        u_int32_t               ssd_pad3;
        !           163:
        !           164:        /* optional metadata */
        !           165:        u_int32_t               ssd_opt_ver;    /* optinal meta version */
        !           166:        u_int32_t               ssd_opt_no;     /* nr of optional md elements */
        !           167:        u_int32_t               ssd_opt_size;   /* sizeof optional metadata */
        !           168:        u_int32_t               ssd_opt_chk;    /* optional metadata xor */
        !           169: } __packed;
        !           170:
        !           171: struct sr_metadata_list {
        !           172:        struct sr_metadata      *sml_metadata;
        !           173:        dev_t                   sml_mm;
        !           174:        int                     sml_used;
        !           175:
        !           176:        SLIST_ENTRY(sr_metadata_list) sml_link;
        !           177: };
        !           178:
        !           179: SLIST_HEAD(sr_metadata_list_head, sr_metadata_list);
        !           180:
        !           181: #define SR_OPT_VERSION         1       /* bump when sr_opt_meta changes */
        !           182: struct sr_opt_meta {
        !           183:        u_int32_t               som_type;
        !           184:        u_int32_t               som_pad;
        !           185: #define SR_OPT_INVALID         0x00
        !           186: #define SR_OPT_CRYPTO          0x01
        !           187:        union {
        !           188:                struct sr_raidc smm_crypto;
        !           189:        }                       som_meta;
        !           190: };
        !           191:
        !           192: #define SR_CHUNK_VERSION       1       /* bump when sr_chunk_meta changes */
        !           193: struct sr_chunk_meta {
        !           194:        u_int32_t               scm_volid;      /* vd we belong to */
        !           195:        u_int32_t               scm_chunk_id;   /* chunk id */
        !           196:        u_int32_t               scm_status;     /* use bio bioc_disk status */
        !           197:        u_int32_t               scm_pad1;
        !           198:        char                    scm_devname[32];/* /dev/XXXXX */
        !           199:        int64_t                 scm_size;       /* size of partition */
        !           200:        int64_t                 scm_coerced_size; /* coerced size of part */
        !           201:        struct sr_uuid          scm_uuid;       /* unique identifier */
        !           202: } __packed;
        !           203:
        !           204: struct sr_chunk {
        !           205:        struct sr_chunk_meta    src_meta;       /* chunk meta data */
        !           206:
        !           207:        /* runtime data */
        !           208:        dev_t                   src_dev_mm;     /* major/minor */
        !           209:
        !           210:        /* helper members before metadata makes it onto the chunk  */
        !           211:        int                     src_meta_ondisk;/* set when meta is on disk */
        !           212:        char                    src_devname[32];
        !           213:        int64_t                 src_size;
        !           214:
        !           215:        SLIST_ENTRY(sr_chunk)   src_link;
        !           216: };
        !           217:
        !           218: SLIST_HEAD(sr_chunk_head, sr_chunk);
        !           219:
        !           220: #define SR_VOL_VERSION 1       /* bump when sr_vol_meta changes */
        !           221: struct sr_vol_meta {
        !           222:        u_int32_t               svm_volid;      /* volume id */
        !           223:        u_int32_t               svm_status;     /* use bioc_vol status */
        !           224:        u_int32_t               svm_flags;      /* flags */
        !           225: #define        SR_VOL_DIRTY            0x01
        !           226:        u_int32_t               svm_level;      /* raid level */
        !           227:        int64_t                 svm_size;       /* virtual disk size */
        !           228:        char                    svm_devname[32];/* /dev/XXXXX */
        !           229:        char                    svm_vendor[8];  /* scsi vendor */
        !           230:        char                    svm_product[16];/* scsi product */
        !           231:        char                    svm_revision[4];/* scsi revision */
        !           232:        u_int32_t               svm_no_chunk;   /* number of chunks */
        !           233:        struct sr_uuid          svm_uuid;       /* volume unique identifier */
        !           234: } __packed;
        !           235:
        !           236: struct sr_volume {
        !           237:        struct sr_vol_meta      sv_meta;        /* meta data */
        !           238:
        !           239:        /* runtime data */
        !           240:        struct sr_chunk_head    sv_chunk_list;  /* linked list of all chunks */
        !           241:        struct sr_chunk         **sv_chunks;    /* array to same chunks */
        !           242:
        !           243:        /* sensors */
        !           244:        struct ksensor          sv_sensor;
        !           245:        struct ksensordev       sv_sensordev;
        !           246:        int                     sv_sensor_valid;
        !           247: };
        !           248:
        !           249: struct sr_discipline {
        !           250:        struct sr_softc         *sd_sc;         /* link back to sr softc */
        !           251:        u_int8_t                sd_type;        /* type of discipline */
        !           252: #define        SR_MD_RAID0             0
        !           253: #define        SR_MD_RAID1             1
        !           254: #define        SR_MD_RAID5             2
        !           255: #define        SR_MD_CACHE             3
        !           256: #define        SR_MD_RAIDC             4
        !           257:        char                    sd_name[10];    /* human readable dis name */
        !           258:        u_int8_t                sd_scsibus;     /* scsibus discipline uses */
        !           259:        struct scsi_link        sd_link;        /* link to midlayer */
        !           260:
        !           261:        union {
        !           262:            struct sr_raid1     mdd_raid1;
        !           263:            struct sr_raidc     mdd_raidc;
        !           264:        }                       sd_dis_specific;/* dis specific members */
        !           265: #define mds                    sd_dis_specific
        !           266:
        !           267:        /* discipline metadata */
        !           268:        struct sr_metadata      *sd_meta;       /* in memory copy of metadata */
        !           269:        u_int32_t               sd_meta_flags;
        !           270:
        !           271:        int                     sd_sync;
        !           272:        int                     sd_must_flush;
        !           273:
        !           274:        struct device           *sd_scsibus_dev;
        !           275:        void                    (*sd_shutdownhook)(void *);
        !           276:
        !           277:        /* discipline volume */
        !           278:        struct sr_volume        sd_vol;         /* volume associated */
        !           279:
        !           280:        /* discipline resources */
        !           281:        struct sr_ccb           *sd_ccb;
        !           282:        struct sr_ccb_list      sd_ccb_freeq;
        !           283:        u_int32_t               sd_max_ccb_per_wu;
        !           284:
        !           285:        struct sr_workunit      *sd_wu;         /* all workunits */
        !           286:        u_int32_t               sd_max_wu;
        !           287:
        !           288:        struct sr_wu_list       sd_wu_freeq;    /* free wu queue */
        !           289:        struct sr_wu_list       sd_wu_pendq;    /* pending wu queue */
        !           290:        struct sr_wu_list       sd_wu_defq;     /* deferred wu queue */
        !           291:
        !           292:        /* discipline stats */
        !           293:        int                     sd_wu_pending;
        !           294:        u_int64_t               sd_wu_collisions;
        !           295:
        !           296:        /* discipline functions */
        !           297:        int                     (*sd_alloc_resources)(struct sr_discipline *);
        !           298:        int                     (*sd_assemble_volume)(void *);
        !           299:        int                     (*sd_bringup_volume)(void *);
        !           300:        int                     (*sd_shutdown_volume)(void *);
        !           301:        int                     (*sd_free_resources)(struct sr_discipline *);
        !           302:        int                     (*sd_quiesce_io)(struct sr_discipline *);
        !           303:        void                    (*sd_set_chunk_state)(struct sr_discipline *,
        !           304:                                    int, int);
        !           305:        void                    (*sd_set_vol_state)(struct sr_discipline *);
        !           306:
        !           307:        /* SCSI emulation */
        !           308:        struct scsi_sense_data  sd_scsi_sense;
        !           309:        int                     (*sd_scsi_rw)(struct sr_workunit *);
        !           310:        int                     (*sd_scsi_sync)(struct sr_workunit *);
        !           311:        int                     (*sd_scsi_tur)(struct sr_workunit *);
        !           312:        int                     (*sd_scsi_start_stop)(struct sr_workunit *);
        !           313:        int                     (*sd_scsi_inquiry)(struct sr_workunit *);
        !           314:        int                     (*sd_scsi_read_cap)(struct sr_workunit *);
        !           315:        int                     (*sd_scsi_req_sense)(struct sr_workunit *);
        !           316: };
        !           317:
        !           318: struct sr_softc {
        !           319:        struct device           sc_dev;
        !           320:
        !           321:        int                     (*sc_ioctl)(struct device *, u_long, caddr_t);
        !           322:
        !           323:        struct rwlock           sc_lock;
        !           324:
        !           325:        int                     sc_sensors_running;
        !           326:        /*
        !           327:         * during scsibus attach this is the discipline that is in use
        !           328:         * this variable is protected by sc_lock and splhigh
        !           329:         */
        !           330:        struct sr_discipline    *sc_attach_dis;
        !           331:
        !           332:        /*
        !           333:         * XXX expensive, alternative would be nice but has to be cheap
        !           334:         * since the scsibus lookup happens on each IO
        !           335:         */
        !           336: #define SR_MAXSCSIBUS          256
        !           337:        struct sr_discipline    *sc_dis[SR_MAXSCSIBUS]; /* scsibus is u_int8_t */
        !           338: };

CVSweb