Annotation of sys/dev/raidframe/rf_psstatus.h, Revision 1.1.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