Annotation of sys/dev/raidframe/rf_psstatus.h, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: rf_psstatus.h,v 1.3 2002/12/16 07:01:04 tdeval Exp $ */
! 2: /* $NetBSD: rf_psstatus.h,v 1.3 1999/02/05 00:06:15 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: * psstatus.h
! 34: *
! 35: * The reconstruction code maintains a bunch of status related to the parity
! 36: * stripes that are currently under reconstruction. This header file defines
! 37: * the status structures.
! 38: *
! 39: *****************************************************************************/
! 40:
! 41: #ifndef _RF__RF_PSSTATUS_H_
! 42: #define _RF__RF_PSSTATUS_H_
! 43:
! 44: #include "rf_types.h"
! 45: #include "rf_threadstuff.h"
! 46: #include "rf_callback.h"
! 47:
! 48: #define RF_PS_MAX_BUFS 10 /*
! 49: * Max number of bufs we'll
! 50: * accumulate before we do
! 51: * an XOR.
! 52: */
! 53:
! 54: #define RF_PSS_DEFAULT_TABLESIZE 200
! 55:
! 56: /*
! 57: * Macros to acquire/release the mutex lock on a parity stripe status
! 58: * descriptor. Note that we use just one lock for the whole hash chain.
! 59: */
! 60: /* Simple hash function. */
! 61: #define RF_HASH_PSID(_raid_,_psid_) ((_psid_) % ((_raid_)->pssTableSize))
! 62:
! 63: #define RF_LOCK_PSS_MUTEX(_raidPtr,_row,_psid) \
! 64: RF_LOCK_MUTEX((_raidPtr)->reconControl[_row] \
! 65: ->pssTable[RF_HASH_PSID(_raidPtr, _psid)].mutex)
! 66: #define RF_UNLOCK_PSS_MUTEX(_raidPtr, _row, _psid) \
! 67: RF_UNLOCK_MUTEX((_raidPtr)->reconControl[_row] \
! 68: ->pssTable[RF_HASH_PSID(_raidPtr, _psid)].mutex)
! 69:
! 70: struct RF_ReconParityStripeStatus_s {
! 71: RF_StripeNum_t parityStripeID;/* The parity stripe ID. */
! 72: RF_ReconUnitNum_t which_ru; /*
! 73: * Which reconstruction unit
! 74: * with the indicated parity
! 75: * stripe.
! 76: */
! 77: RF_PSSFlags_t flags; /*
! 78: * Flags indicating various
! 79: * conditions.
! 80: */
! 81: void *rbuf; /*
! 82: * This is the accumulating
! 83: * xor sum.
! 84: */
! 85: void *writeRbuf; /*
! 86: * DEBUG ONLY: A pointer to
! 87: * the rbuf after it has filled
! 88: * & been sent to disk.
! 89: */
! 90: void *rbufsForXor[RF_PS_MAX_BUFS];
! 91: /*
! 92: * These are buffers still to
! 93: * be xored into the
! 94: * accumulating sum.
! 95: */
! 96: int xorBufCount; /*
! 97: * Num buffers waiting to be
! 98: * xored.
! 99: */
! 100: int blockCount; /*
! 101: * Count of # proc that have
! 102: * blocked recon on this parity
! 103: * stripe.
! 104: */
! 105: char *issued; /*
! 106: * issued[i]==1 <=> column i
! 107: * has already issued a read
! 108: * request for the indicated
! 109: * RU.
! 110: */
! 111: RF_CallbackDesc_t *procWaitList; /*
! 112: * List of user procs waiting
! 113: * for recon to be done.
! 114: */
! 115: RF_CallbackDesc_t *blockWaitList; /*
! 116: * List of disks blocked
! 117: * waiting for user write to
! 118: * complete.
! 119: */
! 120: RF_CallbackDesc_t *bufWaitList; /*
! 121: * List of disks blocked
! 122: * waiting to acquire a buffer
! 123: * for this RU.
! 124: */
! 125: RF_ReconParityStripeStatus_t *next;
! 126: };
! 127:
! 128: struct RF_PSStatusHeader_s {
! 129: RF_DECLARE_MUTEX(mutex); /* Mutex for this hash chain. */
! 130: RF_ReconParityStripeStatus_t *chain; /* The hash chain. */
! 131: };
! 132:
! 133: /* Masks for the "flags" field above. */
! 134: #define RF_PSS_NONE 0x00000000 /* No flags. */
! 135: #define RF_PSS_UNDER_RECON 0x00000001 /*
! 136: * This parity stripe is
! 137: * currently under
! 138: * reconstruction.
! 139: */
! 140: #define RF_PSS_FORCED_ON_WRITE 0x00000002 /*
! 141: * Indicates a recon was
! 142: * forced due to a user-write
! 143: * operation.
! 144: */
! 145: #define RF_PSS_FORCED_ON_READ 0x00000004 /*
! 146: * Ditto for read, but not
! 147: * currently implemented.
! 148: */
! 149: #define RF_PSS_RECON_BLOCKED 0x00000008 /*
! 150: * Reconstruction is currently
! 151: * blocked due to a pending
! 152: * user I/O.
! 153: */
! 154: #define RF_PSS_CREATE 0x00000010 /*
! 155: * Tells LookupRUStatus to
! 156: * create the entry.
! 157: */
! 158: #define RF_PSS_BUFFERWAIT 0x00000020 /*
! 159: * Someone is waiting for a
! 160: * buffer for this RU.
! 161: */
! 162:
! 163: int rf_ConfigurePSStatus(RF_ShutdownList_t **, RF_Raid_t *, RF_Config_t *);
! 164: RF_PSStatusHeader_t *rf_MakeParityStripeStatusTable(RF_Raid_t *);
! 165: void rf_FreeParityStripeStatusTable(RF_Raid_t *, RF_PSStatusHeader_t *);
! 166: RF_ReconParityStripeStatus_t *rf_LookupRUStatus(RF_Raid_t *,
! 167: RF_PSStatusHeader_t *, RF_StripeNum_t, RF_ReconUnitNum_t,
! 168: RF_PSSFlags_t, int *);
! 169: void rf_PSStatusDelete(RF_Raid_t *, RF_PSStatusHeader_t *,
! 170: RF_ReconParityStripeStatus_t *);
! 171: void rf_RemoveFromActiveReconTable(RF_Raid_t *, RF_RowCol_t,
! 172: RF_StripeNum_t, RF_ReconUnitNum_t);
! 173: RF_ReconParityStripeStatus_t *rf_AllocPSStatus(RF_Raid_t *);
! 174: void rf_FreePSStatus(RF_Raid_t *, RF_ReconParityStripeStatus_t *);
! 175: void rf_PrintPSStatusTable(RF_Raid_t *, RF_RowCol_t);
! 176:
! 177: #endif /* !_RF__RF_PSSTATUS_H_ */
CVSweb