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