Blame view

include/linux/drbd_genl.h 21.4 KB
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
  /*
   * General overview:
   * full generic netlink message:
   * |nlmsghdr|genlmsghdr|<payload>
   *
   * payload:
   * |optional fixed size family header|<sequence of netlink attributes>
   *
   * sequence of netlink attributes:
   * I chose to have all "top level" attributes NLA_NESTED,
   * corresponding to some real struct.
   * So we have a sequence of |tla, len|<nested nla sequence>
   *
   * nested nla sequence:
   * may be empty, or contain a sequence of netlink attributes
   * representing the struct fields.
   *
   * The tag number of any field (regardless of containing struct)
   * will be available as T_ ## field_name,
   * so you cannot have the same field name in two differnt structs.
   *
   * The tag numbers themselves are per struct, though,
   * so should always begin at 1 (not 0, that is the special "NLA_UNSPEC" type,
   * which we won't use here).
   * The tag numbers are used as index in the respective nla_policy array.
   *
   * GENL_struct(tag_name, tag_number, struct name, struct fields) - struct and policy
   *	genl_magic_struct.h
   *		generates the struct declaration,
   *		generates an entry in the tla enum,
   *	genl_magic_func.h
   *		generates an entry in the static tla policy
   *		with .type = NLA_NESTED
   *		generates the static <struct_name>_nl_policy definition,
   *		and static conversion functions
   *
   *	genl_magic_func.h
   *
   * GENL_mc_group(group)
   *	genl_magic_struct.h
   *		does nothing
   *	genl_magic_func.h
   *		defines and registers the mcast group,
   *		and provides a send helper
   *
   * GENL_notification(op_name, op_num, mcast_group, tla list)
   *	These are notifications to userspace.
   *
   *	genl_magic_struct.h
   *		generates an entry in the genl_ops enum,
   *	genl_magic_func.h
   *		does nothing
   *
   *	mcast group: the name of the mcast group this notification should be
   *	expected on
   *	tla list: the list of expected top level attributes,
   *	for documentation and sanity checking.
   *
   * GENL_op(op_name, op_num, flags and handler, tla list) - "genl operations"
   *	These are requests from userspace.
   *
   *	_op and _notification share the same "number space",
   *	op_nr will be assigned to "genlmsghdr->cmd"
   *
   *	genl_magic_struct.h
   *		generates an entry in the genl_ops enum,
   *	genl_magic_func.h
   *		generates an entry in the static genl_ops array,
   *		and static register/unregister functions to
   *		genl_register_family_with_ops().
   *
   *	flags and handler:
   *		GENL_op_init( .doit = x, .dumpit = y, .flags = something)
   *		GENL_doit(x) => .dumpit = NULL, .flags = GENL_ADMIN_PERM
   *	tla list: the list of expected top level attributes,
   *	for documentation and sanity checking.
   */
  
  /*
   * STRUCTS
   */
  
  /* this is sent kernel -> userland on various error conditions, and contains
   * informational textual info, which is supposedly human readable.
   * The computer relevant return code is in the drbd_genlmsghdr.
   */
  GENL_struct(DRBD_NLA_CFG_REPLY, 1, drbd_cfg_reply,
  		/* "arbitrary" size strings, nla_policy.len = 0 */
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
89
  	__str_field(1, DRBD_GENLA_F_MANDATORY,	info_text, 0)
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
90
91
92
93
94
95
96
97
  )
  
  /* Configuration requests typically need a context to operate on.
   * Possible keys are device minor (fits in the drbd_genlmsghdr),
   * the replication link (aka connection) name,
   * and/or the replication group (aka resource) name,
   * and the volume id within the resource. */
  GENL_struct(DRBD_NLA_CFG_CONTEXT, 2, drbd_cfg_context,
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
98
  	__u32_field(1, DRBD_GENLA_F_MANDATORY,	ctx_volume)
7c3063cc6   Andreas Gruenbacher   drbd: Also need t...
99
  	__str_field(2, DRBD_GENLA_F_MANDATORY,	ctx_resource_name, 128)
089c075d8   Andreas Gruenbacher   drbd: Convert the...
100
101
  	__bin_field(3, DRBD_GENLA_F_MANDATORY,	ctx_my_addr, 128)
  	__bin_field(4, DRBD_GENLA_F_MANDATORY,	ctx_peer_addr, 128)
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
102
103
104
  )
  
  GENL_struct(DRBD_NLA_DISK_CONF, 3, disk_conf,
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
105
106
107
  	__str_field(1, DRBD_F_REQUIRED | DRBD_F_INVARIANT,	backing_dev,	128)
  	__str_field(2, DRBD_F_REQUIRED | DRBD_F_INVARIANT,	meta_dev,	128)
  	__s32_field(3, DRBD_F_REQUIRED | DRBD_F_INVARIANT,	meta_dev_idx)
f399002e6   Lars Ellenberg   drbd: distribute ...
108
109
  
  	/* use the resize command to try and change the disk_size */
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
110
  	__u64_field(4, DRBD_GENLA_F_MANDATORY | DRBD_F_INVARIANT,	disk_size)
f399002e6   Lars Ellenberg   drbd: distribute ...
111
112
  	/* we could change the max_bio_bvecs,
  	 * but it won't propagate through the stack */
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
113
114
115
116
117
118
119
120
121
122
123
124
125
  	__u32_field(5, DRBD_GENLA_F_MANDATORY | DRBD_F_INVARIANT,	max_bio_bvecs)
  
  	__u32_field_def(6, DRBD_GENLA_F_MANDATORY,	on_io_error, DRBD_ON_IO_ERROR_DEF)
  	__u32_field_def(7, DRBD_GENLA_F_MANDATORY,	fencing, DRBD_FENCING_DEF)
  
  	__u32_field_def(8,	DRBD_GENLA_F_MANDATORY,	resync_rate, DRBD_RESYNC_RATE_DEF)
  	__s32_field_def(9,	DRBD_GENLA_F_MANDATORY,	resync_after, DRBD_MINOR_NUMBER_DEF)
  	__u32_field_def(10,	DRBD_GENLA_F_MANDATORY,	al_extents, DRBD_AL_EXTENTS_DEF)
  	__u32_field_def(11,	DRBD_GENLA_F_MANDATORY,	c_plan_ahead, DRBD_C_PLAN_AHEAD_DEF)
  	__u32_field_def(12,	DRBD_GENLA_F_MANDATORY,	c_delay_target, DRBD_C_DELAY_TARGET_DEF)
  	__u32_field_def(13,	DRBD_GENLA_F_MANDATORY,	c_fill_target, DRBD_C_FILL_TARGET_DEF)
  	__u32_field_def(14,	DRBD_GENLA_F_MANDATORY,	c_max_rate, DRBD_C_MAX_RATE_DEF)
  	__u32_field_def(15,	DRBD_GENLA_F_MANDATORY,	c_min_rate, DRBD_C_MIN_RATE_DEF)
a5ca66c41   Philipp Reisner   drbd: Introduce n...
126
127
128
  	__u32_field_def(20,     DRBD_GENLA_F_MANDATORY, disk_timeout, DRBD_DISK_TIMEOUT_DEF)
  	__u32_field_def(21,     0 /* OPTIONAL */,       read_balancing, DRBD_READ_BALANCING_DEF)
  	__u32_field_def(25,     0 /* OPTIONAL */,       rs_discard_granularity, DRBD_RS_DISCARD_GRANULARITY_DEF)
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
129
130
131
132
133
  
  	__flg_field_def(16, DRBD_GENLA_F_MANDATORY,	disk_barrier, DRBD_DISK_BARRIER_DEF)
  	__flg_field_def(17, DRBD_GENLA_F_MANDATORY,	disk_flushes, DRBD_DISK_FLUSHES_DEF)
  	__flg_field_def(18, DRBD_GENLA_F_MANDATORY,	disk_drain, DRBD_DISK_DRAIN_DEF)
  	__flg_field_def(19, DRBD_GENLA_F_MANDATORY,	md_flushes, DRBD_MD_FLUSHES_DEF)
9a51ab1c1   Philipp Reisner   drbd: New disk op...
134
  	__flg_field_def(23,     0 /* OPTIONAL */,	al_updates, DRBD_AL_UPDATES_DEF)
dd4f699da   Lars Ellenberg   drbd: when receiv...
135
  	__flg_field_def(24,     0 /* OPTIONAL */,	discard_zeroes_if_aligned, DRBD_DISCARD_ZEROES_IF_ALIGNED)
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
136
  )
