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

Annotation of sys/dev/raidframe/rf_stripelocks.h, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: rf_stripelocks.h,v 1.3 2002/12/16 07:01:05 tdeval Exp $       */
        !             2: /*     $NetBSD: rf_stripelocks.h,v 1.3 1999/02/05 00:06:18 oster Exp $ */
        !             3:
        !             4: /*
        !             5:  * Copyright (c) 1995 Carnegie-Mellon University.
        !             6:  * All rights reserved.
        !             7:  *
        !             8:  * Author: Mark Holland
        !             9:  *
        !            10:  * Permission to use, copy, modify and distribute this software and
        !            11:  * its documentation is hereby granted, provided that both the copyright
        !            12:  * notice and this permission notice appear in all copies of the
        !            13:  * software, derivative works or modified versions, and any portions
        !            14:  * thereof, and that both notices appear in supporting documentation.
        !            15:  *
        !            16:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
        !            17:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
        !            18:  * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
        !            19:  *
        !            20:  * Carnegie Mellon requests users of this software to return to
        !            21:  *
        !            22:  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
        !            23:  *  School of Computer Science
        !            24:  *  Carnegie Mellon University
        !            25:  *  Pittsburgh PA 15213-3890
        !            26:  *
        !            27:  * any improvements or extensions that they make and grant Carnegie the
        !            28:  * rights to redistribute these changes.
        !            29:  */
        !            30:
        !            31: /*****************************************************************************
        !            32:  *
        !            33:  * stripelocks.h -- Header file for locking stripes.
        !            34:  *
        !            35:  * Note that these functions are called from the execution routines of certain
        !            36:  * DAG Nodes, and so they must be NON-BLOCKING to assure maximum parallelism
        !            37:  * in the DAG. Accordingly, when a node wants to acquire a lock, it calls
        !            38:  * AcquireStripeLock, supplying a pointer to a callback function. If the lock
        !            39:  * is free at the time of the call, 0 is returned, indicating that the lock
        !            40:  * has been acquired. If the lock is not free, 1 is returned, and a copy of
        !            41:  * the function pointer and argument are held in the lock table. When the
        !            42:  * lock becomes free, the callback function is invoked.
        !            43:  *
        !            44:  *****************************************************************************/
        !            45:
        !            46: #ifndef        _RF__RF_STRIPELOCKS_H_
        !            47: #define        _RF__RF_STRIPELOCKS_H_
        !            48:
        !            49: #include <sys/buf.h>
        !            50:
        !            51: #include "rf_types.h"
        !            52: #include "rf_threadstuff.h"
        !            53: #include "rf_general.h"
        !            54:
        !            55: struct RF_LockReqDesc_s {
        !            56:        RF_IoType_t               type;         /* Read or write. */
        !            57:        RF_int64                  start, stop;  /*
        !            58:                                                 * Start and end of range to
        !            59:                                                 * be locked.
        !            60:                                                 */
        !            61:        RF_int64                  start2, stop2;/*
        !            62:                                                 * Start and end of 2nd range
        !            63:                                                 * to be locked.
        !            64:                                                 */
        !            65:        void                    (*cbFunc) (struct buf *);
        !            66:                                                /* Callback function. */
        !            67:        void                     *cbArg;        /*
        !            68:                                                 * Argument to callback
        !            69:                                                 * function.
        !            70:                                                 */
        !            71:        RF_LockReqDesc_t         *next;         /* Next element in chain. */
        !            72:        RF_LockReqDesc_t         *templink;     /*
        !            73:                                                 * For making short-lived lists
        !            74:                                                 * of request descriptors.
        !            75:                                                 */
        !            76: };
        !            77:
        !            78: #define        RF_ASSERT_VALID_LOCKREQ(_lr_)   do {                            \
        !            79:        RF_ASSERT(RF_IO_IS_R_OR_W((_lr_)->type));                       \
        !            80: } while (0)
        !            81:
        !            82: struct RF_StripeLockDesc_s {
        !            83:        RF_StripeNum_t           stripeID;      /* The stripe ID. */
        !            84:        RF_LockReqDesc_t        *granted;       /*
        !            85:                                                 * Unordered list of granted
        !            86:                                                 * requests.
        !            87:                                                 */
        !            88:        RF_LockReqDesc_t        *waitersH;      /* FIFO queue of all waiting
        !            89:                                                 * reqs, both read and write
        !            90:                                                 * (Head and Tail).
        !            91:                                                 */
        !            92:        RF_LockReqDesc_t        *waitersT;
        !            93:        int                      nWriters;      /*
        !            94:                                                 * Number of writers either
        !            95:                                                 * granted or waiting.
        !            96:                                                 */
        !            97:        RF_StripeLockDesc_t     *next;          /*
        !            98:                                                 * For hash table collision
        !            99:                                                 * resolution.
        !           100:                                                 */
        !           101: };
        !           102:
        !           103: struct RF_LockTableEntry_s {
        !           104:        RF_DECLARE_MUTEX        (mutex);        /* Mutex on this hash chain. */
        !           105:        RF_StripeLockDesc_t     *descList;      /*
        !           106:                                                 * Hash chain of lock
        !           107:                                                 * descriptors.
        !           108:                                                 */
        !           109: };
        !           110:
        !           111: /*
        !           112:  * Initializes a stripe lock descriptor. _defSize is the number of sectors
        !           113:  * that we lock when there is no parity information in the ASM (e.g. RAID0).
        !           114:  */
        !           115:
        !           116: #define RF_INIT_LOCK_REQ_DESC(_lrd, _typ, _cbf, _cba, _asm, _defSize)  \
        !           117: do {                                                                   \
        !           118:        (_lrd).type    = _typ;                                          \
        !           119:        (_lrd).start2  = -1;                                            \
        !           120:        (_lrd).stop2   = -1;                                            \
        !           121:        if ((_asm)->parityInfo) {                                       \
        !           122:                (_lrd).start = (_asm)->parityInfo->startSector;         \
        !           123:                (_lrd).stop  = (_asm)->parityInfo->startSector +        \
        !           124:                    (_asm)->parityInfo->numSector-1;                    \
        !           125:                if ((_asm)->parityInfo->next) {                         \
        !           126:                        (_lrd).start2  =                                \
        !           127:                            (_asm)->parityInfo->next->startSector;      \
        !           128:                        (_lrd).stop2   =                                \
        !           129:                            (_asm)->parityInfo->next->startSector +     \
        !           130:                            (_asm)->parityInfo->next->numSector-1;      \
        !           131:                }                                                       \
        !           132:        } else {                                                        \
        !           133:                (_lrd).start = 0;                                       \
        !           134:                (_lrd).stop  = (_defSize);                              \
        !           135:        }                                                               \
        !           136:        (_lrd).templink= NULL;                                          \
        !           137:        (_lrd).cbFunc  = (_cbf);                                        \
        !           138:        (_lrd).cbArg   = (void *) (_cba);                               \
        !           139: } while (0)
        !           140:
        !           141: int  rf_ConfigureStripeLockFreeList(RF_ShutdownList_t **);
        !           142: RF_LockTableEntry_t *rf_MakeLockTable(void);
        !           143: void rf_ShutdownStripeLocks(RF_LockTableEntry_t *);
        !           144: int  rf_ConfigureStripeLocks(RF_ShutdownList_t **, RF_Raid_t *, RF_Config_t *);
        !           145: int  rf_AcquireStripeLock(RF_LockTableEntry_t *, RF_StripeNum_t,
        !           146:        RF_LockReqDesc_t *);
        !           147: void rf_ReleaseStripeLock(RF_LockTableEntry_t *, RF_StripeNum_t,
        !           148:        RF_LockReqDesc_t *);
        !           149:
        !           150: #endif /* !_RF__RF_STRIPELOCKS_H_ */

CVSweb