xref: /OK3568_Linux_fs/kernel/include/linux/drbd.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun   drbd.h
4*4882a593Smuzhiyun   Kernel module for 2.6.x Kernels
5*4882a593Smuzhiyun 
6*4882a593Smuzhiyun   This file is part of DRBD by Philipp Reisner and Lars Ellenberg.
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun   Copyright (C) 2001-2008, LINBIT Information Technologies GmbH.
9*4882a593Smuzhiyun   Copyright (C) 2001-2008, Philipp Reisner <philipp.reisner@linbit.com>.
10*4882a593Smuzhiyun   Copyright (C) 2001-2008, Lars Ellenberg <lars.ellenberg@linbit.com>.
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun */
14*4882a593Smuzhiyun #ifndef DRBD_H
15*4882a593Smuzhiyun #define DRBD_H
16*4882a593Smuzhiyun #include <asm/types.h>
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #ifdef __KERNEL__
19*4882a593Smuzhiyun #include <linux/types.h>
20*4882a593Smuzhiyun #include <asm/byteorder.h>
21*4882a593Smuzhiyun #else
22*4882a593Smuzhiyun #include <sys/types.h>
23*4882a593Smuzhiyun #include <sys/wait.h>
24*4882a593Smuzhiyun #include <limits.h>
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun /* Although the Linux source code makes a difference between
27*4882a593Smuzhiyun    generic endianness and the bitfields' endianness, there is no
28*4882a593Smuzhiyun    architecture as of Linux-2.6.24-rc4 where the bitfields' endianness
29*4882a593Smuzhiyun    does not match the generic endianness. */
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun #if __BYTE_ORDER == __LITTLE_ENDIAN
32*4882a593Smuzhiyun #define __LITTLE_ENDIAN_BITFIELD
33*4882a593Smuzhiyun #elif __BYTE_ORDER == __BIG_ENDIAN
34*4882a593Smuzhiyun #define __BIG_ENDIAN_BITFIELD
35*4882a593Smuzhiyun #else
36*4882a593Smuzhiyun # error "sorry, weird endianness on this box"
37*4882a593Smuzhiyun #endif
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun #endif
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun extern const char *drbd_buildtag(void);
42*4882a593Smuzhiyun #define REL_VERSION "8.4.11"
43*4882a593Smuzhiyun #define API_VERSION 1
44*4882a593Smuzhiyun #define PRO_VERSION_MIN 86
45*4882a593Smuzhiyun #define PRO_VERSION_MAX 101
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun enum drbd_io_error_p {
49*4882a593Smuzhiyun 	EP_PASS_ON, /* FIXME should the better be named "Ignore"? */
50*4882a593Smuzhiyun 	EP_CALL_HELPER,
51*4882a593Smuzhiyun 	EP_DETACH
52*4882a593Smuzhiyun };
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun enum drbd_fencing_p {
55*4882a593Smuzhiyun 	FP_NOT_AVAIL = -1, /* Not a policy */
56*4882a593Smuzhiyun 	FP_DONT_CARE = 0,
57*4882a593Smuzhiyun 	FP_RESOURCE,
58*4882a593Smuzhiyun 	FP_STONITH
59*4882a593Smuzhiyun };
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun enum drbd_disconnect_p {
62*4882a593Smuzhiyun 	DP_RECONNECT,
63*4882a593Smuzhiyun 	DP_DROP_NET_CONF,
64*4882a593Smuzhiyun 	DP_FREEZE_IO
65*4882a593Smuzhiyun };
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun enum drbd_after_sb_p {
68*4882a593Smuzhiyun 	ASB_DISCONNECT,
69*4882a593Smuzhiyun 	ASB_DISCARD_YOUNGER_PRI,
70*4882a593Smuzhiyun 	ASB_DISCARD_OLDER_PRI,
71*4882a593Smuzhiyun 	ASB_DISCARD_ZERO_CHG,
72*4882a593Smuzhiyun 	ASB_DISCARD_LEAST_CHG,
73*4882a593Smuzhiyun 	ASB_DISCARD_LOCAL,
74*4882a593Smuzhiyun 	ASB_DISCARD_REMOTE,
75*4882a593Smuzhiyun 	ASB_CONSENSUS,
76*4882a593Smuzhiyun 	ASB_DISCARD_SECONDARY,
77*4882a593Smuzhiyun 	ASB_CALL_HELPER,
78*4882a593Smuzhiyun 	ASB_VIOLENTLY
79*4882a593Smuzhiyun };
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun enum drbd_on_no_data {
82*4882a593Smuzhiyun 	OND_IO_ERROR,
83*4882a593Smuzhiyun 	OND_SUSPEND_IO
84*4882a593Smuzhiyun };
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun enum drbd_on_congestion {
87*4882a593Smuzhiyun 	OC_BLOCK,
88*4882a593Smuzhiyun 	OC_PULL_AHEAD,
89*4882a593Smuzhiyun 	OC_DISCONNECT,
90*4882a593Smuzhiyun };
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun enum drbd_read_balancing {
93*4882a593Smuzhiyun 	RB_PREFER_LOCAL,
94*4882a593Smuzhiyun 	RB_PREFER_REMOTE,
95*4882a593Smuzhiyun 	RB_ROUND_ROBIN,
96*4882a593Smuzhiyun 	RB_LEAST_PENDING,
97*4882a593Smuzhiyun 	RB_CONGESTED_REMOTE,
98*4882a593Smuzhiyun 	RB_32K_STRIPING,
99*4882a593Smuzhiyun 	RB_64K_STRIPING,
100*4882a593Smuzhiyun 	RB_128K_STRIPING,
101*4882a593Smuzhiyun 	RB_256K_STRIPING,
102*4882a593Smuzhiyun 	RB_512K_STRIPING,
103*4882a593Smuzhiyun 	RB_1M_STRIPING,
104*4882a593Smuzhiyun };
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun /* KEEP the order, do not delete or insert. Only append. */
107*4882a593Smuzhiyun enum drbd_ret_code {
108*4882a593Smuzhiyun 	ERR_CODE_BASE		= 100,
109*4882a593Smuzhiyun 	NO_ERROR		= 101,
110*4882a593Smuzhiyun 	ERR_LOCAL_ADDR		= 102,
111*4882a593Smuzhiyun 	ERR_PEER_ADDR		= 103,
112*4882a593Smuzhiyun 	ERR_OPEN_DISK		= 104,
113*4882a593Smuzhiyun 	ERR_OPEN_MD_DISK	= 105,
114*4882a593Smuzhiyun 	ERR_DISK_NOT_BDEV	= 107,
115*4882a593Smuzhiyun 	ERR_MD_NOT_BDEV		= 108,
116*4882a593Smuzhiyun 	ERR_DISK_TOO_SMALL	= 111,
117*4882a593Smuzhiyun 	ERR_MD_DISK_TOO_SMALL	= 112,
118*4882a593Smuzhiyun 	ERR_BDCLAIM_DISK	= 114,
119*4882a593Smuzhiyun 	ERR_BDCLAIM_MD_DISK	= 115,
120*4882a593Smuzhiyun 	ERR_MD_IDX_INVALID	= 116,
121*4882a593Smuzhiyun 	ERR_IO_MD_DISK		= 118,
122*4882a593Smuzhiyun 	ERR_MD_INVALID          = 119,
123*4882a593Smuzhiyun 	ERR_AUTH_ALG		= 120,
124*4882a593Smuzhiyun 	ERR_AUTH_ALG_ND		= 121,
125*4882a593Smuzhiyun 	ERR_NOMEM		= 122,
126*4882a593Smuzhiyun 	ERR_DISCARD_IMPOSSIBLE	= 123,
127*4882a593Smuzhiyun 	ERR_DISK_CONFIGURED	= 124,
128*4882a593Smuzhiyun 	ERR_NET_CONFIGURED	= 125,
129*4882a593Smuzhiyun 	ERR_MANDATORY_TAG	= 126,
130*4882a593Smuzhiyun 	ERR_MINOR_INVALID	= 127,
131*4882a593Smuzhiyun 	ERR_INTR		= 129, /* EINTR */
132*4882a593Smuzhiyun 	ERR_RESIZE_RESYNC	= 130,
133*4882a593Smuzhiyun 	ERR_NO_PRIMARY		= 131,
134*4882a593Smuzhiyun 	ERR_RESYNC_AFTER	= 132,
135*4882a593Smuzhiyun 	ERR_RESYNC_AFTER_CYCLE	= 133,
136*4882a593Smuzhiyun 	ERR_PAUSE_IS_SET	= 134,
137*4882a593Smuzhiyun 	ERR_PAUSE_IS_CLEAR	= 135,
138*4882a593Smuzhiyun 	ERR_PACKET_NR		= 137,
139*4882a593Smuzhiyun 	ERR_NO_DISK		= 138,
140*4882a593Smuzhiyun 	ERR_NOT_PROTO_C		= 139,
141*4882a593Smuzhiyun 	ERR_NOMEM_BITMAP	= 140,
142*4882a593Smuzhiyun 	ERR_INTEGRITY_ALG	= 141, /* DRBD 8.2 only */
143*4882a593Smuzhiyun 	ERR_INTEGRITY_ALG_ND	= 142, /* DRBD 8.2 only */
144*4882a593Smuzhiyun 	ERR_CPU_MASK_PARSE	= 143, /* DRBD 8.2 only */
145*4882a593Smuzhiyun 	ERR_CSUMS_ALG		= 144, /* DRBD 8.2 only */
146*4882a593Smuzhiyun 	ERR_CSUMS_ALG_ND	= 145, /* DRBD 8.2 only */
147*4882a593Smuzhiyun 	ERR_VERIFY_ALG		= 146, /* DRBD 8.2 only */
148*4882a593Smuzhiyun 	ERR_VERIFY_ALG_ND	= 147, /* DRBD 8.2 only */
149*4882a593Smuzhiyun 	ERR_CSUMS_RESYNC_RUNNING= 148, /* DRBD 8.2 only */
150*4882a593Smuzhiyun 	ERR_VERIFY_RUNNING	= 149, /* DRBD 8.2 only */
151*4882a593Smuzhiyun 	ERR_DATA_NOT_CURRENT	= 150,
152*4882a593Smuzhiyun 	ERR_CONNECTED		= 151, /* DRBD 8.3 only */
153*4882a593Smuzhiyun 	ERR_PERM		= 152,
154*4882a593Smuzhiyun 	ERR_NEED_APV_93		= 153,
155*4882a593Smuzhiyun 	ERR_STONITH_AND_PROT_A  = 154,
156*4882a593Smuzhiyun 	ERR_CONG_NOT_PROTO_A	= 155,
157*4882a593Smuzhiyun 	ERR_PIC_AFTER_DEP	= 156,
158*4882a593Smuzhiyun 	ERR_PIC_PEER_DEP	= 157,
159*4882a593Smuzhiyun 	ERR_RES_NOT_KNOWN	= 158,
160*4882a593Smuzhiyun 	ERR_RES_IN_USE		= 159,
161*4882a593Smuzhiyun 	ERR_MINOR_CONFIGURED    = 160,
162*4882a593Smuzhiyun 	ERR_MINOR_OR_VOLUME_EXISTS = 161,
163*4882a593Smuzhiyun 	ERR_INVALID_REQUEST	= 162,
164*4882a593Smuzhiyun 	ERR_NEED_APV_100	= 163,
165*4882a593Smuzhiyun 	ERR_NEED_ALLOW_TWO_PRI  = 164,
166*4882a593Smuzhiyun 	ERR_MD_UNCLEAN          = 165,
167*4882a593Smuzhiyun 	ERR_MD_LAYOUT_CONNECTED = 166,
168*4882a593Smuzhiyun 	ERR_MD_LAYOUT_TOO_BIG   = 167,
169*4882a593Smuzhiyun 	ERR_MD_LAYOUT_TOO_SMALL = 168,
170*4882a593Smuzhiyun 	ERR_MD_LAYOUT_NO_FIT    = 169,
171*4882a593Smuzhiyun 	ERR_IMPLICIT_SHRINK     = 170,
172*4882a593Smuzhiyun 	/* insert new ones above this line */
173*4882a593Smuzhiyun 	AFTER_LAST_ERR_CODE
174*4882a593Smuzhiyun };
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun #define DRBD_PROT_A   1
177*4882a593Smuzhiyun #define DRBD_PROT_B   2
178*4882a593Smuzhiyun #define DRBD_PROT_C   3
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun enum drbd_role {
181*4882a593Smuzhiyun 	R_UNKNOWN = 0,
182*4882a593Smuzhiyun 	R_PRIMARY = 1,     /* role */
183*4882a593Smuzhiyun 	R_SECONDARY = 2,   /* role */
184*4882a593Smuzhiyun 	R_MASK = 3,
185*4882a593Smuzhiyun };
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun /* The order of these constants is important.
188*4882a593Smuzhiyun  * The lower ones (<C_WF_REPORT_PARAMS) indicate
189*4882a593Smuzhiyun  * that there is no socket!
190*4882a593Smuzhiyun  * >=C_WF_REPORT_PARAMS ==> There is a socket
191*4882a593Smuzhiyun  */
192*4882a593Smuzhiyun enum drbd_conns {
193*4882a593Smuzhiyun 	C_STANDALONE,
194*4882a593Smuzhiyun 	C_DISCONNECTING,  /* Temporal state on the way to StandAlone. */
195*4882a593Smuzhiyun 	C_UNCONNECTED,    /* >= C_UNCONNECTED -> inc_net() succeeds */
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun 	/* These temporal states are all used on the way
198*4882a593Smuzhiyun 	 * from >= C_CONNECTED to Unconnected.
199*4882a593Smuzhiyun 	 * The 'disconnect reason' states
200*4882a593Smuzhiyun 	 * I do not allow to change between them. */
201*4882a593Smuzhiyun 	C_TIMEOUT,
202*4882a593Smuzhiyun 	C_BROKEN_PIPE,
203*4882a593Smuzhiyun 	C_NETWORK_FAILURE,
204*4882a593Smuzhiyun 	C_PROTOCOL_ERROR,
205*4882a593Smuzhiyun 	C_TEAR_DOWN,
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun 	C_WF_CONNECTION,
208*4882a593Smuzhiyun 	C_WF_REPORT_PARAMS, /* we have a socket */
209*4882a593Smuzhiyun 	C_CONNECTED,      /* we have introduced each other */
210*4882a593Smuzhiyun 	C_STARTING_SYNC_S,  /* starting full sync by admin request. */
211*4882a593Smuzhiyun 	C_STARTING_SYNC_T,  /* starting full sync by admin request. */
212*4882a593Smuzhiyun 	C_WF_BITMAP_S,
213*4882a593Smuzhiyun 	C_WF_BITMAP_T,
214*4882a593Smuzhiyun 	C_WF_SYNC_UUID,
215*4882a593Smuzhiyun 
216*4882a593Smuzhiyun 	/* All SyncStates are tested with this comparison
217*4882a593Smuzhiyun 	 * xx >= C_SYNC_SOURCE && xx <= C_PAUSED_SYNC_T */
218*4882a593Smuzhiyun 	C_SYNC_SOURCE,
219*4882a593Smuzhiyun 	C_SYNC_TARGET,
220*4882a593Smuzhiyun 	C_VERIFY_S,
221*4882a593Smuzhiyun 	C_VERIFY_T,
222*4882a593Smuzhiyun 	C_PAUSED_SYNC_S,
223*4882a593Smuzhiyun 	C_PAUSED_SYNC_T,
224*4882a593Smuzhiyun 
225*4882a593Smuzhiyun 	C_AHEAD,
226*4882a593Smuzhiyun 	C_BEHIND,
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun 	C_MASK = 31
229*4882a593Smuzhiyun };
230*4882a593Smuzhiyun 
231*4882a593Smuzhiyun enum drbd_disk_state {
232*4882a593Smuzhiyun 	D_DISKLESS,
233*4882a593Smuzhiyun 	D_ATTACHING,      /* In the process of reading the meta-data */
234*4882a593Smuzhiyun 	D_FAILED,         /* Becomes D_DISKLESS as soon as we told it the peer */
235*4882a593Smuzhiyun 			  /* when >= D_FAILED it is legal to access mdev->ldev */
236*4882a593Smuzhiyun 	D_NEGOTIATING,    /* Late attaching state, we need to talk to the peer */
237*4882a593Smuzhiyun 	D_INCONSISTENT,
238*4882a593Smuzhiyun 	D_OUTDATED,
239*4882a593Smuzhiyun 	D_UNKNOWN,       /* Only used for the peer, never for myself */
240*4882a593Smuzhiyun 	D_CONSISTENT,     /* Might be D_OUTDATED, might be D_UP_TO_DATE ... */
241*4882a593Smuzhiyun 	D_UP_TO_DATE,       /* Only this disk state allows applications' IO ! */
242*4882a593Smuzhiyun 	D_MASK = 15
243*4882a593Smuzhiyun };
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun union drbd_state {
246*4882a593Smuzhiyun /* According to gcc's docs is the ...
247*4882a593Smuzhiyun  * The order of allocation of bit-fields within a unit (C90 6.5.2.1, C99 6.7.2.1).
248*4882a593Smuzhiyun  * Determined by ABI.
249*4882a593Smuzhiyun  * pointed out by Maxim Uvarov q<muvarov@ru.mvista.com>
250*4882a593Smuzhiyun  * even though we transmit as "cpu_to_be32(state)",
251*4882a593Smuzhiyun  * the offsets of the bitfields still need to be swapped
252*4882a593Smuzhiyun  * on different endianness.
253*4882a593Smuzhiyun  */
254*4882a593Smuzhiyun 	struct {
255*4882a593Smuzhiyun #if defined(__LITTLE_ENDIAN_BITFIELD)
256*4882a593Smuzhiyun 		unsigned role:2 ;   /* 3/4	 primary/secondary/unknown */
257*4882a593Smuzhiyun 		unsigned peer:2 ;   /* 3/4	 primary/secondary/unknown */
258*4882a593Smuzhiyun 		unsigned conn:5 ;   /* 17/32	 cstates */
259*4882a593Smuzhiyun 		unsigned disk:4 ;   /* 8/16	 from D_DISKLESS to D_UP_TO_DATE */
260*4882a593Smuzhiyun 		unsigned pdsk:4 ;   /* 8/16	 from D_DISKLESS to D_UP_TO_DATE */
261*4882a593Smuzhiyun 		unsigned susp:1 ;   /* 2/2	 IO suspended no/yes (by user) */
262*4882a593Smuzhiyun 		unsigned aftr_isp:1 ; /* isp .. imposed sync pause */
263*4882a593Smuzhiyun 		unsigned peer_isp:1 ;
264*4882a593Smuzhiyun 		unsigned user_isp:1 ;
265*4882a593Smuzhiyun 		unsigned susp_nod:1 ; /* IO suspended because no data */
266*4882a593Smuzhiyun 		unsigned susp_fen:1 ; /* IO suspended because fence peer handler runs*/
267*4882a593Smuzhiyun 		unsigned _pad:9;   /* 0	 unused */
268*4882a593Smuzhiyun #elif defined(__BIG_ENDIAN_BITFIELD)
269*4882a593Smuzhiyun 		unsigned _pad:9;
270*4882a593Smuzhiyun 		unsigned susp_fen:1 ;
271*4882a593Smuzhiyun 		unsigned susp_nod:1 ;
272*4882a593Smuzhiyun 		unsigned user_isp:1 ;
273*4882a593Smuzhiyun 		unsigned peer_isp:1 ;
274*4882a593Smuzhiyun 		unsigned aftr_isp:1 ; /* isp .. imposed sync pause */
275*4882a593Smuzhiyun 		unsigned susp:1 ;   /* 2/2	 IO suspended  no/yes */
276*4882a593Smuzhiyun 		unsigned pdsk:4 ;   /* 8/16	 from D_DISKLESS to D_UP_TO_DATE */
277*4882a593Smuzhiyun 		unsigned disk:4 ;   /* 8/16	 from D_DISKLESS to D_UP_TO_DATE */
278*4882a593Smuzhiyun 		unsigned conn:5 ;   /* 17/32	 cstates */
279*4882a593Smuzhiyun 		unsigned peer:2 ;   /* 3/4	 primary/secondary/unknown */
280*4882a593Smuzhiyun 		unsigned role:2 ;   /* 3/4	 primary/secondary/unknown */
281*4882a593Smuzhiyun #else
282*4882a593Smuzhiyun # error "this endianness is not supported"
283*4882a593Smuzhiyun #endif
284*4882a593Smuzhiyun 	};
285*4882a593Smuzhiyun 	unsigned int i;
286*4882a593Smuzhiyun };
287*4882a593Smuzhiyun 
288*4882a593Smuzhiyun enum drbd_state_rv {
289*4882a593Smuzhiyun 	SS_CW_NO_NEED = 4,
290*4882a593Smuzhiyun 	SS_CW_SUCCESS = 3,
291*4882a593Smuzhiyun 	SS_NOTHING_TO_DO = 2,
292*4882a593Smuzhiyun 	SS_SUCCESS = 1,
293*4882a593Smuzhiyun 	SS_UNKNOWN_ERROR = 0, /* Used to sleep longer in _drbd_request_state */
294*4882a593Smuzhiyun 	SS_TWO_PRIMARIES = -1,
295*4882a593Smuzhiyun 	SS_NO_UP_TO_DATE_DISK = -2,
296*4882a593Smuzhiyun 	SS_NO_LOCAL_DISK = -4,
297*4882a593Smuzhiyun 	SS_NO_REMOTE_DISK = -5,
298*4882a593Smuzhiyun 	SS_CONNECTED_OUTDATES = -6,
299*4882a593Smuzhiyun 	SS_PRIMARY_NOP = -7,
300*4882a593Smuzhiyun 	SS_RESYNC_RUNNING = -8,
301*4882a593Smuzhiyun 	SS_ALREADY_STANDALONE = -9,
302*4882a593Smuzhiyun 	SS_CW_FAILED_BY_PEER = -10,
303*4882a593Smuzhiyun 	SS_IS_DISKLESS = -11,
304*4882a593Smuzhiyun 	SS_DEVICE_IN_USE = -12,
305*4882a593Smuzhiyun 	SS_NO_NET_CONFIG = -13,
306*4882a593Smuzhiyun 	SS_NO_VERIFY_ALG = -14,       /* drbd-8.2 only */
307*4882a593Smuzhiyun 	SS_NEED_CONNECTION = -15,    /* drbd-8.2 only */
308*4882a593Smuzhiyun 	SS_LOWER_THAN_OUTDATED = -16,
309*4882a593Smuzhiyun 	SS_NOT_SUPPORTED = -17,      /* drbd-8.2 only */
310*4882a593Smuzhiyun 	SS_IN_TRANSIENT_STATE = -18,  /* Retry after the next state change */
311*4882a593Smuzhiyun 	SS_CONCURRENT_ST_CHG = -19,   /* Concurrent cluster side state change! */
312*4882a593Smuzhiyun 	SS_O_VOL_PEER_PRI = -20,
313*4882a593Smuzhiyun 	SS_OUTDATE_WO_CONN = -21,
314*4882a593Smuzhiyun 	SS_AFTER_LAST_ERROR = -22,    /* Keep this at bottom */
315*4882a593Smuzhiyun };
316*4882a593Smuzhiyun 
317*4882a593Smuzhiyun #define SHARED_SECRET_MAX 64
318*4882a593Smuzhiyun 
319*4882a593Smuzhiyun #define MDF_CONSISTENT		(1 << 0)
320*4882a593Smuzhiyun #define MDF_PRIMARY_IND		(1 << 1)
321*4882a593Smuzhiyun #define MDF_CONNECTED_IND	(1 << 2)
322*4882a593Smuzhiyun #define MDF_FULL_SYNC		(1 << 3)
323*4882a593Smuzhiyun #define MDF_WAS_UP_TO_DATE	(1 << 4)
324*4882a593Smuzhiyun #define MDF_PEER_OUT_DATED	(1 << 5)
325*4882a593Smuzhiyun #define MDF_CRASHED_PRIMARY	(1 << 6)
326*4882a593Smuzhiyun #define MDF_AL_CLEAN		(1 << 7)
327*4882a593Smuzhiyun #define MDF_AL_DISABLED		(1 << 8)
328*4882a593Smuzhiyun 
329*4882a593Smuzhiyun #define MAX_PEERS 32
330*4882a593Smuzhiyun 
331*4882a593Smuzhiyun enum drbd_uuid_index {
332*4882a593Smuzhiyun 	UI_CURRENT,
333*4882a593Smuzhiyun 	UI_BITMAP,
334*4882a593Smuzhiyun 	UI_HISTORY_START,
335*4882a593Smuzhiyun 	UI_HISTORY_END,
336*4882a593Smuzhiyun 	UI_SIZE,      /* nl-packet: number of dirty bits */
337*4882a593Smuzhiyun 	UI_FLAGS,     /* nl-packet: flags */
338*4882a593Smuzhiyun 	UI_EXTENDED_SIZE   /* Everything. */
339*4882a593Smuzhiyun };
340*4882a593Smuzhiyun 
341*4882a593Smuzhiyun #define HISTORY_UUIDS MAX_PEERS
342*4882a593Smuzhiyun 
343*4882a593Smuzhiyun enum drbd_timeout_flag {
344*4882a593Smuzhiyun 	UT_DEFAULT      = 0,
345*4882a593Smuzhiyun 	UT_DEGRADED     = 1,
346*4882a593Smuzhiyun 	UT_PEER_OUTDATED = 2,
347*4882a593Smuzhiyun };
348*4882a593Smuzhiyun 
349*4882a593Smuzhiyun enum drbd_notification_type {
350*4882a593Smuzhiyun 	NOTIFY_EXISTS,
351*4882a593Smuzhiyun 	NOTIFY_CREATE,
352*4882a593Smuzhiyun 	NOTIFY_CHANGE,
353*4882a593Smuzhiyun 	NOTIFY_DESTROY,
354*4882a593Smuzhiyun 	NOTIFY_CALL,
355*4882a593Smuzhiyun 	NOTIFY_RESPONSE,
356*4882a593Smuzhiyun 
357*4882a593Smuzhiyun 	NOTIFY_CONTINUES = 0x8000,
358*4882a593Smuzhiyun 	NOTIFY_FLAGS = NOTIFY_CONTINUES,
359*4882a593Smuzhiyun };
360*4882a593Smuzhiyun 
361*4882a593Smuzhiyun enum drbd_peer_state {
362*4882a593Smuzhiyun 	P_INCONSISTENT = 3,
363*4882a593Smuzhiyun 	P_OUTDATED = 4,
364*4882a593Smuzhiyun 	P_DOWN = 5,
365*4882a593Smuzhiyun 	P_PRIMARY = 6,
366*4882a593Smuzhiyun 	P_FENCING = 7,
367*4882a593Smuzhiyun };
368*4882a593Smuzhiyun 
369*4882a593Smuzhiyun #define UUID_JUST_CREATED ((__u64)4)
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun enum write_ordering_e {
372*4882a593Smuzhiyun 	WO_NONE,
373*4882a593Smuzhiyun 	WO_DRAIN_IO,
374*4882a593Smuzhiyun 	WO_BDEV_FLUSH,
375*4882a593Smuzhiyun 	WO_BIO_BARRIER
376*4882a593Smuzhiyun };
377*4882a593Smuzhiyun 
378*4882a593Smuzhiyun /* magic numbers used in meta data and network packets */
379*4882a593Smuzhiyun #define DRBD_MAGIC 0x83740267
380*4882a593Smuzhiyun #define DRBD_MAGIC_BIG 0x835a
381*4882a593Smuzhiyun #define DRBD_MAGIC_100 0x8620ec20
382*4882a593Smuzhiyun 
383*4882a593Smuzhiyun #define DRBD_MD_MAGIC_07   (DRBD_MAGIC+3)
384*4882a593Smuzhiyun #define DRBD_MD_MAGIC_08   (DRBD_MAGIC+4)
385*4882a593Smuzhiyun #define DRBD_MD_MAGIC_84_UNCLEAN	(DRBD_MAGIC+5)
386*4882a593Smuzhiyun 
387*4882a593Smuzhiyun 
388*4882a593Smuzhiyun /* how I came up with this magic?
389*4882a593Smuzhiyun  * base64 decode "actlog==" ;) */
390*4882a593Smuzhiyun #define DRBD_AL_MAGIC 0x69cb65a2
391*4882a593Smuzhiyun 
392*4882a593Smuzhiyun /* these are of type "int" */
393*4882a593Smuzhiyun #define DRBD_MD_INDEX_INTERNAL -1
394*4882a593Smuzhiyun #define DRBD_MD_INDEX_FLEX_EXT -2
395*4882a593Smuzhiyun #define DRBD_MD_INDEX_FLEX_INT -3
396*4882a593Smuzhiyun 
397*4882a593Smuzhiyun #define DRBD_CPU_MASK_SIZE 32
398*4882a593Smuzhiyun 
399*4882a593Smuzhiyun #endif
400