f399002e6   Lars Ellenberg   drbd: distribute ...
137
  GENL_struct(DRBD_NLA_RESOURCE_OPTS, 4, res_opts,
f44d0436d   Andreas Gruenbacher   drbd: Define the ...
138
  	__str_field_def(1,	DRBD_GENLA_F_MANDATORY,	cpu_mask,       DRBD_CPU_MASK_SIZE)
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
139
  	__u32_field_def(2,	DRBD_GENLA_F_MANDATORY,	on_no_data, DRBD_ON_NO_DATA_DEF)
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
140
141
142
  )
  
  GENL_struct(DRBD_NLA_NET_CONF, 5, net_conf,
089c075d8   Andreas Gruenbacher   drbd: Convert the...
143
  	__str_field_def(1,	DRBD_GENLA_F_MANDATORY | DRBD_F_SENSITIVE,
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
144
  						shared_secret,	SHARED_SECRET_MAX)
089c075d8   Andreas Gruenbacher   drbd: Convert the...
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
  	__str_field_def(2,	DRBD_GENLA_F_MANDATORY,	cram_hmac_alg,	SHARED_SECRET_MAX)
  	__str_field_def(3,	DRBD_GENLA_F_MANDATORY,	integrity_alg,	SHARED_SECRET_MAX)
  	__str_field_def(4,	DRBD_GENLA_F_MANDATORY,	verify_alg,     SHARED_SECRET_MAX)
  	__str_field_def(5,	DRBD_GENLA_F_MANDATORY,	csums_alg,	SHARED_SECRET_MAX)
  	__u32_field_def(6,	DRBD_GENLA_F_MANDATORY,	wire_protocol, DRBD_PROTOCOL_DEF)
  	__u32_field_def(7,	DRBD_GENLA_F_MANDATORY,	connect_int, DRBD_CONNECT_INT_DEF)
  	__u32_field_def(8,	DRBD_GENLA_F_MANDATORY,	timeout, DRBD_TIMEOUT_DEF)
  	__u32_field_def(9,	DRBD_GENLA_F_MANDATORY,	ping_int, DRBD_PING_INT_DEF)
  	__u32_field_def(10,	DRBD_GENLA_F_MANDATORY,	ping_timeo, DRBD_PING_TIMEO_DEF)
  	__u32_field_def(11,	DRBD_GENLA_F_MANDATORY,	sndbuf_size, DRBD_SNDBUF_SIZE_DEF)
  	__u32_field_def(12,	DRBD_GENLA_F_MANDATORY,	rcvbuf_size, DRBD_RCVBUF_SIZE_DEF)
  	__u32_field_def(13,	DRBD_GENLA_F_MANDATORY,	ko_count, DRBD_KO_COUNT_DEF)
  	__u32_field_def(14,	DRBD_GENLA_F_MANDATORY,	max_buffers, DRBD_MAX_BUFFERS_DEF)
  	__u32_field_def(15,	DRBD_GENLA_F_MANDATORY,	max_epoch_size, DRBD_MAX_EPOCH_SIZE_DEF)
  	__u32_field_def(16,	DRBD_GENLA_F_MANDATORY,	unplug_watermark, DRBD_UNPLUG_WATERMARK_DEF)
  	__u32_field_def(17,	DRBD_GENLA_F_MANDATORY,	after_sb_0p, DRBD_AFTER_SB_0P_DEF)
  	__u32_field_def(18,	DRBD_GENLA_F_MANDATORY,	after_sb_1p, DRBD_AFTER_SB_1P_DEF)
  	__u32_field_def(19,	DRBD_GENLA_F_MANDATORY,	after_sb_2p, DRBD_AFTER_SB_2P_DEF)
  	__u32_field_def(20,	DRBD_GENLA_F_MANDATORY,	rr_conflict, DRBD_RR_CONFLICT_DEF)
  	__u32_field_def(21,	DRBD_GENLA_F_MANDATORY,	on_congestion, DRBD_ON_CONGESTION_DEF)
  	__u32_field_def(22,	DRBD_GENLA_F_MANDATORY,	cong_fill, DRBD_CONG_FILL_DEF)
  	__u32_field_def(23,	DRBD_GENLA_F_MANDATORY,	cong_extents, DRBD_CONG_EXTENTS_DEF)
  	__flg_field_def(24, DRBD_GENLA_F_MANDATORY,	two_primaries, DRBD_ALLOW_TWO_PRIMARIES_DEF)
  	__flg_field(25, DRBD_GENLA_F_MANDATORY | DRBD_F_INVARIANT,	discard_my_data)
  	__flg_field_def(26, DRBD_GENLA_F_MANDATORY,	tcp_cork, DRBD_TCP_CORK_DEF)
  	__flg_field_def(27, DRBD_GENLA_F_MANDATORY,	always_asbp, DRBD_ALWAYS_ASBP_DEF)
6dff29022   Andreas Gruenbacher   drbd: Rename --dr...
171
  	__flg_field(28, DRBD_GENLA_F_MANDATORY | DRBD_F_INVARIANT,	tentative)
089c075d8   Andreas Gruenbacher   drbd: Convert the...
172
  	__flg_field_def(29,	DRBD_GENLA_F_MANDATORY,	use_rle, DRBD_USE_RLE_DEF)
9a51ab1c1   Philipp Reisner   drbd: New disk op...
173
  	/* 9: __u32_field_def(30,	DRBD_GENLA_F_MANDATORY,	fencing_policy, DRBD_FENCING_DEF) */
aaaba3457   Lars Ellenberg   drbd: implement c...
174
175
176
  	/* 9: __str_field_def(31,     DRBD_GENLA_F_MANDATORY, name, SHARED_SECRET_MAX) */
  	/* 9: __u32_field(32,         DRBD_F_REQUIRED | DRBD_F_INVARIANT,     peer_node_id) */
  	__flg_field_def(33, 0 /* OPTIONAL */,	csums_after_crash_only, DRBD_CSUMS_AFTER_CRASH_ONLY_DEF)
5d0b17f1a   Philipp Reisner   drbd: New net con...
177
  	__u32_field_def(34, 0 /* OPTIONAL */, sock_check_timeo, DRBD_SOCKET_CHECK_TIMEO_DEF)
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
178
179
180
  )
  
  GENL_struct(DRBD_NLA_SET_ROLE_PARMS, 6, set_role_parms,
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
181
  	__flg_field(1, DRBD_GENLA_F_MANDATORY,	assume_uptodate)
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
182
183
184
  )
  
  GENL_struct(DRBD_NLA_RESIZE_PARMS, 7, resize_parms,
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
185
186
187
  	__u64_field(1, DRBD_GENLA_F_MANDATORY,	resize_size)
  	__flg_field(2, DRBD_GENLA_F_MANDATORY,	resize_force)
  	__flg_field(3, DRBD_GENLA_F_MANDATORY,	no_resync)
d752b2696   Philipp Reisner   drbd: Allow onlin...
188
189
  	__u32_field_def(4, 0 /* OPTIONAL */, al_stripes, DRBD_AL_STRIPES_DEF)
  	__u32_field_def(5, 0 /* OPTIONAL */, al_stripe_size, DRBD_AL_STRIPE_SIZE_DEF)
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
190
191
192
193
194
  )
  
  GENL_struct(DRBD_NLA_STATE_INFO, 8, state_info,
  	/* the reason of the broadcast,
  	 * if this is an event triggered broadcast. */
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
195
196
197
198
  	__u32_field(1, DRBD_GENLA_F_MANDATORY,	sib_reason)
  	__u32_field(2, DRBD_F_REQUIRED,	current_state)
  	__u64_field(3, DRBD_GENLA_F_MANDATORY,	capacity)
  	__u64_field(4, DRBD_GENLA_F_MANDATORY,	ed_uuid)
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
199
200
201
202
203
204
  
  	/* These are for broadcast from after state change work.
  	 * prev_state and new_state are from the moment the state change took
  	 * place, new_state is not neccessarily the same as current_state,
  	 * there may have been more state changes since.  Which will be
  	 * broadcasted soon, in their respective after state change work.  */
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
205
206
  	__u32_field(5, DRBD_GENLA_F_MANDATORY,	prev_state)
  	__u32_field(6, DRBD_GENLA_F_MANDATORY,	new_state)
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
207
208
  
  	/* if we have a local disk: */
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
209
210
211
212
  	__bin_field(7, DRBD_GENLA_F_MANDATORY,	uuids, (UI_SIZE*sizeof(__u64)))
  	__u32_field(8, DRBD_GENLA_F_MANDATORY,	disk_flags)
  	__u64_field(9, DRBD_GENLA_F_MANDATORY,	bits_total)
  	__u64_field(10, DRBD_GENLA_F_MANDATORY,	bits_oos)
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
213
  	/* and in case resync or online verify is active */
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
214
215
  	__u64_field(11, DRBD_GENLA_F_MANDATORY,	bits_rs_total)
  	__u64_field(12, DRBD_GENLA_F_MANDATORY,	bits_rs_failed)
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
216
217
  
  	/* for pre and post notifications of helper execution */
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
218
219
  	__str_field(13, DRBD_GENLA_F_MANDATORY,	helper, 32)
  	__u32_field(14, DRBD_GENLA_F_MANDATORY,	helper_exit_code)
3174f8c50   Philipp Marek   drbd: pass some m...
220
221
222
223
224
225
226
227
228
229
  
  	__u64_field(15,                      0, send_cnt)
  	__u64_field(16,                      0, recv_cnt)
  	__u64_field(17,                      0, read_cnt)
  	__u64_field(18,                      0, writ_cnt)
  	__u64_field(19,                      0, al_writ_cnt)
  	__u64_field(20,                      0, bm_writ_cnt)
  	__u32_field(21,                      0, ap_bio_cnt)
  	__u32_field(22,                      0, ap_pending_cnt)
  	__u32_field(23,                      0, rs_pending_cnt)
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
230
231
232
  )
  
  GENL_struct(DRBD_NLA_START_OV_PARMS, 9, start_ov_parms,
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
233
  	__u64_field(1, DRBD_GENLA_F_MANDATORY,	ov_start_sector)
58ffa580a   Lars Ellenberg   drbd: introduce s...
234
  	__u64_field(2, DRBD_GENLA_F_MANDATORY,	ov_stop_sector)
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
235
236
237
  )
  
  GENL_struct(DRBD_NLA_NEW_C_UUID_PARMS, 10, new_c_uuid_parms,
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
238
  	__flg_field(1, DRBD_GENLA_F_MANDATORY, clear_bm)
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
239
240
241
  )
  
  GENL_struct(DRBD_NLA_TIMEOUT_PARMS, 11, timeout_parms,
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
242
  	__u32_field(1,	DRBD_F_REQUIRED,	timeout_type)
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
243
244
245
  )
  
  GENL_struct(DRBD_NLA_DISCONNECT_PARMS, 12, disconnect_parms,
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
246
  	__flg_field(1, DRBD_GENLA_F_MANDATORY,	force_disconnect)
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
247
  )
