0001
0002 #ifndef DRBD_STATE_H
0003 #define DRBD_STATE_H
0004
0005 struct drbd_device;
0006 struct drbd_connection;
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026 #define role_MASK R_MASK
0027 #define peer_MASK R_MASK
0028 #define disk_MASK D_MASK
0029 #define pdsk_MASK D_MASK
0030 #define conn_MASK C_MASK
0031 #define susp_MASK 1
0032 #define user_isp_MASK 1
0033 #define aftr_isp_MASK 1
0034 #define susp_nod_MASK 1
0035 #define susp_fen_MASK 1
0036
0037 #define NS(T, S) \
0038 ({ union drbd_state mask; mask.i = 0; mask.T = T##_MASK; mask; }), \
0039 ({ union drbd_state val; val.i = 0; val.T = (S); val; })
0040 #define NS2(T1, S1, T2, S2) \
0041 ({ union drbd_state mask; mask.i = 0; mask.T1 = T1##_MASK; \
0042 mask.T2 = T2##_MASK; mask; }), \
0043 ({ union drbd_state val; val.i = 0; val.T1 = (S1); \
0044 val.T2 = (S2); val; })
0045 #define NS3(T1, S1, T2, S2, T3, S3) \
0046 ({ union drbd_state mask; mask.i = 0; mask.T1 = T1##_MASK; \
0047 mask.T2 = T2##_MASK; mask.T3 = T3##_MASK; mask; }), \
0048 ({ union drbd_state val; val.i = 0; val.T1 = (S1); \
0049 val.T2 = (S2); val.T3 = (S3); val; })
0050
0051 #define _NS(D, T, S) \
0052 D, ({ union drbd_state __ns; __ns = drbd_read_state(D); __ns.T = (S); __ns; })
0053 #define _NS2(D, T1, S1, T2, S2) \
0054 D, ({ union drbd_state __ns; __ns = drbd_read_state(D); __ns.T1 = (S1); \
0055 __ns.T2 = (S2); __ns; })
0056 #define _NS3(D, T1, S1, T2, S2, T3, S3) \
0057 D, ({ union drbd_state __ns; __ns = drbd_read_state(D); __ns.T1 = (S1); \
0058 __ns.T2 = (S2); __ns.T3 = (S3); __ns; })
0059
0060 enum chg_state_flags {
0061 CS_HARD = 1 << 0,
0062 CS_VERBOSE = 1 << 1,
0063 CS_WAIT_COMPLETE = 1 << 2,
0064 CS_SERIALIZE = 1 << 3,
0065 CS_ORDERED = CS_WAIT_COMPLETE + CS_SERIALIZE,
0066 CS_LOCAL_ONLY = 1 << 4,
0067 CS_DC_ROLE = 1 << 5,
0068 CS_DC_PEER = 1 << 6,
0069 CS_DC_CONN = 1 << 7,
0070 CS_DC_DISK = 1 << 8,
0071 CS_DC_PDSK = 1 << 9,
0072 CS_DC_SUSP = 1 << 10,
0073 CS_DC_MASK = CS_DC_ROLE + CS_DC_PEER + CS_DC_CONN + CS_DC_DISK + CS_DC_PDSK,
0074 CS_IGN_OUTD_FAIL = 1 << 11,
0075
0076
0077
0078 CS_INHIBIT_MD_IO = 1 << 12,
0079 };
0080
0081
0082
0083
0084 union drbd_dev_state {
0085 struct {
0086 #if defined(__LITTLE_ENDIAN_BITFIELD)
0087 unsigned role:2 ;
0088 unsigned peer:2 ;
0089 unsigned conn:5 ;
0090 unsigned disk:4 ;
0091 unsigned pdsk:4 ;
0092 unsigned _unused:1 ;
0093 unsigned aftr_isp:1 ;
0094 unsigned peer_isp:1 ;
0095 unsigned user_isp:1 ;
0096 unsigned _pad:11;
0097 #elif defined(__BIG_ENDIAN_BITFIELD)
0098 unsigned _pad:11;
0099 unsigned user_isp:1 ;
0100 unsigned peer_isp:1 ;
0101 unsigned aftr_isp:1 ;
0102 unsigned _unused:1 ;
0103 unsigned pdsk:4 ;
0104 unsigned disk:4 ;
0105 unsigned conn:5 ;
0106 unsigned peer:2 ;
0107 unsigned role:2 ;
0108 #else
0109 # error "this endianess is not supported"
0110 #endif
0111 };
0112 unsigned int i;
0113 };
0114
0115 extern enum drbd_state_rv drbd_change_state(struct drbd_device *device,
0116 enum chg_state_flags f,
0117 union drbd_state mask,
0118 union drbd_state val);
0119 extern void drbd_force_state(struct drbd_device *, union drbd_state,
0120 union drbd_state);
0121 extern enum drbd_state_rv _drbd_request_state(struct drbd_device *,
0122 union drbd_state,
0123 union drbd_state,
0124 enum chg_state_flags);
0125
0126 extern enum drbd_state_rv
0127 _drbd_request_state_holding_state_mutex(struct drbd_device *, union drbd_state,
0128 union drbd_state, enum chg_state_flags);
0129
0130 extern enum drbd_state_rv _drbd_set_state(struct drbd_device *, union drbd_state,
0131 enum chg_state_flags,
0132 struct completion *done);
0133 extern void print_st_err(struct drbd_device *, union drbd_state,
0134 union drbd_state, enum drbd_state_rv);
0135
0136 enum drbd_state_rv
0137 _conn_request_state(struct drbd_connection *connection, union drbd_state mask, union drbd_state val,
0138 enum chg_state_flags flags);
0139
0140 enum drbd_state_rv
0141 conn_request_state(struct drbd_connection *connection, union drbd_state mask, union drbd_state val,
0142 enum chg_state_flags flags);
0143
0144 extern void drbd_resume_al(struct drbd_device *device);
0145 extern bool conn_all_vols_unconf(struct drbd_connection *connection);
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157 static inline int drbd_request_state(struct drbd_device *device,
0158 union drbd_state mask,
0159 union drbd_state val)
0160 {
0161 return _drbd_request_state(device, mask, val, CS_VERBOSE + CS_ORDERED);
0162 }
0163
0164
0165 int drbd_request_detach_interruptible(struct drbd_device *device);
0166
0167 enum drbd_role conn_highest_role(struct drbd_connection *connection);
0168 enum drbd_role conn_highest_peer(struct drbd_connection *connection);
0169 enum drbd_disk_state conn_highest_disk(struct drbd_connection *connection);
0170 enum drbd_disk_state conn_lowest_disk(struct drbd_connection *connection);
0171 enum drbd_disk_state conn_highest_pdsk(struct drbd_connection *connection);
0172 enum drbd_conns conn_lowest_conn(struct drbd_connection *connection);
0173
0174 #endif