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_ */
178