cdfda633d   Philipp Reisner   drbd: detach from...
248
249
250
  GENL_struct(DRBD_NLA_DETACH_PARMS, 13, detach_parms,
  	__flg_field(1, DRBD_GENLA_F_MANDATORY,	force_detach)
  )
a29728463   Andreas Gruenbacher   drbd: Backport th...
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
  GENL_struct(DRBD_NLA_RESOURCE_INFO, 15, resource_info,
  	__u32_field(1, 0, res_role)
  	__flg_field(2, 0, res_susp)
  	__flg_field(3, 0, res_susp_nod)
  	__flg_field(4, 0, res_susp_fen)
  	/* __flg_field(5, 0, res_weak) */
  )
  
  GENL_struct(DRBD_NLA_DEVICE_INFO, 16, device_info,
  	__u32_field(1, 0, dev_disk_state)
  )
  
  GENL_struct(DRBD_NLA_CONNECTION_INFO, 17, connection_info,
  	__u32_field(1, 0, conn_connection_state)
  	__u32_field(2, 0, conn_role)
  )
  
  GENL_struct(DRBD_NLA_PEER_DEVICE_INFO, 18, peer_device_info,
  	__u32_field(1, 0, peer_repl_state)
  	__u32_field(2, 0, peer_disk_state)
  	__u32_field(3, 0, peer_resync_susp_user)
  	__u32_field(4, 0, peer_resync_susp_peer)
  	__u32_field(5, 0, peer_resync_susp_dependency)
  )
  
  GENL_struct(DRBD_NLA_RESOURCE_STATISTICS, 19, resource_statistics,
  	__u32_field(1, 0, res_stat_write_ordering)
  )
  
  GENL_struct(DRBD_NLA_DEVICE_STATISTICS, 20, device_statistics,
  	__u64_field(1, 0, dev_size)  /* (sectors) */
  	__u64_field(2, 0, dev_read)  /* (sectors) */
  	__u64_field(3, 0, dev_write)  /* (sectors) */
  	__u64_field(4, 0, dev_al_writes)  /* activity log writes (count) */
  	__u64_field(5, 0, dev_bm_writes)  /*  bitmap writes  (count) */
  	__u32_field(6, 0, dev_upper_pending)  /* application requests in progress */
  	__u32_field(7, 0, dev_lower_pending)  /* backing device requests in progress */
  	__flg_field(8, 0, dev_upper_blocked)
  	__flg_field(9, 0, dev_lower_blocked)
  	__flg_field(10, 0, dev_al_suspended)  /* activity log suspended */
  	__u64_field(11, 0, dev_exposed_data_uuid)
  	__u64_field(12, 0, dev_current_uuid)
  	__u32_field(13, 0, dev_disk_flags)
  	__bin_field(14, 0, history_uuids, HISTORY_UUIDS * sizeof(__u64))
  )
  
  GENL_struct(DRBD_NLA_CONNECTION_STATISTICS, 21, connection_statistics,
  	__flg_field(1, 0, conn_congested)
  )
  
  GENL_struct(DRBD_NLA_PEER_DEVICE_STATISTICS, 22, peer_device_statistics,
  	__u64_field(1, 0, peer_dev_received)  /* sectors */
  	__u64_field(2, 0, peer_dev_sent)  /* sectors */
  	__u32_field(3, 0, peer_dev_pending)  /* number of requests */
  	__u32_field(4, 0, peer_dev_unacked)  /* number of requests */
  	__u64_field(5, 0, peer_dev_out_of_sync)  /* sectors */
  	__u64_field(6, 0, peer_dev_resync_failed)  /* sectors */
  	__u64_field(7, 0, peer_dev_bitmap_uuid)
  	__u32_field(9, 0, peer_dev_flags)
  )
  
  GENL_struct(DRBD_NLA_NOTIFICATION_HEADER, 23, drbd_notification_header,
  	__u32_field(1, DRBD_GENLA_F_MANDATORY, nh_type)
  )
  
  GENL_struct(DRBD_NLA_HELPER, 24, drbd_helper_info,
  	__str_field(1, DRBD_GENLA_F_MANDATORY, helper_name, 32)
  	__u32_field(2, DRBD_GENLA_F_MANDATORY, helper_status)
  )
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
320
321
322
323
324
325
326
327
  /*
   * Notifications and commands (genlmsghdr->cmd)
   */
  GENL_mc_group(events)
  
  	/* kernel -> userspace announcement of changes */
  GENL_notification(
  	DRBD_EVENT, 1, events,
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
328
329
330
331
332
  	GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED)
  	GENL_tla_expected(DRBD_NLA_STATE_INFO, DRBD_F_REQUIRED)
  	GENL_tla_expected(DRBD_NLA_NET_CONF, DRBD_GENLA_F_MANDATORY)
  	GENL_tla_expected(DRBD_NLA_DISK_CONF, DRBD_GENLA_F_MANDATORY)
  	GENL_tla_expected(DRBD_NLA_SYNCER_CONF, DRBD_GENLA_F_MANDATORY)
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
333
334
335
336
337
338
339
340
341
342
343
344
345
  )
  
  	/* query kernel for specific or all info */
  GENL_op(
  	DRBD_ADM_GET_STATUS, 2,
  	GENL_op_init(
  		.doit = drbd_adm_get_status,
  		.dumpit = drbd_adm_get_status_all,
  		/* anyone may ask for the status,
  		 * it is broadcasted anyways */
  	),
  	/* To select the object .doit.
  	 * Or a subset of objects in .dumpit. */
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
346
  	GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_GENLA_F_MANDATORY)
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
347
  )
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
348
  	/* add DRBD minor devices as volumes to resources */
05a10ec79   Andreas Gruenbacher   drbd: Improve som...
349
  GENL_op(DRBD_ADM_NEW_MINOR, 5, GENL_doit(drbd_adm_new_minor),
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
350
  	GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED))
05a10ec79   Andreas Gruenbacher   drbd: Improve som...
351
  GENL_op(DRBD_ADM_DEL_MINOR, 6, GENL_doit(drbd_adm_del_minor),
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
352
  	GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED))
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
353

789c1b626   Andreas Gruenbacher   drbd: Use the ter...
354
355
  	/* add or delete resources */
  GENL_op(DRBD_ADM_NEW_RESOURCE, 7, GENL_doit(drbd_adm_new_resource),
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
356
  	GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED))
789c1b626   Andreas Gruenbacher   drbd: Use the ter...
357
  GENL_op(DRBD_ADM_DEL_RESOURCE, 8, GENL_doit(drbd_adm_del_resource),
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
358
  	GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED))
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
359

f399002e6   Lars Ellenberg   drbd: distribute ...
360
361
  GENL_op(DRBD_ADM_RESOURCE_OPTS, 9,
  	GENL_doit(drbd_adm_resource_opts),
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
362
363
  	GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED)
  	GENL_tla_expected(DRBD_NLA_RESOURCE_OPTS, DRBD_GENLA_F_MANDATORY)
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
364
365
366
367
368
  )
  
  GENL_op(
  	DRBD_ADM_CONNECT, 10,
  	GENL_doit(drbd_adm_connect),
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
369
370
  	GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED)
  	GENL_tla_expected(DRBD_NLA_NET_CONF, DRBD_F_REQUIRED)
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
371
  )
f399002e6   Lars Ellenberg   drbd: distribute ...
372
373
374
  GENL_op(
  	DRBD_ADM_CHG_NET_OPTS, 29,
  	GENL_doit(drbd_adm_net_opts),
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
375
376
  	GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED)
  	GENL_tla_expected(DRBD_NLA_NET_CONF, DRBD_F_REQUIRED)
f399002e6   Lars Ellenberg   drbd: distribute ...
377
  )
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
378
  GENL_op(DRBD_ADM_DISCONNECT, 11, GENL_doit(drbd_adm_disconnect),
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
379
  	GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED))
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
380

ec2c35ac1   Lars Ellenberg   drbd: prepare the...
381
382
  GENL_op(DRBD_ADM_ATTACH, 12,
  	GENL_doit(drbd_adm_attach),
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
383
384
  	GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED)
  	GENL_tla_expected(DRBD_NLA_DISK_CONF, DRBD_F_REQUIRED)
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
385
  )
f399002e6   Lars Ellenberg   drbd: distribute ...
386
387
  GENL_op(DRBD_ADM_CHG_DISK_OPTS, 28,
  	GENL_doit(drbd_adm_disk_opts),
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
388
389
  	GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED)
  	GENL_tla_expected(DRBD_NLA_DISK_OPTS, DRBD_F_REQUIRED)
f399002e6   Lars Ellenberg   drbd: distribute ...
390
  )
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
391
392
393
  GENL_op(
  	DRBD_ADM_RESIZE, 13,
  	GENL_doit(drbd_adm_resize),
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
394
395
  	GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED)
  	GENL_tla_expected(DRBD_NLA_RESIZE_PARMS, DRBD_GENLA_F_MANDATORY)
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
396
  )
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
397
398
399
  GENL_op(
  	DRBD_ADM_PRIMARY, 14,
  	GENL_doit(drbd_adm_set_role),
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
400
401
  	GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED)
  	GENL_tla_expected(DRBD_NLA_SET_ROLE_PARMS, DRBD_F_REQUIRED)
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
402
403
404
405
406
  )
  
  GENL_op(
  	DRBD_ADM_SECONDARY, 15,
  	GENL_doit(drbd_adm_set_role),
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
407
408
  	GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED)
  	GENL_tla_expected(DRBD_NLA_SET_ROLE_PARMS, DRBD_F_REQUIRED)
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
409
410
411
412
413
  )
  
  GENL_op(
  	DRBD_ADM_NEW_C_UUID, 16,
  	GENL_doit(drbd_adm_new_c_uuid),
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
414
415
  	GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED)
  	GENL_tla_expected(DRBD_NLA_NEW_C_UUID_PARMS, DRBD_GENLA_F_MANDATORY)
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
416
417
418
419
420
  )
  
  GENL_op(
  	DRBD_ADM_START_OV, 17,
  	GENL_doit(drbd_adm_start_ov),
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
421
  	GENL_tla_expected(DRBD_NLA_START_OV_PARMS, DRBD_GENLA_F_MANDATORY)
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
422
423
424
  )
  
  GENL_op(DRBD_ADM_DETACH,	18, GENL_doit(drbd_adm_detach),
cdfda633d   Philipp Reisner   drbd: detach from...
425
426
  	GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED)
  	GENL_tla_expected(DRBD_NLA_DETACH_PARMS, DRBD_GENLA_F_MANDATORY))
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
427
  GENL_op(DRBD_ADM_INVALIDATE,	19, GENL_doit(drbd_adm_invalidate),
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
428
  	GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED))
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
429
  GENL_op(DRBD_ADM_INVAL_PEER,	20, GENL_doit(drbd_adm_invalidate_peer),
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
430
  	GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED))
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
431
  GENL_op(DRBD_ADM_PAUSE_SYNC,	21, GENL_doit(drbd_adm_pause_sync),
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
432
  	GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED))
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
433
  GENL_op(DRBD_ADM_RESUME_SYNC,	22, GENL_doit(drbd_adm_resume_sync),
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
434
  	GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED))
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
435
  GENL_op(DRBD_ADM_SUSPEND_IO,	23, GENL_doit(drbd_adm_suspend_io),
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
436
  	GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED))
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
437
  GENL_op(DRBD_ADM_RESUME_IO,	24, GENL_doit(drbd_adm_resume_io),
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
438
  	GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED))
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
439
  GENL_op(DRBD_ADM_OUTDATE,	25, GENL_doit(drbd_adm_outdate),
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
440
  	GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED))
ec2c35ac1   Lars Ellenberg   drbd: prepare the...
441
  GENL_op(DRBD_ADM_GET_TIMEOUT_TYPE, 26, GENL_doit(drbd_adm_get_timeout_type),
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
442
  	GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED))
85f75dd76   Lars Ellenberg   drbd: introduce i...
443
  GENL_op(DRBD_ADM_DOWN,		27, GENL_doit(drbd_adm_down),
5f9359201   Andreas Gruenbacher   drbd: Make drbd's...
444
  	GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED))
a29728463   Andreas Gruenbacher   drbd: Backport th...
445

a55bbd375   Andreas Gruenbacher   drbd: Backport th...
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
  GENL_op(DRBD_ADM_GET_RESOURCES, 30,
  	 GENL_op_init(
  		 .dumpit = drbd_adm_dump_resources,
  	 ),
  	 GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_GENLA_F_MANDATORY)
  	 GENL_tla_expected(DRBD_NLA_RESOURCE_INFO, DRBD_GENLA_F_MANDATORY)
  	 GENL_tla_expected(DRBD_NLA_RESOURCE_STATISTICS, DRBD_GENLA_F_MANDATORY))
  
  GENL_op(DRBD_ADM_GET_DEVICES, 31,
  	 GENL_op_init(
  		 .dumpit = drbd_adm_dump_devices,
  		 .done = drbd_adm_dump_devices_done,
  	 ),
  	 GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_GENLA_F_MANDATORY)
  	 GENL_tla_expected(DRBD_NLA_DEVICE_INFO, DRBD_GENLA_F_MANDATORY)
  	 GENL_tla_expected(DRBD_NLA_DEVICE_STATISTICS, DRBD_GENLA_F_MANDATORY))
  
  GENL_op(DRBD_ADM_GET_CONNECTIONS, 32,
  	 GENL_op_init(
  		 .dumpit = drbd_adm_dump_connections,
  		 .done = drbd_adm_dump_connections_done,
  	 ),
  	 GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_GENLA_F_MANDATORY)
  	 GENL_tla_expected(DRBD_NLA_CONNECTION_INFO, DRBD_GENLA_F_MANDATORY)
  	 GENL_tla_expected(DRBD_NLA_CONNECTION_STATISTICS, DRBD_GENLA_F_MANDATORY))
  
  GENL_op(DRBD_ADM_GET_PEER_DEVICES, 33,
  	 GENL_op_init(
  		 .dumpit = drbd_adm_dump_peer_devices,
  		 .done = drbd_adm_dump_peer_devices_done,
  	 ),
  	 GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_GENLA_F_MANDATORY)
  	 GENL_tla_expected(DRBD_NLA_PEER_DEVICE_INFO, DRBD_GENLA_F_MANDATORY)
  	 GENL_tla_expected(DRBD_NLA_PEER_DEVICE_STATISTICS, DRBD_GENLA_F_MANDATORY))
a29728463   Andreas Gruenbacher   drbd: Backport th...
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
  GENL_notification(
  	DRBD_RESOURCE_STATE, 34, events,
  	GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED)
  	GENL_tla_expected(DRBD_NLA_NOTIFICATION_HEADER, DRBD_F_REQUIRED)
  	GENL_tla_expected(DRBD_NLA_RESOURCE_INFO, DRBD_F_REQUIRED)
  	GENL_tla_expected(DRBD_NLA_RESOURCE_STATISTICS, DRBD_F_REQUIRED))
  
  GENL_notification(
  	DRBD_DEVICE_STATE, 35, events,
  	GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED)
  	GENL_tla_expected(DRBD_NLA_NOTIFICATION_HEADER, DRBD_F_REQUIRED)
  	GENL_tla_expected(DRBD_NLA_DEVICE_INFO, DRBD_F_REQUIRED)
  	GENL_tla_expected(DRBD_NLA_DEVICE_STATISTICS, DRBD_F_REQUIRED))
  
  GENL_notification(
  	DRBD_CONNECTION_STATE, 36, events,
  	GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED)
  	GENL_tla_expected(DRBD_NLA_NOTIFICATION_HEADER, DRBD_F_REQUIRED)
  	GENL_tla_expected(DRBD_NLA_CONNECTION_INFO, DRBD_F_REQUIRED)
  	GENL_tla_expected(DRBD_NLA_CONNECTION_STATISTICS, DRBD_F_REQUIRED))
  
  GENL_notification(
  	DRBD_PEER_DEVICE_STATE, 37, events,
  	GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED)
  	GENL_tla_expected(DRBD_NLA_NOTIFICATION_HEADER, DRBD_F_REQUIRED)
  	GENL_tla_expected(DRBD_NLA_PEER_DEVICE_INFO, DRBD_F_REQUIRED)
  	GENL_tla_expected(DRBD_NLA_PEER_DEVICE_STATISTICS, DRBD_F_REQUIRED))
  
  GENL_op(
  	DRBD_ADM_GET_INITIAL_STATE, 38,
  	GENL_op_init(
  	        .dumpit = drbd_adm_get_initial_state,
  	),
  	GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_GENLA_F_MANDATORY))
  
  GENL_notification(
  	DRBD_HELPER, 40, events,
  	GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED)
  	GENL_tla_expected(DRBD_NLA_HELPER, DRBD_F_REQUIRED))
  
  GENL_notification(
  	DRBD_INITIAL_STATE_DONE, 41, events,
  	GENL_tla_expected(DRBD_NLA_NOTIFICATION_HEADER, DRBD_F_REQUIRED))