xref: /linux/drivers/block/drbd/drbd_nl_gen.c (revision 0eaed89c18aeedf0898baf2dbf5ff027c6795152)
1*8098eeb6SChristoph Böhmwalder // SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
2*8098eeb6SChristoph Böhmwalder 
3*8098eeb6SChristoph Böhmwalder #include <net/netlink.h>
4*8098eeb6SChristoph Böhmwalder #include <net/genetlink.h>
5*8098eeb6SChristoph Böhmwalder 
6*8098eeb6SChristoph Böhmwalder #include <linux/kernel.h>
7*8098eeb6SChristoph Böhmwalder #include <linux/slab.h>
8*8098eeb6SChristoph Böhmwalder #include "drbd_nl_gen.h"
9*8098eeb6SChristoph Böhmwalder 
10*8098eeb6SChristoph Böhmwalder #include <uapi/linux/drbd_genl.h>
11*8098eeb6SChristoph Böhmwalder #include <linux/drbd.h>
12*8098eeb6SChristoph Böhmwalder #include <linux/drbd_limits.h>
13*8098eeb6SChristoph Böhmwalder 
14*8098eeb6SChristoph Böhmwalder /* Common nested types */
15*8098eeb6SChristoph Böhmwalder const struct nla_policy drbd_connection_info_nl_policy[DRBD_A_CONNECTION_INFO_CONN_ROLE + 1] = {
16*8098eeb6SChristoph Böhmwalder 	[DRBD_A_CONNECTION_INFO_CONN_CONNECTION_STATE] = { .type = NLA_U32, },
17*8098eeb6SChristoph Böhmwalder 	[DRBD_A_CONNECTION_INFO_CONN_ROLE] = { .type = NLA_U32, },
18*8098eeb6SChristoph Böhmwalder };
19*8098eeb6SChristoph Böhmwalder 
20*8098eeb6SChristoph Böhmwalder const struct nla_policy drbd_connection_statistics_nl_policy[DRBD_A_CONNECTION_STATISTICS_CONN_CONGESTED + 1] = {
21*8098eeb6SChristoph Böhmwalder 	[DRBD_A_CONNECTION_STATISTICS_CONN_CONGESTED] = { .type = NLA_U8, },
22*8098eeb6SChristoph Böhmwalder };
23*8098eeb6SChristoph Böhmwalder 
24*8098eeb6SChristoph Böhmwalder const struct nla_policy drbd_detach_parms_nl_policy[DRBD_A_DETACH_PARMS_FORCE_DETACH + 1] = {
25*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DETACH_PARMS_FORCE_DETACH] = { .type = NLA_U8, },
26*8098eeb6SChristoph Böhmwalder };
27*8098eeb6SChristoph Böhmwalder 
28*8098eeb6SChristoph Böhmwalder const struct nla_policy drbd_device_info_nl_policy[DRBD_A_DEVICE_INFO_DEV_DISK_STATE + 1] = {
29*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DEVICE_INFO_DEV_DISK_STATE] = { .type = NLA_U32, },
30*8098eeb6SChristoph Böhmwalder };
31*8098eeb6SChristoph Böhmwalder 
32*8098eeb6SChristoph Böhmwalder const struct nla_policy drbd_device_statistics_nl_policy[DRBD_A_DEVICE_STATISTICS_HISTORY_UUIDS + 1] = {
33*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DEVICE_STATISTICS_DEV_SIZE] = { .type = NLA_U64, },
34*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DEVICE_STATISTICS_DEV_READ] = { .type = NLA_U64, },
35*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DEVICE_STATISTICS_DEV_WRITE] = { .type = NLA_U64, },
36*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DEVICE_STATISTICS_DEV_AL_WRITES] = { .type = NLA_U64, },
37*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DEVICE_STATISTICS_DEV_BM_WRITES] = { .type = NLA_U64, },
38*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DEVICE_STATISTICS_DEV_UPPER_PENDING] = { .type = NLA_U32, },
39*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DEVICE_STATISTICS_DEV_LOWER_PENDING] = { .type = NLA_U32, },
40*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DEVICE_STATISTICS_DEV_UPPER_BLOCKED] = { .type = NLA_U8, },
41*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DEVICE_STATISTICS_DEV_LOWER_BLOCKED] = { .type = NLA_U8, },
42*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DEVICE_STATISTICS_DEV_AL_SUSPENDED] = { .type = NLA_U8, },
43*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DEVICE_STATISTICS_DEV_EXPOSED_DATA_UUID] = { .type = NLA_U64, },
44*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DEVICE_STATISTICS_DEV_CURRENT_UUID] = { .type = NLA_U64, },
45*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DEVICE_STATISTICS_DEV_DISK_FLAGS] = { .type = NLA_U32, },
46*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DEVICE_STATISTICS_HISTORY_UUIDS] = NLA_POLICY_MAX_LEN(DRBD_NL_HISTORY_UUIDS_SIZE),
47*8098eeb6SChristoph Böhmwalder };
48*8098eeb6SChristoph Böhmwalder 
49*8098eeb6SChristoph Böhmwalder const struct nla_policy drbd_disconnect_parms_nl_policy[DRBD_A_DISCONNECT_PARMS_FORCE_DISCONNECT + 1] = {
50*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DISCONNECT_PARMS_FORCE_DISCONNECT] = { .type = NLA_U8, },
51*8098eeb6SChristoph Böhmwalder };
52*8098eeb6SChristoph Böhmwalder 
53*8098eeb6SChristoph Böhmwalder const struct nla_policy drbd_disk_conf_nl_policy[DRBD_A_DISK_CONF_DISABLE_WRITE_SAME + 1] = {
54*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DISK_CONF_BACKING_DEV] = { .type = NLA_NUL_STRING, .len = 128, },
55*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DISK_CONF_META_DEV] = { .type = NLA_NUL_STRING, .len = 128, },
56*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DISK_CONF_META_DEV_IDX] = { .type = NLA_U32, },
57*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DISK_CONF_DISK_SIZE] = { .type = NLA_U64, },
58*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DISK_CONF_MAX_BIO_BVECS] = { .type = NLA_U32, },
59*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DISK_CONF_ON_IO_ERROR] = { .type = NLA_U32, },
60*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DISK_CONF_FENCING] = { .type = NLA_U32, },
61*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DISK_CONF_RESYNC_RATE] = { .type = NLA_U32, },
62*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DISK_CONF_RESYNC_AFTER] = { .type = NLA_U32, },
63*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DISK_CONF_AL_EXTENTS] = { .type = NLA_U32, },
64*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DISK_CONF_C_PLAN_AHEAD] = { .type = NLA_U32, },
65*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DISK_CONF_C_DELAY_TARGET] = { .type = NLA_U32, },
66*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DISK_CONF_C_FILL_TARGET] = { .type = NLA_U32, },
67*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DISK_CONF_C_MAX_RATE] = { .type = NLA_U32, },
68*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DISK_CONF_C_MIN_RATE] = { .type = NLA_U32, },
69*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DISK_CONF_DISK_BARRIER] = { .type = NLA_U8, },
70*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DISK_CONF_DISK_FLUSHES] = { .type = NLA_U8, },
71*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DISK_CONF_DISK_DRAIN] = { .type = NLA_U8, },
72*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DISK_CONF_MD_FLUSHES] = { .type = NLA_U8, },
73*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DISK_CONF_DISK_TIMEOUT] = { .type = NLA_U32, },
74*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DISK_CONF_READ_BALANCING] = { .type = NLA_U32, },
75*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DISK_CONF_AL_UPDATES] = { .type = NLA_U8, },
76*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DISK_CONF_DISCARD_ZEROES_IF_ALIGNED] = { .type = NLA_U8, },
77*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DISK_CONF_RS_DISCARD_GRANULARITY] = { .type = NLA_U32, },
78*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DISK_CONF_DISABLE_WRITE_SAME] = { .type = NLA_U8, },
79*8098eeb6SChristoph Böhmwalder };
80*8098eeb6SChristoph Böhmwalder 
81*8098eeb6SChristoph Böhmwalder const struct nla_policy drbd_drbd_cfg_context_nl_policy[DRBD_A_DRBD_CFG_CONTEXT_CTX_PEER_ADDR + 1] = {
82*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DRBD_CFG_CONTEXT_CTX_VOLUME] = { .type = NLA_U32, },
83*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DRBD_CFG_CONTEXT_CTX_RESOURCE_NAME] = { .type = NLA_NUL_STRING, .len = 128, },
84*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DRBD_CFG_CONTEXT_CTX_MY_ADDR] = NLA_POLICY_MAX_LEN(128),
85*8098eeb6SChristoph Böhmwalder 	[DRBD_A_DRBD_CFG_CONTEXT_CTX_PEER_ADDR] = NLA_POLICY_MAX_LEN(128),
86*8098eeb6SChristoph Böhmwalder };
87*8098eeb6SChristoph Böhmwalder 
88*8098eeb6SChristoph Böhmwalder const struct nla_policy drbd_net_conf_nl_policy[DRBD_A_NET_CONF_SOCK_CHECK_TIMEO + 1] = {
89*8098eeb6SChristoph Böhmwalder 	[DRBD_A_NET_CONF_SHARED_SECRET] = { .type = NLA_NUL_STRING, .len = SHARED_SECRET_MAX, },
90*8098eeb6SChristoph Böhmwalder 	[DRBD_A_NET_CONF_CRAM_HMAC_ALG] = { .type = NLA_NUL_STRING, .len = SHARED_SECRET_MAX, },
91*8098eeb6SChristoph Böhmwalder 	[DRBD_A_NET_CONF_INTEGRITY_ALG] = { .type = NLA_NUL_STRING, .len = SHARED_SECRET_MAX, },
92*8098eeb6SChristoph Böhmwalder 	[DRBD_A_NET_CONF_VERIFY_ALG] = { .type = NLA_NUL_STRING, .len = SHARED_SECRET_MAX, },
93*8098eeb6SChristoph Böhmwalder 	[DRBD_A_NET_CONF_CSUMS_ALG] = { .type = NLA_NUL_STRING, .len = SHARED_SECRET_MAX, },
94*8098eeb6SChristoph Böhmwalder 	[DRBD_A_NET_CONF_WIRE_PROTOCOL] = { .type = NLA_U32, },
95*8098eeb6SChristoph Böhmwalder 	[DRBD_A_NET_CONF_CONNECT_INT] = { .type = NLA_U32, },
96*8098eeb6SChristoph Böhmwalder 	[DRBD_A_NET_CONF_TIMEOUT] = { .type = NLA_U32, },
97*8098eeb6SChristoph Böhmwalder 	[DRBD_A_NET_CONF_PING_INT] = { .type = NLA_U32, },
98*8098eeb6SChristoph Böhmwalder 	[DRBD_A_NET_CONF_PING_TIMEO] = { .type = NLA_U32, },
99*8098eeb6SChristoph Böhmwalder 	[DRBD_A_NET_CONF_SNDBUF_SIZE] = { .type = NLA_U32, },
100*8098eeb6SChristoph Böhmwalder 	[DRBD_A_NET_CONF_RCVBUF_SIZE] = { .type = NLA_U32, },
101*8098eeb6SChristoph Böhmwalder 	[DRBD_A_NET_CONF_KO_COUNT] = { .type = NLA_U32, },
102*8098eeb6SChristoph Böhmwalder 	[DRBD_A_NET_CONF_MAX_BUFFERS] = { .type = NLA_U32, },
103*8098eeb6SChristoph Böhmwalder 	[DRBD_A_NET_CONF_MAX_EPOCH_SIZE] = { .type = NLA_U32, },
104*8098eeb6SChristoph Böhmwalder 	[DRBD_A_NET_CONF_UNPLUG_WATERMARK] = { .type = NLA_U32, },
105*8098eeb6SChristoph Böhmwalder 	[DRBD_A_NET_CONF_AFTER_SB_0P] = { .type = NLA_U32, },
106*8098eeb6SChristoph Böhmwalder 	[DRBD_A_NET_CONF_AFTER_SB_1P] = { .type = NLA_U32, },
107*8098eeb6SChristoph Böhmwalder 	[DRBD_A_NET_CONF_AFTER_SB_2P] = { .type = NLA_U32, },
108*8098eeb6SChristoph Böhmwalder 	[DRBD_A_NET_CONF_RR_CONFLICT] = { .type = NLA_U32, },
109*8098eeb6SChristoph Böhmwalder 	[DRBD_A_NET_CONF_ON_CONGESTION] = { .type = NLA_U32, },
110*8098eeb6SChristoph Böhmwalder 	[DRBD_A_NET_CONF_CONG_FILL] = { .type = NLA_U32, },
111*8098eeb6SChristoph Böhmwalder 	[DRBD_A_NET_CONF_CONG_EXTENTS] = { .type = NLA_U32, },
112*8098eeb6SChristoph Böhmwalder 	[DRBD_A_NET_CONF_TWO_PRIMARIES] = { .type = NLA_U8, },
113*8098eeb6SChristoph Böhmwalder 	[DRBD_A_NET_CONF_DISCARD_MY_DATA] = { .type = NLA_U8, },
114*8098eeb6SChristoph Böhmwalder 	[DRBD_A_NET_CONF_TCP_CORK] = { .type = NLA_U8, },
115*8098eeb6SChristoph Böhmwalder 	[DRBD_A_NET_CONF_ALWAYS_ASBP] = { .type = NLA_U8, },
116*8098eeb6SChristoph Böhmwalder 	[DRBD_A_NET_CONF_TENTATIVE] = { .type = NLA_U8, },
117*8098eeb6SChristoph Böhmwalder 	[DRBD_A_NET_CONF_USE_RLE] = { .type = NLA_U8, },
118*8098eeb6SChristoph Böhmwalder 	[DRBD_A_NET_CONF_CSUMS_AFTER_CRASH_ONLY] = { .type = NLA_U8, },
119*8098eeb6SChristoph Böhmwalder 	[DRBD_A_NET_CONF_SOCK_CHECK_TIMEO] = { .type = NLA_U32, },
120*8098eeb6SChristoph Böhmwalder };
121*8098eeb6SChristoph Böhmwalder 
122*8098eeb6SChristoph Böhmwalder const struct nla_policy drbd_new_c_uuid_parms_nl_policy[DRBD_A_NEW_C_UUID_PARMS_CLEAR_BM + 1] = {
123*8098eeb6SChristoph Böhmwalder 	[DRBD_A_NEW_C_UUID_PARMS_CLEAR_BM] = { .type = NLA_U8, },
124*8098eeb6SChristoph Böhmwalder };
125*8098eeb6SChristoph Böhmwalder 
126*8098eeb6SChristoph Böhmwalder const struct nla_policy drbd_peer_device_info_nl_policy[DRBD_A_PEER_DEVICE_INFO_PEER_RESYNC_SUSP_DEPENDENCY + 1] = {
127*8098eeb6SChristoph Böhmwalder 	[DRBD_A_PEER_DEVICE_INFO_PEER_REPL_STATE] = { .type = NLA_U32, },
128*8098eeb6SChristoph Böhmwalder 	[DRBD_A_PEER_DEVICE_INFO_PEER_DISK_STATE] = { .type = NLA_U32, },
129*8098eeb6SChristoph Böhmwalder 	[DRBD_A_PEER_DEVICE_INFO_PEER_RESYNC_SUSP_USER] = { .type = NLA_U32, },
130*8098eeb6SChristoph Böhmwalder 	[DRBD_A_PEER_DEVICE_INFO_PEER_RESYNC_SUSP_PEER] = { .type = NLA_U32, },
131*8098eeb6SChristoph Böhmwalder 	[DRBD_A_PEER_DEVICE_INFO_PEER_RESYNC_SUSP_DEPENDENCY] = { .type = NLA_U32, },
132*8098eeb6SChristoph Böhmwalder };
133*8098eeb6SChristoph Böhmwalder 
134*8098eeb6SChristoph Böhmwalder const struct nla_policy drbd_peer_device_statistics_nl_policy[DRBD_A_PEER_DEVICE_STATISTICS_PEER_DEV_FLAGS + 1] = {
135*8098eeb6SChristoph Böhmwalder 	[DRBD_A_PEER_DEVICE_STATISTICS_PEER_DEV_RECEIVED] = { .type = NLA_U64, },
136*8098eeb6SChristoph Böhmwalder 	[DRBD_A_PEER_DEVICE_STATISTICS_PEER_DEV_SENT] = { .type = NLA_U64, },
137*8098eeb6SChristoph Böhmwalder 	[DRBD_A_PEER_DEVICE_STATISTICS_PEER_DEV_PENDING] = { .type = NLA_U32, },
138*8098eeb6SChristoph Böhmwalder 	[DRBD_A_PEER_DEVICE_STATISTICS_PEER_DEV_UNACKED] = { .type = NLA_U32, },
139*8098eeb6SChristoph Böhmwalder 	[DRBD_A_PEER_DEVICE_STATISTICS_PEER_DEV_OUT_OF_SYNC] = { .type = NLA_U64, },
140*8098eeb6SChristoph Böhmwalder 	[DRBD_A_PEER_DEVICE_STATISTICS_PEER_DEV_RESYNC_FAILED] = { .type = NLA_U64, },
141*8098eeb6SChristoph Böhmwalder 	[DRBD_A_PEER_DEVICE_STATISTICS_PEER_DEV_BITMAP_UUID] = { .type = NLA_U64, },
142*8098eeb6SChristoph Böhmwalder 	[DRBD_A_PEER_DEVICE_STATISTICS_PEER_DEV_FLAGS] = { .type = NLA_U32, },
143*8098eeb6SChristoph Böhmwalder };
144*8098eeb6SChristoph Böhmwalder 
145*8098eeb6SChristoph Böhmwalder const struct nla_policy drbd_res_opts_nl_policy[DRBD_A_RES_OPTS_ON_NO_DATA + 1] = {
146*8098eeb6SChristoph Böhmwalder 	[DRBD_A_RES_OPTS_CPU_MASK] = { .type = NLA_NUL_STRING, .len = DRBD_CPU_MASK_SIZE, },
147*8098eeb6SChristoph Böhmwalder 	[DRBD_A_RES_OPTS_ON_NO_DATA] = { .type = NLA_U32, },
148*8098eeb6SChristoph Böhmwalder };
149*8098eeb6SChristoph Böhmwalder 
150*8098eeb6SChristoph Böhmwalder const struct nla_policy drbd_resize_parms_nl_policy[DRBD_A_RESIZE_PARMS_AL_STRIPE_SIZE + 1] = {
151*8098eeb6SChristoph Böhmwalder 	[DRBD_A_RESIZE_PARMS_RESIZE_SIZE] = { .type = NLA_U64, },
152*8098eeb6SChristoph Böhmwalder 	[DRBD_A_RESIZE_PARMS_RESIZE_FORCE] = { .type = NLA_U8, },
153*8098eeb6SChristoph Böhmwalder 	[DRBD_A_RESIZE_PARMS_NO_RESYNC] = { .type = NLA_U8, },
154*8098eeb6SChristoph Böhmwalder 	[DRBD_A_RESIZE_PARMS_AL_STRIPES] = { .type = NLA_U32, },
155*8098eeb6SChristoph Böhmwalder 	[DRBD_A_RESIZE_PARMS_AL_STRIPE_SIZE] = { .type = NLA_U32, },
156*8098eeb6SChristoph Böhmwalder };
157*8098eeb6SChristoph Böhmwalder 
158*8098eeb6SChristoph Böhmwalder const struct nla_policy drbd_resource_info_nl_policy[DRBD_A_RESOURCE_INFO_RES_SUSP_FEN + 1] = {
159*8098eeb6SChristoph Böhmwalder 	[DRBD_A_RESOURCE_INFO_RES_ROLE] = { .type = NLA_U32, },
160*8098eeb6SChristoph Böhmwalder 	[DRBD_A_RESOURCE_INFO_RES_SUSP] = { .type = NLA_U8, },
161*8098eeb6SChristoph Böhmwalder 	[DRBD_A_RESOURCE_INFO_RES_SUSP_NOD] = { .type = NLA_U8, },
162*8098eeb6SChristoph Böhmwalder 	[DRBD_A_RESOURCE_INFO_RES_SUSP_FEN] = { .type = NLA_U8, },
163*8098eeb6SChristoph Böhmwalder };
164*8098eeb6SChristoph Böhmwalder 
165*8098eeb6SChristoph Böhmwalder const struct nla_policy drbd_resource_statistics_nl_policy[DRBD_A_RESOURCE_STATISTICS_RES_STAT_WRITE_ORDERING + 1] = {
166*8098eeb6SChristoph Böhmwalder 	[DRBD_A_RESOURCE_STATISTICS_RES_STAT_WRITE_ORDERING] = { .type = NLA_U32, },
167*8098eeb6SChristoph Böhmwalder };
168*8098eeb6SChristoph Böhmwalder 
169*8098eeb6SChristoph Böhmwalder const struct nla_policy drbd_set_role_parms_nl_policy[DRBD_A_SET_ROLE_PARMS_ASSUME_UPTODATE + 1] = {
170*8098eeb6SChristoph Böhmwalder 	[DRBD_A_SET_ROLE_PARMS_ASSUME_UPTODATE] = { .type = NLA_U8, },
171*8098eeb6SChristoph Böhmwalder };
172*8098eeb6SChristoph Böhmwalder 
173*8098eeb6SChristoph Böhmwalder const struct nla_policy drbd_start_ov_parms_nl_policy[DRBD_A_START_OV_PARMS_OV_STOP_SECTOR + 1] = {
174*8098eeb6SChristoph Böhmwalder 	[DRBD_A_START_OV_PARMS_OV_START_SECTOR] = { .type = NLA_U64, },
175*8098eeb6SChristoph Böhmwalder 	[DRBD_A_START_OV_PARMS_OV_STOP_SECTOR] = { .type = NLA_U64, },
176*8098eeb6SChristoph Böhmwalder };
177*8098eeb6SChristoph Böhmwalder 
178*8098eeb6SChristoph Böhmwalder /* DRBD_ADM_GET_STATUS - do */
179*8098eeb6SChristoph Böhmwalder static const struct nla_policy drbd_get_status_do_nl_policy[DRBD_NLA_CFG_CONTEXT + 1] = {
180*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_CFG_CONTEXT] = NLA_POLICY_NESTED(drbd_drbd_cfg_context_nl_policy),
181*8098eeb6SChristoph Böhmwalder };
182*8098eeb6SChristoph Böhmwalder 
183*8098eeb6SChristoph Böhmwalder /* DRBD_ADM_GET_STATUS - dump */
184*8098eeb6SChristoph Böhmwalder static const struct nla_policy drbd_get_status_dump_nl_policy[DRBD_NLA_CFG_CONTEXT + 1] = {
185*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_CFG_CONTEXT] = NLA_POLICY_NESTED(drbd_drbd_cfg_context_nl_policy),
186*8098eeb6SChristoph Böhmwalder };
187*8098eeb6SChristoph Böhmwalder 
188*8098eeb6SChristoph Böhmwalder /* DRBD_ADM_NEW_MINOR - do */
189*8098eeb6SChristoph Böhmwalder static const struct nla_policy drbd_new_minor_nl_policy[DRBD_NLA_CFG_CONTEXT + 1] = {
190*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_CFG_CONTEXT] = NLA_POLICY_NESTED(drbd_drbd_cfg_context_nl_policy),
191*8098eeb6SChristoph Böhmwalder };
192*8098eeb6SChristoph Böhmwalder 
193*8098eeb6SChristoph Böhmwalder /* DRBD_ADM_DEL_MINOR - do */
194*8098eeb6SChristoph Böhmwalder static const struct nla_policy drbd_del_minor_nl_policy[DRBD_NLA_CFG_CONTEXT + 1] = {
195*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_CFG_CONTEXT] = NLA_POLICY_NESTED(drbd_drbd_cfg_context_nl_policy),
196*8098eeb6SChristoph Böhmwalder };
197*8098eeb6SChristoph Böhmwalder 
198*8098eeb6SChristoph Böhmwalder /* DRBD_ADM_NEW_RESOURCE - do */
199*8098eeb6SChristoph Böhmwalder static const struct nla_policy drbd_new_resource_nl_policy[DRBD_NLA_RESOURCE_OPTS + 1] = {
200*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_CFG_CONTEXT] = NLA_POLICY_NESTED(drbd_drbd_cfg_context_nl_policy),
201*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_RESOURCE_OPTS] = NLA_POLICY_NESTED(drbd_res_opts_nl_policy),
202*8098eeb6SChristoph Böhmwalder };
203*8098eeb6SChristoph Böhmwalder 
204*8098eeb6SChristoph Böhmwalder /* DRBD_ADM_DEL_RESOURCE - do */
205*8098eeb6SChristoph Böhmwalder static const struct nla_policy drbd_del_resource_nl_policy[DRBD_NLA_CFG_CONTEXT + 1] = {
206*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_CFG_CONTEXT] = NLA_POLICY_NESTED(drbd_drbd_cfg_context_nl_policy),
207*8098eeb6SChristoph Böhmwalder };
208*8098eeb6SChristoph Böhmwalder 
209*8098eeb6SChristoph Böhmwalder /* DRBD_ADM_RESOURCE_OPTS - do */
210*8098eeb6SChristoph Böhmwalder static const struct nla_policy drbd_resource_opts_nl_policy[DRBD_NLA_RESOURCE_OPTS + 1] = {
211*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_CFG_CONTEXT] = NLA_POLICY_NESTED(drbd_drbd_cfg_context_nl_policy),
212*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_RESOURCE_OPTS] = NLA_POLICY_NESTED(drbd_res_opts_nl_policy),
213*8098eeb6SChristoph Böhmwalder };
214*8098eeb6SChristoph Böhmwalder 
215*8098eeb6SChristoph Böhmwalder /* DRBD_ADM_CONNECT - do */
216*8098eeb6SChristoph Böhmwalder static const struct nla_policy drbd_connect_nl_policy[DRBD_NLA_NET_CONF + 1] = {
217*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_CFG_CONTEXT] = NLA_POLICY_NESTED(drbd_drbd_cfg_context_nl_policy),
218*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_NET_CONF] = NLA_POLICY_NESTED(drbd_net_conf_nl_policy),
219*8098eeb6SChristoph Böhmwalder };
220*8098eeb6SChristoph Böhmwalder 
221*8098eeb6SChristoph Böhmwalder /* DRBD_ADM_DISCONNECT - do */
222*8098eeb6SChristoph Böhmwalder static const struct nla_policy drbd_disconnect_nl_policy[DRBD_NLA_DISCONNECT_PARMS + 1] = {
223*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_CFG_CONTEXT] = NLA_POLICY_NESTED(drbd_drbd_cfg_context_nl_policy),
224*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_DISCONNECT_PARMS] = NLA_POLICY_NESTED(drbd_disconnect_parms_nl_policy),
225*8098eeb6SChristoph Böhmwalder };
226*8098eeb6SChristoph Böhmwalder 
227*8098eeb6SChristoph Böhmwalder /* DRBD_ADM_ATTACH - do */
228*8098eeb6SChristoph Böhmwalder static const struct nla_policy drbd_attach_nl_policy[DRBD_NLA_DISK_CONF + 1] = {
229*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_CFG_CONTEXT] = NLA_POLICY_NESTED(drbd_drbd_cfg_context_nl_policy),
230*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_DISK_CONF] = NLA_POLICY_NESTED(drbd_disk_conf_nl_policy),
231*8098eeb6SChristoph Böhmwalder };
232*8098eeb6SChristoph Böhmwalder 
233*8098eeb6SChristoph Böhmwalder /* DRBD_ADM_RESIZE - do */
234*8098eeb6SChristoph Böhmwalder static const struct nla_policy drbd_resize_nl_policy[DRBD_NLA_RESIZE_PARMS + 1] = {
235*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_CFG_CONTEXT] = NLA_POLICY_NESTED(drbd_drbd_cfg_context_nl_policy),
236*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_RESIZE_PARMS] = NLA_POLICY_NESTED(drbd_resize_parms_nl_policy),
237*8098eeb6SChristoph Böhmwalder };
238*8098eeb6SChristoph Böhmwalder 
239*8098eeb6SChristoph Böhmwalder /* DRBD_ADM_PRIMARY - do */
240*8098eeb6SChristoph Böhmwalder static const struct nla_policy drbd_primary_nl_policy[DRBD_NLA_SET_ROLE_PARMS + 1] = {
241*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_CFG_CONTEXT] = NLA_POLICY_NESTED(drbd_drbd_cfg_context_nl_policy),
242*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_SET_ROLE_PARMS] = NLA_POLICY_NESTED(drbd_set_role_parms_nl_policy),
243*8098eeb6SChristoph Böhmwalder };
244*8098eeb6SChristoph Böhmwalder 
245*8098eeb6SChristoph Böhmwalder /* DRBD_ADM_SECONDARY - do */
246*8098eeb6SChristoph Böhmwalder static const struct nla_policy drbd_secondary_nl_policy[DRBD_NLA_SET_ROLE_PARMS + 1] = {
247*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_CFG_CONTEXT] = NLA_POLICY_NESTED(drbd_drbd_cfg_context_nl_policy),
248*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_SET_ROLE_PARMS] = NLA_POLICY_NESTED(drbd_set_role_parms_nl_policy),
249*8098eeb6SChristoph Böhmwalder };
250*8098eeb6SChristoph Böhmwalder 
251*8098eeb6SChristoph Böhmwalder /* DRBD_ADM_NEW_C_UUID - do */
252*8098eeb6SChristoph Böhmwalder static const struct nla_policy drbd_new_c_uuid_nl_policy[DRBD_NLA_NEW_C_UUID_PARMS + 1] = {
253*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_CFG_CONTEXT] = NLA_POLICY_NESTED(drbd_drbd_cfg_context_nl_policy),
254*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_NEW_C_UUID_PARMS] = NLA_POLICY_NESTED(drbd_new_c_uuid_parms_nl_policy),
255*8098eeb6SChristoph Böhmwalder };
256*8098eeb6SChristoph Böhmwalder 
257*8098eeb6SChristoph Böhmwalder /* DRBD_ADM_START_OV - do */
258*8098eeb6SChristoph Böhmwalder static const struct nla_policy drbd_start_ov_nl_policy[DRBD_NLA_START_OV_PARMS + 1] = {
259*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_START_OV_PARMS] = NLA_POLICY_NESTED(drbd_start_ov_parms_nl_policy),
260*8098eeb6SChristoph Böhmwalder };
261*8098eeb6SChristoph Böhmwalder 
262*8098eeb6SChristoph Böhmwalder /* DRBD_ADM_DETACH - do */
263*8098eeb6SChristoph Böhmwalder static const struct nla_policy drbd_detach_nl_policy[DRBD_NLA_DETACH_PARMS + 1] = {
264*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_CFG_CONTEXT] = NLA_POLICY_NESTED(drbd_drbd_cfg_context_nl_policy),
265*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_DETACH_PARMS] = NLA_POLICY_NESTED(drbd_detach_parms_nl_policy),
266*8098eeb6SChristoph Böhmwalder };
267*8098eeb6SChristoph Böhmwalder 
268*8098eeb6SChristoph Böhmwalder /* DRBD_ADM_INVALIDATE - do */
269*8098eeb6SChristoph Böhmwalder static const struct nla_policy drbd_invalidate_nl_policy[DRBD_NLA_CFG_CONTEXT + 1] = {
270*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_CFG_CONTEXT] = NLA_POLICY_NESTED(drbd_drbd_cfg_context_nl_policy),
271*8098eeb6SChristoph Böhmwalder };
272*8098eeb6SChristoph Böhmwalder 
273*8098eeb6SChristoph Böhmwalder /* DRBD_ADM_INVAL_PEER - do */
274*8098eeb6SChristoph Böhmwalder static const struct nla_policy drbd_inval_peer_nl_policy[DRBD_NLA_CFG_CONTEXT + 1] = {
275*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_CFG_CONTEXT] = NLA_POLICY_NESTED(drbd_drbd_cfg_context_nl_policy),
276*8098eeb6SChristoph Böhmwalder };
277*8098eeb6SChristoph Böhmwalder 
278*8098eeb6SChristoph Böhmwalder /* DRBD_ADM_PAUSE_SYNC - do */
279*8098eeb6SChristoph Böhmwalder static const struct nla_policy drbd_pause_sync_nl_policy[DRBD_NLA_CFG_CONTEXT + 1] = {
280*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_CFG_CONTEXT] = NLA_POLICY_NESTED(drbd_drbd_cfg_context_nl_policy),
281*8098eeb6SChristoph Böhmwalder };
282*8098eeb6SChristoph Böhmwalder 
283*8098eeb6SChristoph Böhmwalder /* DRBD_ADM_RESUME_SYNC - do */
284*8098eeb6SChristoph Böhmwalder static const struct nla_policy drbd_resume_sync_nl_policy[DRBD_NLA_CFG_CONTEXT + 1] = {
285*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_CFG_CONTEXT] = NLA_POLICY_NESTED(drbd_drbd_cfg_context_nl_policy),
286*8098eeb6SChristoph Böhmwalder };
287*8098eeb6SChristoph Böhmwalder 
288*8098eeb6SChristoph Böhmwalder /* DRBD_ADM_SUSPEND_IO - do */
289*8098eeb6SChristoph Böhmwalder static const struct nla_policy drbd_suspend_io_nl_policy[DRBD_NLA_CFG_CONTEXT + 1] = {
290*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_CFG_CONTEXT] = NLA_POLICY_NESTED(drbd_drbd_cfg_context_nl_policy),
291*8098eeb6SChristoph Böhmwalder };
292*8098eeb6SChristoph Böhmwalder 
293*8098eeb6SChristoph Böhmwalder /* DRBD_ADM_RESUME_IO - do */
294*8098eeb6SChristoph Böhmwalder static const struct nla_policy drbd_resume_io_nl_policy[DRBD_NLA_CFG_CONTEXT + 1] = {
295*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_CFG_CONTEXT] = NLA_POLICY_NESTED(drbd_drbd_cfg_context_nl_policy),
296*8098eeb6SChristoph Böhmwalder };
297*8098eeb6SChristoph Böhmwalder 
298*8098eeb6SChristoph Böhmwalder /* DRBD_ADM_OUTDATE - do */
299*8098eeb6SChristoph Böhmwalder static const struct nla_policy drbd_outdate_nl_policy[DRBD_NLA_CFG_CONTEXT + 1] = {
300*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_CFG_CONTEXT] = NLA_POLICY_NESTED(drbd_drbd_cfg_context_nl_policy),
301*8098eeb6SChristoph Böhmwalder };
302*8098eeb6SChristoph Böhmwalder 
303*8098eeb6SChristoph Böhmwalder /* DRBD_ADM_GET_TIMEOUT_TYPE - do */
304*8098eeb6SChristoph Böhmwalder static const struct nla_policy drbd_get_timeout_type_nl_policy[DRBD_NLA_CFG_CONTEXT + 1] = {
305*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_CFG_CONTEXT] = NLA_POLICY_NESTED(drbd_drbd_cfg_context_nl_policy),
306*8098eeb6SChristoph Böhmwalder };
307*8098eeb6SChristoph Böhmwalder 
308*8098eeb6SChristoph Böhmwalder /* DRBD_ADM_DOWN - do */
309*8098eeb6SChristoph Böhmwalder static const struct nla_policy drbd_down_nl_policy[DRBD_NLA_CFG_CONTEXT + 1] = {
310*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_CFG_CONTEXT] = NLA_POLICY_NESTED(drbd_drbd_cfg_context_nl_policy),
311*8098eeb6SChristoph Böhmwalder };
312*8098eeb6SChristoph Böhmwalder 
313*8098eeb6SChristoph Böhmwalder /* DRBD_ADM_CHG_DISK_OPTS - do */
314*8098eeb6SChristoph Böhmwalder static const struct nla_policy drbd_chg_disk_opts_nl_policy[DRBD_NLA_DISK_CONF + 1] = {
315*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_CFG_CONTEXT] = NLA_POLICY_NESTED(drbd_drbd_cfg_context_nl_policy),
316*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_DISK_CONF] = NLA_POLICY_NESTED(drbd_disk_conf_nl_policy),
317*8098eeb6SChristoph Böhmwalder };
318*8098eeb6SChristoph Böhmwalder 
319*8098eeb6SChristoph Böhmwalder /* DRBD_ADM_CHG_NET_OPTS - do */
320*8098eeb6SChristoph Böhmwalder static const struct nla_policy drbd_chg_net_opts_nl_policy[DRBD_NLA_NET_CONF + 1] = {
321*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_CFG_CONTEXT] = NLA_POLICY_NESTED(drbd_drbd_cfg_context_nl_policy),
322*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_NET_CONF] = NLA_POLICY_NESTED(drbd_net_conf_nl_policy),
323*8098eeb6SChristoph Böhmwalder };
324*8098eeb6SChristoph Böhmwalder 
325*8098eeb6SChristoph Böhmwalder /* DRBD_ADM_GET_RESOURCES - dump */
326*8098eeb6SChristoph Böhmwalder static const struct nla_policy drbd_get_resources_nl_policy[DRBD_NLA_RESOURCE_STATISTICS + 1] = {
327*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_CFG_CONTEXT] = NLA_POLICY_NESTED(drbd_drbd_cfg_context_nl_policy),
328*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_RESOURCE_INFO] = NLA_POLICY_NESTED(drbd_resource_info_nl_policy),
329*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_RESOURCE_STATISTICS] = NLA_POLICY_NESTED(drbd_resource_statistics_nl_policy),
330*8098eeb6SChristoph Böhmwalder };
331*8098eeb6SChristoph Böhmwalder 
332*8098eeb6SChristoph Böhmwalder /* DRBD_ADM_GET_DEVICES - dump */
333*8098eeb6SChristoph Böhmwalder static const struct nla_policy drbd_get_devices_nl_policy[DRBD_NLA_DEVICE_STATISTICS + 1] = {
334*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_CFG_CONTEXT] = NLA_POLICY_NESTED(drbd_drbd_cfg_context_nl_policy),
335*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_DEVICE_INFO] = NLA_POLICY_NESTED(drbd_device_info_nl_policy),
336*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_DEVICE_STATISTICS] = NLA_POLICY_NESTED(drbd_device_statistics_nl_policy),
337*8098eeb6SChristoph Böhmwalder };
338*8098eeb6SChristoph Böhmwalder 
339*8098eeb6SChristoph Böhmwalder /* DRBD_ADM_GET_CONNECTIONS - dump */
340*8098eeb6SChristoph Böhmwalder static const struct nla_policy drbd_get_connections_nl_policy[DRBD_NLA_CONNECTION_STATISTICS + 1] = {
341*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_CFG_CONTEXT] = NLA_POLICY_NESTED(drbd_drbd_cfg_context_nl_policy),
342*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_CONNECTION_INFO] = NLA_POLICY_NESTED(drbd_connection_info_nl_policy),
343*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_CONNECTION_STATISTICS] = NLA_POLICY_NESTED(drbd_connection_statistics_nl_policy),
344*8098eeb6SChristoph Böhmwalder };
345*8098eeb6SChristoph Böhmwalder 
346*8098eeb6SChristoph Böhmwalder /* DRBD_ADM_GET_PEER_DEVICES - dump */
347*8098eeb6SChristoph Böhmwalder static const struct nla_policy drbd_get_peer_devices_nl_policy[DRBD_NLA_PEER_DEVICE_STATISTICS + 1] = {
348*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_CFG_CONTEXT] = NLA_POLICY_NESTED(drbd_drbd_cfg_context_nl_policy),
349*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_PEER_DEVICE_INFO] = NLA_POLICY_NESTED(drbd_peer_device_info_nl_policy),
350*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_PEER_DEVICE_STATISTICS] = NLA_POLICY_NESTED(drbd_peer_device_statistics_nl_policy),
351*8098eeb6SChristoph Böhmwalder };
352*8098eeb6SChristoph Böhmwalder 
353*8098eeb6SChristoph Böhmwalder /* DRBD_ADM_GET_INITIAL_STATE - dump */
354*8098eeb6SChristoph Böhmwalder static const struct nla_policy drbd_get_initial_state_nl_policy[DRBD_NLA_CFG_CONTEXT + 1] = {
355*8098eeb6SChristoph Böhmwalder 	[DRBD_NLA_CFG_CONTEXT] = NLA_POLICY_NESTED(drbd_drbd_cfg_context_nl_policy),
356*8098eeb6SChristoph Böhmwalder };
357*8098eeb6SChristoph Böhmwalder 
358*8098eeb6SChristoph Böhmwalder /* Ops table for drbd */
359*8098eeb6SChristoph Böhmwalder const struct genl_split_ops drbd_nl_ops[32] = {
360*8098eeb6SChristoph Böhmwalder 	{
361*8098eeb6SChristoph Böhmwalder 		.cmd		= DRBD_ADM_GET_STATUS,
362*8098eeb6SChristoph Böhmwalder 		.pre_doit	= drbd_pre_doit,
363*8098eeb6SChristoph Böhmwalder 		.doit		= drbd_nl_get_status_doit,
364*8098eeb6SChristoph Böhmwalder 		.post_doit	= drbd_post_doit,
365*8098eeb6SChristoph Böhmwalder 		.policy		= drbd_get_status_do_nl_policy,
366*8098eeb6SChristoph Böhmwalder 		.maxattr	= DRBD_NLA_CFG_CONTEXT,
367*8098eeb6SChristoph Böhmwalder 		.flags		= GENL_CMD_CAP_DO,
368*8098eeb6SChristoph Böhmwalder 	},
369*8098eeb6SChristoph Böhmwalder 	{
370*8098eeb6SChristoph Böhmwalder 		.cmd		= DRBD_ADM_GET_STATUS,
371*8098eeb6SChristoph Böhmwalder 		.dumpit		= drbd_nl_get_status_dumpit,
372*8098eeb6SChristoph Böhmwalder 		.policy		= drbd_get_status_dump_nl_policy,
373*8098eeb6SChristoph Böhmwalder 		.maxattr	= DRBD_NLA_CFG_CONTEXT,
374*8098eeb6SChristoph Böhmwalder 		.flags		= GENL_CMD_CAP_DUMP,
375*8098eeb6SChristoph Böhmwalder 	},
376*8098eeb6SChristoph Böhmwalder 	{
377*8098eeb6SChristoph Böhmwalder 		.cmd		= DRBD_ADM_NEW_MINOR,
378*8098eeb6SChristoph Böhmwalder 		.pre_doit	= drbd_pre_doit,
379*8098eeb6SChristoph Böhmwalder 		.doit		= drbd_nl_new_minor_doit,
380*8098eeb6SChristoph Böhmwalder 		.post_doit	= drbd_post_doit,
381*8098eeb6SChristoph Böhmwalder 		.policy		= drbd_new_minor_nl_policy,
382*8098eeb6SChristoph Böhmwalder 		.maxattr	= DRBD_NLA_CFG_CONTEXT,
383*8098eeb6SChristoph Böhmwalder 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
384*8098eeb6SChristoph Böhmwalder 	},
385*8098eeb6SChristoph Böhmwalder 	{
386*8098eeb6SChristoph Böhmwalder 		.cmd		= DRBD_ADM_DEL_MINOR,
387*8098eeb6SChristoph Böhmwalder 		.pre_doit	= drbd_pre_doit,
388*8098eeb6SChristoph Böhmwalder 		.doit		= drbd_nl_del_minor_doit,
389*8098eeb6SChristoph Böhmwalder 		.post_doit	= drbd_post_doit,
390*8098eeb6SChristoph Böhmwalder 		.policy		= drbd_del_minor_nl_policy,
391*8098eeb6SChristoph Böhmwalder 		.maxattr	= DRBD_NLA_CFG_CONTEXT,
392*8098eeb6SChristoph Böhmwalder 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
393*8098eeb6SChristoph Böhmwalder 	},
394*8098eeb6SChristoph Böhmwalder 	{
395*8098eeb6SChristoph Böhmwalder 		.cmd		= DRBD_ADM_NEW_RESOURCE,
396*8098eeb6SChristoph Böhmwalder 		.pre_doit	= drbd_pre_doit,
397*8098eeb6SChristoph Böhmwalder 		.doit		= drbd_nl_new_resource_doit,
398*8098eeb6SChristoph Böhmwalder 		.post_doit	= drbd_post_doit,
399*8098eeb6SChristoph Böhmwalder 		.policy		= drbd_new_resource_nl_policy,
400*8098eeb6SChristoph Böhmwalder 		.maxattr	= DRBD_NLA_RESOURCE_OPTS,
401*8098eeb6SChristoph Böhmwalder 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
402*8098eeb6SChristoph Böhmwalder 	},
403*8098eeb6SChristoph Böhmwalder 	{
404*8098eeb6SChristoph Böhmwalder 		.cmd		= DRBD_ADM_DEL_RESOURCE,
405*8098eeb6SChristoph Böhmwalder 		.pre_doit	= drbd_pre_doit,
406*8098eeb6SChristoph Böhmwalder 		.doit		= drbd_nl_del_resource_doit,
407*8098eeb6SChristoph Böhmwalder 		.post_doit	= drbd_post_doit,
408*8098eeb6SChristoph Böhmwalder 		.policy		= drbd_del_resource_nl_policy,
409*8098eeb6SChristoph Böhmwalder 		.maxattr	= DRBD_NLA_CFG_CONTEXT,
410*8098eeb6SChristoph Böhmwalder 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
411*8098eeb6SChristoph Böhmwalder 	},
412*8098eeb6SChristoph Böhmwalder 	{
413*8098eeb6SChristoph Böhmwalder 		.cmd		= DRBD_ADM_RESOURCE_OPTS,
414*8098eeb6SChristoph Böhmwalder 		.pre_doit	= drbd_pre_doit,
415*8098eeb6SChristoph Böhmwalder 		.doit		= drbd_nl_resource_opts_doit,
416*8098eeb6SChristoph Böhmwalder 		.post_doit	= drbd_post_doit,
417*8098eeb6SChristoph Böhmwalder 		.policy		= drbd_resource_opts_nl_policy,
418*8098eeb6SChristoph Böhmwalder 		.maxattr	= DRBD_NLA_RESOURCE_OPTS,
419*8098eeb6SChristoph Böhmwalder 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
420*8098eeb6SChristoph Böhmwalder 	},
421*8098eeb6SChristoph Böhmwalder 	{
422*8098eeb6SChristoph Böhmwalder 		.cmd		= DRBD_ADM_CONNECT,
423*8098eeb6SChristoph Böhmwalder 		.pre_doit	= drbd_pre_doit,
424*8098eeb6SChristoph Böhmwalder 		.doit		= drbd_nl_connect_doit,
425*8098eeb6SChristoph Böhmwalder 		.post_doit	= drbd_post_doit,
426*8098eeb6SChristoph Böhmwalder 		.policy		= drbd_connect_nl_policy,
427*8098eeb6SChristoph Böhmwalder 		.maxattr	= DRBD_NLA_NET_CONF,
428*8098eeb6SChristoph Böhmwalder 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
429*8098eeb6SChristoph Böhmwalder 	},
430*8098eeb6SChristoph Böhmwalder 	{
431*8098eeb6SChristoph Böhmwalder 		.cmd		= DRBD_ADM_DISCONNECT,
432*8098eeb6SChristoph Böhmwalder 		.pre_doit	= drbd_pre_doit,
433*8098eeb6SChristoph Böhmwalder 		.doit		= drbd_nl_disconnect_doit,
434*8098eeb6SChristoph Böhmwalder 		.post_doit	= drbd_post_doit,
435*8098eeb6SChristoph Böhmwalder 		.policy		= drbd_disconnect_nl_policy,
436*8098eeb6SChristoph Böhmwalder 		.maxattr	= DRBD_NLA_DISCONNECT_PARMS,
437*8098eeb6SChristoph Böhmwalder 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
438*8098eeb6SChristoph Böhmwalder 	},
439*8098eeb6SChristoph Böhmwalder 	{
440*8098eeb6SChristoph Böhmwalder 		.cmd		= DRBD_ADM_ATTACH,
441*8098eeb6SChristoph Böhmwalder 		.pre_doit	= drbd_pre_doit,
442*8098eeb6SChristoph Böhmwalder 		.doit		= drbd_nl_attach_doit,
443*8098eeb6SChristoph Böhmwalder 		.post_doit	= drbd_post_doit,
444*8098eeb6SChristoph Böhmwalder 		.policy		= drbd_attach_nl_policy,
445*8098eeb6SChristoph Böhmwalder 		.maxattr	= DRBD_NLA_DISK_CONF,
446*8098eeb6SChristoph Böhmwalder 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
447*8098eeb6SChristoph Böhmwalder 	},
448*8098eeb6SChristoph Böhmwalder 	{
449*8098eeb6SChristoph Böhmwalder 		.cmd		= DRBD_ADM_RESIZE,
450*8098eeb6SChristoph Böhmwalder 		.pre_doit	= drbd_pre_doit,
451*8098eeb6SChristoph Böhmwalder 		.doit		= drbd_nl_resize_doit,
452*8098eeb6SChristoph Böhmwalder 		.post_doit	= drbd_post_doit,
453*8098eeb6SChristoph Böhmwalder 		.policy		= drbd_resize_nl_policy,
454*8098eeb6SChristoph Böhmwalder 		.maxattr	= DRBD_NLA_RESIZE_PARMS,
455*8098eeb6SChristoph Böhmwalder 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
456*8098eeb6SChristoph Böhmwalder 	},
457*8098eeb6SChristoph Böhmwalder 	{
458*8098eeb6SChristoph Böhmwalder 		.cmd		= DRBD_ADM_PRIMARY,
459*8098eeb6SChristoph Böhmwalder 		.pre_doit	= drbd_pre_doit,
460*8098eeb6SChristoph Böhmwalder 		.doit		= drbd_nl_primary_doit,
461*8098eeb6SChristoph Böhmwalder 		.post_doit	= drbd_post_doit,
462*8098eeb6SChristoph Böhmwalder 		.policy		= drbd_primary_nl_policy,
463*8098eeb6SChristoph Böhmwalder 		.maxattr	= DRBD_NLA_SET_ROLE_PARMS,
464*8098eeb6SChristoph Böhmwalder 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
465*8098eeb6SChristoph Böhmwalder 	},
466*8098eeb6SChristoph Böhmwalder 	{
467*8098eeb6SChristoph Böhmwalder 		.cmd		= DRBD_ADM_SECONDARY,
468*8098eeb6SChristoph Böhmwalder 		.pre_doit	= drbd_pre_doit,
469*8098eeb6SChristoph Böhmwalder 		.doit		= drbd_nl_secondary_doit,
470*8098eeb6SChristoph Böhmwalder 		.post_doit	= drbd_post_doit,
471*8098eeb6SChristoph Böhmwalder 		.policy		= drbd_secondary_nl_policy,
472*8098eeb6SChristoph Böhmwalder 		.maxattr	= DRBD_NLA_SET_ROLE_PARMS,
473*8098eeb6SChristoph Böhmwalder 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
474*8098eeb6SChristoph Böhmwalder 	},
475*8098eeb6SChristoph Böhmwalder 	{
476*8098eeb6SChristoph Böhmwalder 		.cmd		= DRBD_ADM_NEW_C_UUID,
477*8098eeb6SChristoph Böhmwalder 		.pre_doit	= drbd_pre_doit,
478*8098eeb6SChristoph Böhmwalder 		.doit		= drbd_nl_new_c_uuid_doit,
479*8098eeb6SChristoph Böhmwalder 		.post_doit	= drbd_post_doit,
480*8098eeb6SChristoph Böhmwalder 		.policy		= drbd_new_c_uuid_nl_policy,
481*8098eeb6SChristoph Böhmwalder 		.maxattr	= DRBD_NLA_NEW_C_UUID_PARMS,
482*8098eeb6SChristoph Böhmwalder 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
483*8098eeb6SChristoph Böhmwalder 	},
484*8098eeb6SChristoph Böhmwalder 	{
485*8098eeb6SChristoph Böhmwalder 		.cmd		= DRBD_ADM_START_OV,
486*8098eeb6SChristoph Böhmwalder 		.pre_doit	= drbd_pre_doit,
487*8098eeb6SChristoph Böhmwalder 		.doit		= drbd_nl_start_ov_doit,
488*8098eeb6SChristoph Böhmwalder 		.post_doit	= drbd_post_doit,
489*8098eeb6SChristoph Böhmwalder 		.policy		= drbd_start_ov_nl_policy,
490*8098eeb6SChristoph Böhmwalder 		.maxattr	= DRBD_NLA_START_OV_PARMS,
491*8098eeb6SChristoph Böhmwalder 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
492*8098eeb6SChristoph Böhmwalder 	},
493*8098eeb6SChristoph Böhmwalder 	{
494*8098eeb6SChristoph Böhmwalder 		.cmd		= DRBD_ADM_DETACH,
495*8098eeb6SChristoph Böhmwalder 		.pre_doit	= drbd_pre_doit,
496*8098eeb6SChristoph Böhmwalder 		.doit		= drbd_nl_detach_doit,
497*8098eeb6SChristoph Böhmwalder 		.post_doit	= drbd_post_doit,
498*8098eeb6SChristoph Böhmwalder 		.policy		= drbd_detach_nl_policy,
499*8098eeb6SChristoph Böhmwalder 		.maxattr	= DRBD_NLA_DETACH_PARMS,
500*8098eeb6SChristoph Böhmwalder 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
501*8098eeb6SChristoph Böhmwalder 	},
502*8098eeb6SChristoph Böhmwalder 	{
503*8098eeb6SChristoph Böhmwalder 		.cmd		= DRBD_ADM_INVALIDATE,
504*8098eeb6SChristoph Böhmwalder 		.pre_doit	= drbd_pre_doit,
505*8098eeb6SChristoph Böhmwalder 		.doit		= drbd_nl_invalidate_doit,
506*8098eeb6SChristoph Böhmwalder 		.post_doit	= drbd_post_doit,
507*8098eeb6SChristoph Böhmwalder 		.policy		= drbd_invalidate_nl_policy,
508*8098eeb6SChristoph Böhmwalder 		.maxattr	= DRBD_NLA_CFG_CONTEXT,
509*8098eeb6SChristoph Böhmwalder 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
510*8098eeb6SChristoph Böhmwalder 	},
511*8098eeb6SChristoph Böhmwalder 	{
512*8098eeb6SChristoph Böhmwalder 		.cmd		= DRBD_ADM_INVAL_PEER,
513*8098eeb6SChristoph Böhmwalder 		.pre_doit	= drbd_pre_doit,
514*8098eeb6SChristoph Böhmwalder 		.doit		= drbd_nl_inval_peer_doit,
515*8098eeb6SChristoph Böhmwalder 		.post_doit	= drbd_post_doit,
516*8098eeb6SChristoph Böhmwalder 		.policy		= drbd_inval_peer_nl_policy,
517*8098eeb6SChristoph Böhmwalder 		.maxattr	= DRBD_NLA_CFG_CONTEXT,
518*8098eeb6SChristoph Böhmwalder 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
519*8098eeb6SChristoph Böhmwalder 	},
520*8098eeb6SChristoph Böhmwalder 	{
521*8098eeb6SChristoph Böhmwalder 		.cmd		= DRBD_ADM_PAUSE_SYNC,
522*8098eeb6SChristoph Böhmwalder 		.pre_doit	= drbd_pre_doit,
523*8098eeb6SChristoph Böhmwalder 		.doit		= drbd_nl_pause_sync_doit,
524*8098eeb6SChristoph Böhmwalder 		.post_doit	= drbd_post_doit,
525*8098eeb6SChristoph Böhmwalder 		.policy		= drbd_pause_sync_nl_policy,
526*8098eeb6SChristoph Böhmwalder 		.maxattr	= DRBD_NLA_CFG_CONTEXT,
527*8098eeb6SChristoph Böhmwalder 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
528*8098eeb6SChristoph Böhmwalder 	},
529*8098eeb6SChristoph Böhmwalder 	{
530*8098eeb6SChristoph Böhmwalder 		.cmd		= DRBD_ADM_RESUME_SYNC,
531*8098eeb6SChristoph Böhmwalder 		.pre_doit	= drbd_pre_doit,
532*8098eeb6SChristoph Böhmwalder 		.doit		= drbd_nl_resume_sync_doit,
533*8098eeb6SChristoph Böhmwalder 		.post_doit	= drbd_post_doit,
534*8098eeb6SChristoph Böhmwalder 		.policy		= drbd_resume_sync_nl_policy,
535*8098eeb6SChristoph Böhmwalder 		.maxattr	= DRBD_NLA_CFG_CONTEXT,
536*8098eeb6SChristoph Böhmwalder 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
537*8098eeb6SChristoph Böhmwalder 	},
538*8098eeb6SChristoph Böhmwalder 	{
539*8098eeb6SChristoph Böhmwalder 		.cmd		= DRBD_ADM_SUSPEND_IO,
540*8098eeb6SChristoph Böhmwalder 		.pre_doit	= drbd_pre_doit,
541*8098eeb6SChristoph Böhmwalder 		.doit		= drbd_nl_suspend_io_doit,
542*8098eeb6SChristoph Böhmwalder 		.post_doit	= drbd_post_doit,
543*8098eeb6SChristoph Böhmwalder 		.policy		= drbd_suspend_io_nl_policy,
544*8098eeb6SChristoph Böhmwalder 		.maxattr	= DRBD_NLA_CFG_CONTEXT,
545*8098eeb6SChristoph Böhmwalder 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
546*8098eeb6SChristoph Böhmwalder 	},
547*8098eeb6SChristoph Böhmwalder 	{
548*8098eeb6SChristoph Böhmwalder 		.cmd		= DRBD_ADM_RESUME_IO,
549*8098eeb6SChristoph Böhmwalder 		.pre_doit	= drbd_pre_doit,
550*8098eeb6SChristoph Böhmwalder 		.doit		= drbd_nl_resume_io_doit,
551*8098eeb6SChristoph Böhmwalder 		.post_doit	= drbd_post_doit,
552*8098eeb6SChristoph Böhmwalder 		.policy		= drbd_resume_io_nl_policy,
553*8098eeb6SChristoph Böhmwalder 		.maxattr	= DRBD_NLA_CFG_CONTEXT,
554*8098eeb6SChristoph Böhmwalder 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
555*8098eeb6SChristoph Böhmwalder 	},
556*8098eeb6SChristoph Böhmwalder 	{
557*8098eeb6SChristoph Böhmwalder 		.cmd		= DRBD_ADM_OUTDATE,
558*8098eeb6SChristoph Böhmwalder 		.pre_doit	= drbd_pre_doit,
559*8098eeb6SChristoph Böhmwalder 		.doit		= drbd_nl_outdate_doit,
560*8098eeb6SChristoph Böhmwalder 		.post_doit	= drbd_post_doit,
561*8098eeb6SChristoph Böhmwalder 		.policy		= drbd_outdate_nl_policy,
562*8098eeb6SChristoph Böhmwalder 		.maxattr	= DRBD_NLA_CFG_CONTEXT,
563*8098eeb6SChristoph Böhmwalder 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
564*8098eeb6SChristoph Böhmwalder 	},
565*8098eeb6SChristoph Böhmwalder 	{
566*8098eeb6SChristoph Böhmwalder 		.cmd		= DRBD_ADM_GET_TIMEOUT_TYPE,
567*8098eeb6SChristoph Böhmwalder 		.pre_doit	= drbd_pre_doit,
568*8098eeb6SChristoph Böhmwalder 		.doit		= drbd_nl_get_timeout_type_doit,
569*8098eeb6SChristoph Böhmwalder 		.post_doit	= drbd_post_doit,
570*8098eeb6SChristoph Böhmwalder 		.policy		= drbd_get_timeout_type_nl_policy,
571*8098eeb6SChristoph Böhmwalder 		.maxattr	= DRBD_NLA_CFG_CONTEXT,
572*8098eeb6SChristoph Böhmwalder 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
573*8098eeb6SChristoph Böhmwalder 	},
574*8098eeb6SChristoph Böhmwalder 	{
575*8098eeb6SChristoph Böhmwalder 		.cmd		= DRBD_ADM_DOWN,
576*8098eeb6SChristoph Böhmwalder 		.pre_doit	= drbd_pre_doit,
577*8098eeb6SChristoph Böhmwalder 		.doit		= drbd_nl_down_doit,
578*8098eeb6SChristoph Böhmwalder 		.post_doit	= drbd_post_doit,
579*8098eeb6SChristoph Böhmwalder 		.policy		= drbd_down_nl_policy,
580*8098eeb6SChristoph Böhmwalder 		.maxattr	= DRBD_NLA_CFG_CONTEXT,
581*8098eeb6SChristoph Böhmwalder 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
582*8098eeb6SChristoph Böhmwalder 	},
583*8098eeb6SChristoph Böhmwalder 	{
584*8098eeb6SChristoph Böhmwalder 		.cmd		= DRBD_ADM_CHG_DISK_OPTS,
585*8098eeb6SChristoph Böhmwalder 		.pre_doit	= drbd_pre_doit,
586*8098eeb6SChristoph Böhmwalder 		.doit		= drbd_nl_chg_disk_opts_doit,
587*8098eeb6SChristoph Böhmwalder 		.post_doit	= drbd_post_doit,
588*8098eeb6SChristoph Böhmwalder 		.policy		= drbd_chg_disk_opts_nl_policy,
589*8098eeb6SChristoph Böhmwalder 		.maxattr	= DRBD_NLA_DISK_CONF,
590*8098eeb6SChristoph Böhmwalder 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
591*8098eeb6SChristoph Böhmwalder 	},
592*8098eeb6SChristoph Böhmwalder 	{
593*8098eeb6SChristoph Böhmwalder 		.cmd		= DRBD_ADM_CHG_NET_OPTS,
594*8098eeb6SChristoph Böhmwalder 		.pre_doit	= drbd_pre_doit,
595*8098eeb6SChristoph Böhmwalder 		.doit		= drbd_nl_chg_net_opts_doit,
596*8098eeb6SChristoph Böhmwalder 		.post_doit	= drbd_post_doit,
597*8098eeb6SChristoph Böhmwalder 		.policy		= drbd_chg_net_opts_nl_policy,
598*8098eeb6SChristoph Böhmwalder 		.maxattr	= DRBD_NLA_NET_CONF,
599*8098eeb6SChristoph Böhmwalder 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
600*8098eeb6SChristoph Böhmwalder 	},
601*8098eeb6SChristoph Böhmwalder 	{
602*8098eeb6SChristoph Böhmwalder 		.cmd		= DRBD_ADM_GET_RESOURCES,
603*8098eeb6SChristoph Böhmwalder 		.dumpit		= drbd_nl_get_resources_dumpit,
604*8098eeb6SChristoph Böhmwalder 		.policy		= drbd_get_resources_nl_policy,
605*8098eeb6SChristoph Böhmwalder 		.maxattr	= DRBD_NLA_RESOURCE_STATISTICS,
606*8098eeb6SChristoph Böhmwalder 		.flags		= GENL_CMD_CAP_DUMP,
607*8098eeb6SChristoph Böhmwalder 	},
608*8098eeb6SChristoph Böhmwalder 	{
609*8098eeb6SChristoph Böhmwalder 		.cmd		= DRBD_ADM_GET_DEVICES,
610*8098eeb6SChristoph Böhmwalder 		.dumpit		= drbd_nl_get_devices_dumpit,
611*8098eeb6SChristoph Böhmwalder 		.done		= drbd_adm_dump_devices_done,
612*8098eeb6SChristoph Böhmwalder 		.policy		= drbd_get_devices_nl_policy,
613*8098eeb6SChristoph Böhmwalder 		.maxattr	= DRBD_NLA_DEVICE_STATISTICS,
614*8098eeb6SChristoph Böhmwalder 		.flags		= GENL_CMD_CAP_DUMP,
615*8098eeb6SChristoph Böhmwalder 	},
616*8098eeb6SChristoph Böhmwalder 	{
617*8098eeb6SChristoph Böhmwalder 		.cmd		= DRBD_ADM_GET_CONNECTIONS,
618*8098eeb6SChristoph Böhmwalder 		.dumpit		= drbd_nl_get_connections_dumpit,
619*8098eeb6SChristoph Böhmwalder 		.done		= drbd_adm_dump_connections_done,
620*8098eeb6SChristoph Böhmwalder 		.policy		= drbd_get_connections_nl_policy,
621*8098eeb6SChristoph Böhmwalder 		.maxattr	= DRBD_NLA_CONNECTION_STATISTICS,
622*8098eeb6SChristoph Böhmwalder 		.flags		= GENL_CMD_CAP_DUMP,
623*8098eeb6SChristoph Böhmwalder 	},
624*8098eeb6SChristoph Böhmwalder 	{
625*8098eeb6SChristoph Böhmwalder 		.cmd		= DRBD_ADM_GET_PEER_DEVICES,
626*8098eeb6SChristoph Böhmwalder 		.dumpit		= drbd_nl_get_peer_devices_dumpit,
627*8098eeb6SChristoph Böhmwalder 		.done		= drbd_adm_dump_peer_devices_done,
628*8098eeb6SChristoph Böhmwalder 		.policy		= drbd_get_peer_devices_nl_policy,
629*8098eeb6SChristoph Böhmwalder 		.maxattr	= DRBD_NLA_PEER_DEVICE_STATISTICS,
630*8098eeb6SChristoph Böhmwalder 		.flags		= GENL_CMD_CAP_DUMP,
631*8098eeb6SChristoph Böhmwalder 	},
632*8098eeb6SChristoph Böhmwalder 	{
633*8098eeb6SChristoph Böhmwalder 		.cmd		= DRBD_ADM_GET_INITIAL_STATE,
634*8098eeb6SChristoph Böhmwalder 		.dumpit		= drbd_nl_get_initial_state_dumpit,
635*8098eeb6SChristoph Böhmwalder 		.policy		= drbd_get_initial_state_nl_policy,
636*8098eeb6SChristoph Böhmwalder 		.maxattr	= DRBD_NLA_CFG_CONTEXT,
637*8098eeb6SChristoph Böhmwalder 		.flags		= GENL_CMD_CAP_DUMP,
638*8098eeb6SChristoph Böhmwalder 	},
639*8098eeb6SChristoph Böhmwalder };
640*8098eeb6SChristoph Böhmwalder 
641*8098eeb6SChristoph Böhmwalder static const struct genl_multicast_group drbd_nl_mcgrps[] = {
642*8098eeb6SChristoph Böhmwalder 	[DRBD_NLGRP_EVENTS] = { "events", },
643*8098eeb6SChristoph Böhmwalder };
644*8098eeb6SChristoph Böhmwalder 
645*8098eeb6SChristoph Böhmwalder static int __drbd_cfg_context_from_attrs(struct drbd_cfg_context *s,
646*8098eeb6SChristoph Böhmwalder 		struct nlattr ***ret_nested_attribute_table,
647*8098eeb6SChristoph Böhmwalder 		struct genl_info *info)
648*8098eeb6SChristoph Böhmwalder {
649*8098eeb6SChristoph Böhmwalder 	const int maxtype = DRBD_A_DRBD_CFG_CONTEXT_CTX_PEER_ADDR;
650*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = info->attrs[DRBD_NLA_CFG_CONTEXT];
651*8098eeb6SChristoph Böhmwalder 	struct nlattr **ntb;
652*8098eeb6SChristoph Böhmwalder 	struct nlattr *nla;
653*8098eeb6SChristoph Böhmwalder 	int err = 0;
654*8098eeb6SChristoph Böhmwalder 
655*8098eeb6SChristoph Böhmwalder 	if (ret_nested_attribute_table)
656*8098eeb6SChristoph Böhmwalder 		*ret_nested_attribute_table = NULL;
657*8098eeb6SChristoph Böhmwalder 	if (!tla)
658*8098eeb6SChristoph Böhmwalder 		return -ENOMSG;
659*8098eeb6SChristoph Böhmwalder 	ntb = kcalloc(DRBD_A_DRBD_CFG_CONTEXT_CTX_PEER_ADDR + 1, sizeof(*ntb), GFP_KERNEL);
660*8098eeb6SChristoph Böhmwalder 	if (!ntb)
661*8098eeb6SChristoph Böhmwalder 		return -ENOMEM;
662*8098eeb6SChristoph Böhmwalder 	err = nla_parse_nested_deprecated(ntb, maxtype, tla, drbd_drbd_cfg_context_nl_policy, NULL);
663*8098eeb6SChristoph Böhmwalder 	if (err)
664*8098eeb6SChristoph Böhmwalder 		goto out;
665*8098eeb6SChristoph Böhmwalder 
666*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DRBD_CFG_CONTEXT_CTX_VOLUME];
667*8098eeb6SChristoph Böhmwalder 	if (nla && s)
668*8098eeb6SChristoph Böhmwalder 		s->ctx_volume = nla_get_u32(nla);
669*8098eeb6SChristoph Böhmwalder 
670*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DRBD_CFG_CONTEXT_CTX_RESOURCE_NAME];
671*8098eeb6SChristoph Böhmwalder 	if (nla && s)
672*8098eeb6SChristoph Böhmwalder 		s->ctx_resource_name_len = nla_strscpy(s->ctx_resource_name, nla, 128);
673*8098eeb6SChristoph Böhmwalder 
674*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DRBD_CFG_CONTEXT_CTX_MY_ADDR];
675*8098eeb6SChristoph Böhmwalder 	if (nla && s)
676*8098eeb6SChristoph Böhmwalder 		s->ctx_my_addr_len = nla_memcpy(s->ctx_my_addr, nla, 128);
677*8098eeb6SChristoph Böhmwalder 
678*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DRBD_CFG_CONTEXT_CTX_PEER_ADDR];
679*8098eeb6SChristoph Böhmwalder 	if (nla && s)
680*8098eeb6SChristoph Böhmwalder 		s->ctx_peer_addr_len = nla_memcpy(s->ctx_peer_addr, nla, 128);
681*8098eeb6SChristoph Böhmwalder 
682*8098eeb6SChristoph Böhmwalder out:
683*8098eeb6SChristoph Böhmwalder 	if (ret_nested_attribute_table && (!err || err == -ENOMSG))
684*8098eeb6SChristoph Böhmwalder 		*ret_nested_attribute_table = ntb;
685*8098eeb6SChristoph Böhmwalder 	else
686*8098eeb6SChristoph Böhmwalder 		kfree(ntb);
687*8098eeb6SChristoph Böhmwalder 	return err;
688*8098eeb6SChristoph Böhmwalder }
689*8098eeb6SChristoph Böhmwalder 
690*8098eeb6SChristoph Böhmwalder int drbd_cfg_context_from_attrs(struct drbd_cfg_context *s,
691*8098eeb6SChristoph Böhmwalder 				struct genl_info *info)
692*8098eeb6SChristoph Böhmwalder {
693*8098eeb6SChristoph Böhmwalder 	return __drbd_cfg_context_from_attrs(s, NULL, info);
694*8098eeb6SChristoph Böhmwalder }
695*8098eeb6SChristoph Böhmwalder 
696*8098eeb6SChristoph Böhmwalder int drbd_cfg_context_ntb_from_attrs(
697*8098eeb6SChristoph Böhmwalder 			struct nlattr ***ret_nested_attribute_table,
698*8098eeb6SChristoph Böhmwalder 			struct genl_info *info)
699*8098eeb6SChristoph Böhmwalder {
700*8098eeb6SChristoph Böhmwalder 	return __drbd_cfg_context_from_attrs(NULL, ret_nested_attribute_table, info);
701*8098eeb6SChristoph Böhmwalder }
702*8098eeb6SChristoph Böhmwalder 
703*8098eeb6SChristoph Böhmwalder static int __disk_conf_from_attrs(struct disk_conf *s,
704*8098eeb6SChristoph Böhmwalder 		struct nlattr ***ret_nested_attribute_table,
705*8098eeb6SChristoph Böhmwalder 		struct genl_info *info)
706*8098eeb6SChristoph Böhmwalder {
707*8098eeb6SChristoph Böhmwalder 	const int maxtype = DRBD_A_DISK_CONF_DISABLE_WRITE_SAME;
708*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = info->attrs[DRBD_NLA_DISK_CONF];
709*8098eeb6SChristoph Böhmwalder 	struct nlattr **ntb;
710*8098eeb6SChristoph Böhmwalder 	struct nlattr *nla;
711*8098eeb6SChristoph Böhmwalder 	int err = 0;
712*8098eeb6SChristoph Böhmwalder 
713*8098eeb6SChristoph Böhmwalder 	if (ret_nested_attribute_table)
714*8098eeb6SChristoph Böhmwalder 		*ret_nested_attribute_table = NULL;
715*8098eeb6SChristoph Böhmwalder 	if (!tla)
716*8098eeb6SChristoph Böhmwalder 		return -ENOMSG;
717*8098eeb6SChristoph Böhmwalder 	ntb = kcalloc(DRBD_A_DISK_CONF_DISABLE_WRITE_SAME + 1, sizeof(*ntb), GFP_KERNEL);
718*8098eeb6SChristoph Böhmwalder 	if (!ntb)
719*8098eeb6SChristoph Böhmwalder 		return -ENOMEM;
720*8098eeb6SChristoph Böhmwalder 	err = nla_parse_nested_deprecated(ntb, maxtype, tla, drbd_disk_conf_nl_policy, NULL);
721*8098eeb6SChristoph Böhmwalder 	if (err)
722*8098eeb6SChristoph Böhmwalder 		goto out;
723*8098eeb6SChristoph Böhmwalder 
724*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DISK_CONF_BACKING_DEV];
725*8098eeb6SChristoph Böhmwalder 	if (nla) {
726*8098eeb6SChristoph Böhmwalder 		if (s)
727*8098eeb6SChristoph Böhmwalder 			s->backing_dev_len = nla_strscpy(s->backing_dev, nla, 128);
728*8098eeb6SChristoph Böhmwalder 	} else {
729*8098eeb6SChristoph Böhmwalder 		pr_info("<< missing required attr: backing_dev\n");
730*8098eeb6SChristoph Böhmwalder 		err = -ENOMSG;
731*8098eeb6SChristoph Böhmwalder 	}
732*8098eeb6SChristoph Böhmwalder 
733*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DISK_CONF_META_DEV];
734*8098eeb6SChristoph Böhmwalder 	if (nla) {
735*8098eeb6SChristoph Böhmwalder 		if (s)
736*8098eeb6SChristoph Böhmwalder 			s->meta_dev_len = nla_strscpy(s->meta_dev, nla, 128);
737*8098eeb6SChristoph Böhmwalder 	} else {
738*8098eeb6SChristoph Böhmwalder 		pr_info("<< missing required attr: meta_dev\n");
739*8098eeb6SChristoph Böhmwalder 		err = -ENOMSG;
740*8098eeb6SChristoph Böhmwalder 	}
741*8098eeb6SChristoph Böhmwalder 
742*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DISK_CONF_META_DEV_IDX];
743*8098eeb6SChristoph Böhmwalder 	if (nla) {
744*8098eeb6SChristoph Böhmwalder 		if (s)
745*8098eeb6SChristoph Böhmwalder 			s->meta_dev_idx = nla_get_s32(nla);
746*8098eeb6SChristoph Böhmwalder 	} else {
747*8098eeb6SChristoph Böhmwalder 		pr_info("<< missing required attr: meta_dev_idx\n");
748*8098eeb6SChristoph Böhmwalder 		err = -ENOMSG;
749*8098eeb6SChristoph Böhmwalder 	}
750*8098eeb6SChristoph Böhmwalder 
751*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DISK_CONF_DISK_SIZE];
752*8098eeb6SChristoph Böhmwalder 	if (nla && s)
753*8098eeb6SChristoph Böhmwalder 		s->disk_size = nla_get_u64(nla);
754*8098eeb6SChristoph Böhmwalder 
755*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DISK_CONF_MAX_BIO_BVECS];
756*8098eeb6SChristoph Böhmwalder 	if (nla && s)
757*8098eeb6SChristoph Böhmwalder 		s->max_bio_bvecs = nla_get_u32(nla);
758*8098eeb6SChristoph Böhmwalder 
759*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DISK_CONF_ON_IO_ERROR];
760*8098eeb6SChristoph Böhmwalder 	if (nla && s)
761*8098eeb6SChristoph Böhmwalder 		s->on_io_error = nla_get_u32(nla);
762*8098eeb6SChristoph Böhmwalder 
763*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DISK_CONF_FENCING];
764*8098eeb6SChristoph Böhmwalder 	if (nla && s)
765*8098eeb6SChristoph Böhmwalder 		s->fencing = nla_get_u32(nla);
766*8098eeb6SChristoph Böhmwalder 
767*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DISK_CONF_RESYNC_RATE];
768*8098eeb6SChristoph Böhmwalder 	if (nla && s)
769*8098eeb6SChristoph Böhmwalder 		s->resync_rate = nla_get_u32(nla);
770*8098eeb6SChristoph Böhmwalder 
771*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DISK_CONF_RESYNC_AFTER];
772*8098eeb6SChristoph Böhmwalder 	if (nla && s)
773*8098eeb6SChristoph Böhmwalder 		s->resync_after = nla_get_s32(nla);
774*8098eeb6SChristoph Böhmwalder 
775*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DISK_CONF_AL_EXTENTS];
776*8098eeb6SChristoph Böhmwalder 	if (nla && s)
777*8098eeb6SChristoph Böhmwalder 		s->al_extents = nla_get_u32(nla);
778*8098eeb6SChristoph Böhmwalder 
779*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DISK_CONF_C_PLAN_AHEAD];
780*8098eeb6SChristoph Böhmwalder 	if (nla && s)
781*8098eeb6SChristoph Böhmwalder 		s->c_plan_ahead = nla_get_u32(nla);
782*8098eeb6SChristoph Böhmwalder 
783*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DISK_CONF_C_DELAY_TARGET];
784*8098eeb6SChristoph Böhmwalder 	if (nla && s)
785*8098eeb6SChristoph Böhmwalder 		s->c_delay_target = nla_get_u32(nla);
786*8098eeb6SChristoph Böhmwalder 
787*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DISK_CONF_C_FILL_TARGET];
788*8098eeb6SChristoph Böhmwalder 	if (nla && s)
789*8098eeb6SChristoph Böhmwalder 		s->c_fill_target = nla_get_u32(nla);
790*8098eeb6SChristoph Böhmwalder 
791*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DISK_CONF_C_MAX_RATE];
792*8098eeb6SChristoph Böhmwalder 	if (nla && s)
793*8098eeb6SChristoph Böhmwalder 		s->c_max_rate = nla_get_u32(nla);
794*8098eeb6SChristoph Böhmwalder 
795*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DISK_CONF_C_MIN_RATE];
796*8098eeb6SChristoph Böhmwalder 	if (nla && s)
797*8098eeb6SChristoph Böhmwalder 		s->c_min_rate = nla_get_u32(nla);
798*8098eeb6SChristoph Böhmwalder 
799*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DISK_CONF_DISK_BARRIER];
800*8098eeb6SChristoph Böhmwalder 	if (nla && s)
801*8098eeb6SChristoph Böhmwalder 		s->disk_barrier = nla_get_u8(nla);
802*8098eeb6SChristoph Böhmwalder 
803*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DISK_CONF_DISK_FLUSHES];
804*8098eeb6SChristoph Böhmwalder 	if (nla && s)
805*8098eeb6SChristoph Böhmwalder 		s->disk_flushes = nla_get_u8(nla);
806*8098eeb6SChristoph Böhmwalder 
807*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DISK_CONF_DISK_DRAIN];
808*8098eeb6SChristoph Böhmwalder 	if (nla && s)
809*8098eeb6SChristoph Böhmwalder 		s->disk_drain = nla_get_u8(nla);
810*8098eeb6SChristoph Böhmwalder 
811*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DISK_CONF_MD_FLUSHES];
812*8098eeb6SChristoph Böhmwalder 	if (nla && s)
813*8098eeb6SChristoph Böhmwalder 		s->md_flushes = nla_get_u8(nla);
814*8098eeb6SChristoph Böhmwalder 
815*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DISK_CONF_DISK_TIMEOUT];
816*8098eeb6SChristoph Böhmwalder 	if (nla && s)
817*8098eeb6SChristoph Böhmwalder 		s->disk_timeout = nla_get_u32(nla);
818*8098eeb6SChristoph Böhmwalder 
819*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DISK_CONF_READ_BALANCING];
820*8098eeb6SChristoph Böhmwalder 	if (nla && s)
821*8098eeb6SChristoph Böhmwalder 		s->read_balancing = nla_get_u32(nla);
822*8098eeb6SChristoph Böhmwalder 
823*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DISK_CONF_AL_UPDATES];
824*8098eeb6SChristoph Böhmwalder 	if (nla && s)
825*8098eeb6SChristoph Böhmwalder 		s->al_updates = nla_get_u8(nla);
826*8098eeb6SChristoph Böhmwalder 
827*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DISK_CONF_DISCARD_ZEROES_IF_ALIGNED];
828*8098eeb6SChristoph Böhmwalder 	if (nla && s)
829*8098eeb6SChristoph Böhmwalder 		s->discard_zeroes_if_aligned = nla_get_u8(nla);
830*8098eeb6SChristoph Böhmwalder 
831*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DISK_CONF_RS_DISCARD_GRANULARITY];
832*8098eeb6SChristoph Böhmwalder 	if (nla && s)
833*8098eeb6SChristoph Böhmwalder 		s->rs_discard_granularity = nla_get_u32(nla);
834*8098eeb6SChristoph Böhmwalder 
835*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DISK_CONF_DISABLE_WRITE_SAME];
836*8098eeb6SChristoph Böhmwalder 	if (nla && s)
837*8098eeb6SChristoph Böhmwalder 		s->disable_write_same = nla_get_u8(nla);
838*8098eeb6SChristoph Böhmwalder 
839*8098eeb6SChristoph Böhmwalder out:
840*8098eeb6SChristoph Böhmwalder 	if (ret_nested_attribute_table && (!err || err == -ENOMSG))
841*8098eeb6SChristoph Böhmwalder 		*ret_nested_attribute_table = ntb;
842*8098eeb6SChristoph Böhmwalder 	else
843*8098eeb6SChristoph Böhmwalder 		kfree(ntb);
844*8098eeb6SChristoph Böhmwalder 	return err;
845*8098eeb6SChristoph Böhmwalder }
846*8098eeb6SChristoph Böhmwalder 
847*8098eeb6SChristoph Böhmwalder int disk_conf_from_attrs(struct disk_conf *s,
848*8098eeb6SChristoph Böhmwalder 				struct genl_info *info)
849*8098eeb6SChristoph Böhmwalder {
850*8098eeb6SChristoph Böhmwalder 	return __disk_conf_from_attrs(s, NULL, info);
851*8098eeb6SChristoph Böhmwalder }
852*8098eeb6SChristoph Böhmwalder 
853*8098eeb6SChristoph Böhmwalder int disk_conf_ntb_from_attrs(
854*8098eeb6SChristoph Böhmwalder 			struct nlattr ***ret_nested_attribute_table,
855*8098eeb6SChristoph Böhmwalder 			struct genl_info *info)
856*8098eeb6SChristoph Böhmwalder {
857*8098eeb6SChristoph Böhmwalder 	return __disk_conf_from_attrs(NULL, ret_nested_attribute_table, info);
858*8098eeb6SChristoph Böhmwalder }
859*8098eeb6SChristoph Böhmwalder 
860*8098eeb6SChristoph Böhmwalder static int __res_opts_from_attrs(struct res_opts *s,
861*8098eeb6SChristoph Böhmwalder 		struct nlattr ***ret_nested_attribute_table,
862*8098eeb6SChristoph Böhmwalder 		struct genl_info *info)
863*8098eeb6SChristoph Böhmwalder {
864*8098eeb6SChristoph Böhmwalder 	const int maxtype = DRBD_A_RES_OPTS_ON_NO_DATA;
865*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = info->attrs[DRBD_NLA_RESOURCE_OPTS];
866*8098eeb6SChristoph Böhmwalder 	struct nlattr **ntb;
867*8098eeb6SChristoph Böhmwalder 	struct nlattr *nla;
868*8098eeb6SChristoph Böhmwalder 	int err = 0;
869*8098eeb6SChristoph Böhmwalder 
870*8098eeb6SChristoph Böhmwalder 	if (ret_nested_attribute_table)
871*8098eeb6SChristoph Böhmwalder 		*ret_nested_attribute_table = NULL;
872*8098eeb6SChristoph Böhmwalder 	if (!tla)
873*8098eeb6SChristoph Böhmwalder 		return -ENOMSG;
874*8098eeb6SChristoph Böhmwalder 	ntb = kcalloc(DRBD_A_RES_OPTS_ON_NO_DATA + 1, sizeof(*ntb), GFP_KERNEL);
875*8098eeb6SChristoph Böhmwalder 	if (!ntb)
876*8098eeb6SChristoph Böhmwalder 		return -ENOMEM;
877*8098eeb6SChristoph Böhmwalder 	err = nla_parse_nested_deprecated(ntb, maxtype, tla, drbd_res_opts_nl_policy, NULL);
878*8098eeb6SChristoph Böhmwalder 	if (err)
879*8098eeb6SChristoph Böhmwalder 		goto out;
880*8098eeb6SChristoph Böhmwalder 
881*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_RES_OPTS_CPU_MASK];
882*8098eeb6SChristoph Böhmwalder 	if (nla && s)
883*8098eeb6SChristoph Böhmwalder 		s->cpu_mask_len = nla_strscpy(s->cpu_mask, nla, DRBD_CPU_MASK_SIZE);
884*8098eeb6SChristoph Böhmwalder 
885*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_RES_OPTS_ON_NO_DATA];
886*8098eeb6SChristoph Böhmwalder 	if (nla && s)
887*8098eeb6SChristoph Böhmwalder 		s->on_no_data = nla_get_u32(nla);
888*8098eeb6SChristoph Böhmwalder 
889*8098eeb6SChristoph Böhmwalder out:
890*8098eeb6SChristoph Böhmwalder 	if (ret_nested_attribute_table && (!err || err == -ENOMSG))
891*8098eeb6SChristoph Böhmwalder 		*ret_nested_attribute_table = ntb;
892*8098eeb6SChristoph Böhmwalder 	else
893*8098eeb6SChristoph Böhmwalder 		kfree(ntb);
894*8098eeb6SChristoph Böhmwalder 	return err;
895*8098eeb6SChristoph Böhmwalder }
896*8098eeb6SChristoph Böhmwalder 
897*8098eeb6SChristoph Böhmwalder int res_opts_from_attrs(struct res_opts *s,
898*8098eeb6SChristoph Böhmwalder 				struct genl_info *info)
899*8098eeb6SChristoph Böhmwalder {
900*8098eeb6SChristoph Böhmwalder 	return __res_opts_from_attrs(s, NULL, info);
901*8098eeb6SChristoph Böhmwalder }
902*8098eeb6SChristoph Böhmwalder 
903*8098eeb6SChristoph Böhmwalder int res_opts_ntb_from_attrs(
904*8098eeb6SChristoph Böhmwalder 			struct nlattr ***ret_nested_attribute_table,
905*8098eeb6SChristoph Böhmwalder 			struct genl_info *info)
906*8098eeb6SChristoph Böhmwalder {
907*8098eeb6SChristoph Böhmwalder 	return __res_opts_from_attrs(NULL, ret_nested_attribute_table, info);
908*8098eeb6SChristoph Böhmwalder }
909*8098eeb6SChristoph Böhmwalder 
910*8098eeb6SChristoph Böhmwalder static int __net_conf_from_attrs(struct net_conf *s,
911*8098eeb6SChristoph Böhmwalder 		struct nlattr ***ret_nested_attribute_table,
912*8098eeb6SChristoph Böhmwalder 		struct genl_info *info)
913*8098eeb6SChristoph Böhmwalder {
914*8098eeb6SChristoph Böhmwalder 	const int maxtype = DRBD_A_NET_CONF_SOCK_CHECK_TIMEO;
915*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = info->attrs[DRBD_NLA_NET_CONF];
916*8098eeb6SChristoph Böhmwalder 	struct nlattr **ntb;
917*8098eeb6SChristoph Böhmwalder 	struct nlattr *nla;
918*8098eeb6SChristoph Böhmwalder 	int err = 0;
919*8098eeb6SChristoph Böhmwalder 
920*8098eeb6SChristoph Böhmwalder 	if (ret_nested_attribute_table)
921*8098eeb6SChristoph Böhmwalder 		*ret_nested_attribute_table = NULL;
922*8098eeb6SChristoph Böhmwalder 	if (!tla)
923*8098eeb6SChristoph Böhmwalder 		return -ENOMSG;
924*8098eeb6SChristoph Böhmwalder 	ntb = kcalloc(DRBD_A_NET_CONF_SOCK_CHECK_TIMEO + 1, sizeof(*ntb), GFP_KERNEL);
925*8098eeb6SChristoph Böhmwalder 	if (!ntb)
926*8098eeb6SChristoph Böhmwalder 		return -ENOMEM;
927*8098eeb6SChristoph Böhmwalder 	err = nla_parse_nested_deprecated(ntb, maxtype, tla, drbd_net_conf_nl_policy, NULL);
928*8098eeb6SChristoph Böhmwalder 	if (err)
929*8098eeb6SChristoph Böhmwalder 		goto out;
930*8098eeb6SChristoph Böhmwalder 
931*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_NET_CONF_SHARED_SECRET];
932*8098eeb6SChristoph Böhmwalder 	if (nla && s)
933*8098eeb6SChristoph Böhmwalder 		s->shared_secret_len = nla_strscpy(s->shared_secret, nla, SHARED_SECRET_MAX);
934*8098eeb6SChristoph Böhmwalder 
935*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_NET_CONF_CRAM_HMAC_ALG];
936*8098eeb6SChristoph Böhmwalder 	if (nla && s)
937*8098eeb6SChristoph Böhmwalder 		s->cram_hmac_alg_len = nla_strscpy(s->cram_hmac_alg, nla, SHARED_SECRET_MAX);
938*8098eeb6SChristoph Böhmwalder 
939*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_NET_CONF_INTEGRITY_ALG];
940*8098eeb6SChristoph Böhmwalder 	if (nla && s)
941*8098eeb6SChristoph Böhmwalder 		s->integrity_alg_len = nla_strscpy(s->integrity_alg, nla, SHARED_SECRET_MAX);
942*8098eeb6SChristoph Böhmwalder 
943*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_NET_CONF_VERIFY_ALG];
944*8098eeb6SChristoph Böhmwalder 	if (nla && s)
945*8098eeb6SChristoph Böhmwalder 		s->verify_alg_len = nla_strscpy(s->verify_alg, nla, SHARED_SECRET_MAX);
946*8098eeb6SChristoph Böhmwalder 
947*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_NET_CONF_CSUMS_ALG];
948*8098eeb6SChristoph Böhmwalder 	if (nla && s)
949*8098eeb6SChristoph Böhmwalder 		s->csums_alg_len = nla_strscpy(s->csums_alg, nla, SHARED_SECRET_MAX);
950*8098eeb6SChristoph Böhmwalder 
951*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_NET_CONF_WIRE_PROTOCOL];
952*8098eeb6SChristoph Böhmwalder 	if (nla && s)
953*8098eeb6SChristoph Böhmwalder 		s->wire_protocol = nla_get_u32(nla);
954*8098eeb6SChristoph Böhmwalder 
955*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_NET_CONF_CONNECT_INT];
956*8098eeb6SChristoph Böhmwalder 	if (nla && s)
957*8098eeb6SChristoph Böhmwalder 		s->connect_int = nla_get_u32(nla);
958*8098eeb6SChristoph Böhmwalder 
959*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_NET_CONF_TIMEOUT];
960*8098eeb6SChristoph Böhmwalder 	if (nla && s)
961*8098eeb6SChristoph Böhmwalder 		s->timeout = nla_get_u32(nla);
962*8098eeb6SChristoph Böhmwalder 
963*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_NET_CONF_PING_INT];
964*8098eeb6SChristoph Böhmwalder 	if (nla && s)
965*8098eeb6SChristoph Böhmwalder 		s->ping_int = nla_get_u32(nla);
966*8098eeb6SChristoph Böhmwalder 
967*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_NET_CONF_PING_TIMEO];
968*8098eeb6SChristoph Böhmwalder 	if (nla && s)
969*8098eeb6SChristoph Böhmwalder 		s->ping_timeo = nla_get_u32(nla);
970*8098eeb6SChristoph Böhmwalder 
971*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_NET_CONF_SNDBUF_SIZE];
972*8098eeb6SChristoph Böhmwalder 	if (nla && s)
973*8098eeb6SChristoph Böhmwalder 		s->sndbuf_size = nla_get_u32(nla);
974*8098eeb6SChristoph Böhmwalder 
975*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_NET_CONF_RCVBUF_SIZE];
976*8098eeb6SChristoph Böhmwalder 	if (nla && s)
977*8098eeb6SChristoph Böhmwalder 		s->rcvbuf_size = nla_get_u32(nla);
978*8098eeb6SChristoph Böhmwalder 
979*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_NET_CONF_KO_COUNT];
980*8098eeb6SChristoph Böhmwalder 	if (nla && s)
981*8098eeb6SChristoph Böhmwalder 		s->ko_count = nla_get_u32(nla);
982*8098eeb6SChristoph Böhmwalder 
983*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_NET_CONF_MAX_BUFFERS];
984*8098eeb6SChristoph Böhmwalder 	if (nla && s)
985*8098eeb6SChristoph Böhmwalder 		s->max_buffers = nla_get_u32(nla);
986*8098eeb6SChristoph Böhmwalder 
987*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_NET_CONF_MAX_EPOCH_SIZE];
988*8098eeb6SChristoph Böhmwalder 	if (nla && s)
989*8098eeb6SChristoph Böhmwalder 		s->max_epoch_size = nla_get_u32(nla);
990*8098eeb6SChristoph Böhmwalder 
991*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_NET_CONF_UNPLUG_WATERMARK];
992*8098eeb6SChristoph Böhmwalder 	if (nla && s)
993*8098eeb6SChristoph Böhmwalder 		s->unplug_watermark = nla_get_u32(nla);
994*8098eeb6SChristoph Böhmwalder 
995*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_NET_CONF_AFTER_SB_0P];
996*8098eeb6SChristoph Böhmwalder 	if (nla && s)
997*8098eeb6SChristoph Böhmwalder 		s->after_sb_0p = nla_get_u32(nla);
998*8098eeb6SChristoph Böhmwalder 
999*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_NET_CONF_AFTER_SB_1P];
1000*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1001*8098eeb6SChristoph Böhmwalder 		s->after_sb_1p = nla_get_u32(nla);
1002*8098eeb6SChristoph Böhmwalder 
1003*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_NET_CONF_AFTER_SB_2P];
1004*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1005*8098eeb6SChristoph Böhmwalder 		s->after_sb_2p = nla_get_u32(nla);
1006*8098eeb6SChristoph Böhmwalder 
1007*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_NET_CONF_RR_CONFLICT];
1008*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1009*8098eeb6SChristoph Böhmwalder 		s->rr_conflict = nla_get_u32(nla);
1010*8098eeb6SChristoph Böhmwalder 
1011*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_NET_CONF_ON_CONGESTION];
1012*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1013*8098eeb6SChristoph Böhmwalder 		s->on_congestion = nla_get_u32(nla);
1014*8098eeb6SChristoph Böhmwalder 
1015*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_NET_CONF_CONG_FILL];
1016*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1017*8098eeb6SChristoph Böhmwalder 		s->cong_fill = nla_get_u32(nla);
1018*8098eeb6SChristoph Böhmwalder 
1019*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_NET_CONF_CONG_EXTENTS];
1020*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1021*8098eeb6SChristoph Böhmwalder 		s->cong_extents = nla_get_u32(nla);
1022*8098eeb6SChristoph Böhmwalder 
1023*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_NET_CONF_TWO_PRIMARIES];
1024*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1025*8098eeb6SChristoph Böhmwalder 		s->two_primaries = nla_get_u8(nla);
1026*8098eeb6SChristoph Böhmwalder 
1027*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_NET_CONF_DISCARD_MY_DATA];
1028*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1029*8098eeb6SChristoph Böhmwalder 		s->discard_my_data = nla_get_u8(nla);
1030*8098eeb6SChristoph Böhmwalder 
1031*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_NET_CONF_TCP_CORK];
1032*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1033*8098eeb6SChristoph Böhmwalder 		s->tcp_cork = nla_get_u8(nla);
1034*8098eeb6SChristoph Böhmwalder 
1035*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_NET_CONF_ALWAYS_ASBP];
1036*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1037*8098eeb6SChristoph Böhmwalder 		s->always_asbp = nla_get_u8(nla);
1038*8098eeb6SChristoph Böhmwalder 
1039*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_NET_CONF_TENTATIVE];
1040*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1041*8098eeb6SChristoph Böhmwalder 		s->tentative = nla_get_u8(nla);
1042*8098eeb6SChristoph Böhmwalder 
1043*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_NET_CONF_USE_RLE];
1044*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1045*8098eeb6SChristoph Böhmwalder 		s->use_rle = nla_get_u8(nla);
1046*8098eeb6SChristoph Böhmwalder 
1047*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_NET_CONF_CSUMS_AFTER_CRASH_ONLY];
1048*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1049*8098eeb6SChristoph Böhmwalder 		s->csums_after_crash_only = nla_get_u8(nla);
1050*8098eeb6SChristoph Böhmwalder 
1051*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_NET_CONF_SOCK_CHECK_TIMEO];
1052*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1053*8098eeb6SChristoph Böhmwalder 		s->sock_check_timeo = nla_get_u32(nla);
1054*8098eeb6SChristoph Böhmwalder 
1055*8098eeb6SChristoph Böhmwalder out:
1056*8098eeb6SChristoph Böhmwalder 	if (ret_nested_attribute_table && (!err || err == -ENOMSG))
1057*8098eeb6SChristoph Böhmwalder 		*ret_nested_attribute_table = ntb;
1058*8098eeb6SChristoph Böhmwalder 	else
1059*8098eeb6SChristoph Böhmwalder 		kfree(ntb);
1060*8098eeb6SChristoph Böhmwalder 	return err;
1061*8098eeb6SChristoph Böhmwalder }
1062*8098eeb6SChristoph Böhmwalder 
1063*8098eeb6SChristoph Böhmwalder int net_conf_from_attrs(struct net_conf *s,
1064*8098eeb6SChristoph Böhmwalder 				struct genl_info *info)
1065*8098eeb6SChristoph Böhmwalder {
1066*8098eeb6SChristoph Böhmwalder 	return __net_conf_from_attrs(s, NULL, info);
1067*8098eeb6SChristoph Böhmwalder }
1068*8098eeb6SChristoph Böhmwalder 
1069*8098eeb6SChristoph Böhmwalder int net_conf_ntb_from_attrs(
1070*8098eeb6SChristoph Böhmwalder 			struct nlattr ***ret_nested_attribute_table,
1071*8098eeb6SChristoph Böhmwalder 			struct genl_info *info)
1072*8098eeb6SChristoph Böhmwalder {
1073*8098eeb6SChristoph Böhmwalder 	return __net_conf_from_attrs(NULL, ret_nested_attribute_table, info);
1074*8098eeb6SChristoph Böhmwalder }
1075*8098eeb6SChristoph Böhmwalder 
1076*8098eeb6SChristoph Böhmwalder static int __set_role_parms_from_attrs(struct set_role_parms *s,
1077*8098eeb6SChristoph Böhmwalder 		struct nlattr ***ret_nested_attribute_table,
1078*8098eeb6SChristoph Böhmwalder 		struct genl_info *info)
1079*8098eeb6SChristoph Böhmwalder {
1080*8098eeb6SChristoph Böhmwalder 	const int maxtype = DRBD_A_SET_ROLE_PARMS_ASSUME_UPTODATE;
1081*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = info->attrs[DRBD_NLA_SET_ROLE_PARMS];
1082*8098eeb6SChristoph Böhmwalder 	struct nlattr **ntb;
1083*8098eeb6SChristoph Böhmwalder 	struct nlattr *nla;
1084*8098eeb6SChristoph Böhmwalder 	int err = 0;
1085*8098eeb6SChristoph Böhmwalder 
1086*8098eeb6SChristoph Böhmwalder 	if (ret_nested_attribute_table)
1087*8098eeb6SChristoph Böhmwalder 		*ret_nested_attribute_table = NULL;
1088*8098eeb6SChristoph Böhmwalder 	if (!tla)
1089*8098eeb6SChristoph Böhmwalder 		return -ENOMSG;
1090*8098eeb6SChristoph Böhmwalder 	ntb = kcalloc(DRBD_A_SET_ROLE_PARMS_ASSUME_UPTODATE + 1, sizeof(*ntb), GFP_KERNEL);
1091*8098eeb6SChristoph Böhmwalder 	if (!ntb)
1092*8098eeb6SChristoph Böhmwalder 		return -ENOMEM;
1093*8098eeb6SChristoph Böhmwalder 	err = nla_parse_nested_deprecated(ntb, maxtype, tla, drbd_set_role_parms_nl_policy, NULL);
1094*8098eeb6SChristoph Böhmwalder 	if (err)
1095*8098eeb6SChristoph Böhmwalder 		goto out;
1096*8098eeb6SChristoph Böhmwalder 
1097*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_SET_ROLE_PARMS_ASSUME_UPTODATE];
1098*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1099*8098eeb6SChristoph Böhmwalder 		s->assume_uptodate = nla_get_u8(nla);
1100*8098eeb6SChristoph Böhmwalder 
1101*8098eeb6SChristoph Böhmwalder out:
1102*8098eeb6SChristoph Böhmwalder 	if (ret_nested_attribute_table && (!err || err == -ENOMSG))
1103*8098eeb6SChristoph Böhmwalder 		*ret_nested_attribute_table = ntb;
1104*8098eeb6SChristoph Böhmwalder 	else
1105*8098eeb6SChristoph Böhmwalder 		kfree(ntb);
1106*8098eeb6SChristoph Böhmwalder 	return err;
1107*8098eeb6SChristoph Böhmwalder }
1108*8098eeb6SChristoph Böhmwalder 
1109*8098eeb6SChristoph Böhmwalder int set_role_parms_from_attrs(struct set_role_parms *s,
1110*8098eeb6SChristoph Böhmwalder 				struct genl_info *info)
1111*8098eeb6SChristoph Böhmwalder {
1112*8098eeb6SChristoph Böhmwalder 	return __set_role_parms_from_attrs(s, NULL, info);
1113*8098eeb6SChristoph Böhmwalder }
1114*8098eeb6SChristoph Böhmwalder 
1115*8098eeb6SChristoph Böhmwalder int set_role_parms_ntb_from_attrs(
1116*8098eeb6SChristoph Böhmwalder 			struct nlattr ***ret_nested_attribute_table,
1117*8098eeb6SChristoph Böhmwalder 			struct genl_info *info)
1118*8098eeb6SChristoph Böhmwalder {
1119*8098eeb6SChristoph Böhmwalder 	return __set_role_parms_from_attrs(NULL, ret_nested_attribute_table, info);
1120*8098eeb6SChristoph Böhmwalder }
1121*8098eeb6SChristoph Böhmwalder 
1122*8098eeb6SChristoph Böhmwalder static int __resize_parms_from_attrs(struct resize_parms *s,
1123*8098eeb6SChristoph Böhmwalder 		struct nlattr ***ret_nested_attribute_table,
1124*8098eeb6SChristoph Böhmwalder 		struct genl_info *info)
1125*8098eeb6SChristoph Böhmwalder {
1126*8098eeb6SChristoph Böhmwalder 	const int maxtype = DRBD_A_RESIZE_PARMS_AL_STRIPE_SIZE;
1127*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = info->attrs[DRBD_NLA_RESIZE_PARMS];
1128*8098eeb6SChristoph Böhmwalder 	struct nlattr **ntb;
1129*8098eeb6SChristoph Böhmwalder 	struct nlattr *nla;
1130*8098eeb6SChristoph Böhmwalder 	int err = 0;
1131*8098eeb6SChristoph Böhmwalder 
1132*8098eeb6SChristoph Böhmwalder 	if (ret_nested_attribute_table)
1133*8098eeb6SChristoph Böhmwalder 		*ret_nested_attribute_table = NULL;
1134*8098eeb6SChristoph Böhmwalder 	if (!tla)
1135*8098eeb6SChristoph Böhmwalder 		return -ENOMSG;
1136*8098eeb6SChristoph Böhmwalder 	ntb = kcalloc(DRBD_A_RESIZE_PARMS_AL_STRIPE_SIZE + 1, sizeof(*ntb), GFP_KERNEL);
1137*8098eeb6SChristoph Böhmwalder 	if (!ntb)
1138*8098eeb6SChristoph Böhmwalder 		return -ENOMEM;
1139*8098eeb6SChristoph Böhmwalder 	err = nla_parse_nested_deprecated(ntb, maxtype, tla, drbd_resize_parms_nl_policy, NULL);
1140*8098eeb6SChristoph Böhmwalder 	if (err)
1141*8098eeb6SChristoph Böhmwalder 		goto out;
1142*8098eeb6SChristoph Böhmwalder 
1143*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_RESIZE_PARMS_RESIZE_SIZE];
1144*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1145*8098eeb6SChristoph Böhmwalder 		s->resize_size = nla_get_u64(nla);
1146*8098eeb6SChristoph Böhmwalder 
1147*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_RESIZE_PARMS_RESIZE_FORCE];
1148*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1149*8098eeb6SChristoph Böhmwalder 		s->resize_force = nla_get_u8(nla);
1150*8098eeb6SChristoph Böhmwalder 
1151*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_RESIZE_PARMS_NO_RESYNC];
1152*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1153*8098eeb6SChristoph Böhmwalder 		s->no_resync = nla_get_u8(nla);
1154*8098eeb6SChristoph Böhmwalder 
1155*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_RESIZE_PARMS_AL_STRIPES];
1156*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1157*8098eeb6SChristoph Böhmwalder 		s->al_stripes = nla_get_u32(nla);
1158*8098eeb6SChristoph Böhmwalder 
1159*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_RESIZE_PARMS_AL_STRIPE_SIZE];
1160*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1161*8098eeb6SChristoph Böhmwalder 		s->al_stripe_size = nla_get_u32(nla);
1162*8098eeb6SChristoph Böhmwalder 
1163*8098eeb6SChristoph Böhmwalder out:
1164*8098eeb6SChristoph Böhmwalder 	if (ret_nested_attribute_table && (!err || err == -ENOMSG))
1165*8098eeb6SChristoph Böhmwalder 		*ret_nested_attribute_table = ntb;
1166*8098eeb6SChristoph Böhmwalder 	else
1167*8098eeb6SChristoph Böhmwalder 		kfree(ntb);
1168*8098eeb6SChristoph Böhmwalder 	return err;
1169*8098eeb6SChristoph Böhmwalder }
1170*8098eeb6SChristoph Böhmwalder 
1171*8098eeb6SChristoph Böhmwalder int resize_parms_from_attrs(struct resize_parms *s,
1172*8098eeb6SChristoph Böhmwalder 				struct genl_info *info)
1173*8098eeb6SChristoph Böhmwalder {
1174*8098eeb6SChristoph Böhmwalder 	return __resize_parms_from_attrs(s, NULL, info);
1175*8098eeb6SChristoph Böhmwalder }
1176*8098eeb6SChristoph Böhmwalder 
1177*8098eeb6SChristoph Böhmwalder int resize_parms_ntb_from_attrs(
1178*8098eeb6SChristoph Böhmwalder 			struct nlattr ***ret_nested_attribute_table,
1179*8098eeb6SChristoph Böhmwalder 			struct genl_info *info)
1180*8098eeb6SChristoph Böhmwalder {
1181*8098eeb6SChristoph Böhmwalder 	return __resize_parms_from_attrs(NULL, ret_nested_attribute_table, info);
1182*8098eeb6SChristoph Böhmwalder }
1183*8098eeb6SChristoph Böhmwalder 
1184*8098eeb6SChristoph Böhmwalder static int __start_ov_parms_from_attrs(struct start_ov_parms *s,
1185*8098eeb6SChristoph Böhmwalder 		struct nlattr ***ret_nested_attribute_table,
1186*8098eeb6SChristoph Böhmwalder 		struct genl_info *info)
1187*8098eeb6SChristoph Böhmwalder {
1188*8098eeb6SChristoph Böhmwalder 	const int maxtype = DRBD_A_START_OV_PARMS_OV_STOP_SECTOR;
1189*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = info->attrs[DRBD_NLA_START_OV_PARMS];
1190*8098eeb6SChristoph Böhmwalder 	struct nlattr **ntb;
1191*8098eeb6SChristoph Böhmwalder 	struct nlattr *nla;
1192*8098eeb6SChristoph Böhmwalder 	int err = 0;
1193*8098eeb6SChristoph Böhmwalder 
1194*8098eeb6SChristoph Böhmwalder 	if (ret_nested_attribute_table)
1195*8098eeb6SChristoph Böhmwalder 		*ret_nested_attribute_table = NULL;
1196*8098eeb6SChristoph Böhmwalder 	if (!tla)
1197*8098eeb6SChristoph Böhmwalder 		return -ENOMSG;
1198*8098eeb6SChristoph Böhmwalder 	ntb = kcalloc(DRBD_A_START_OV_PARMS_OV_STOP_SECTOR + 1, sizeof(*ntb), GFP_KERNEL);
1199*8098eeb6SChristoph Böhmwalder 	if (!ntb)
1200*8098eeb6SChristoph Böhmwalder 		return -ENOMEM;
1201*8098eeb6SChristoph Böhmwalder 	err = nla_parse_nested_deprecated(ntb, maxtype, tla, drbd_start_ov_parms_nl_policy, NULL);
1202*8098eeb6SChristoph Böhmwalder 	if (err)
1203*8098eeb6SChristoph Böhmwalder 		goto out;
1204*8098eeb6SChristoph Böhmwalder 
1205*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_START_OV_PARMS_OV_START_SECTOR];
1206*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1207*8098eeb6SChristoph Böhmwalder 		s->ov_start_sector = nla_get_u64(nla);
1208*8098eeb6SChristoph Böhmwalder 
1209*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_START_OV_PARMS_OV_STOP_SECTOR];
1210*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1211*8098eeb6SChristoph Böhmwalder 		s->ov_stop_sector = nla_get_u64(nla);
1212*8098eeb6SChristoph Böhmwalder 
1213*8098eeb6SChristoph Böhmwalder out:
1214*8098eeb6SChristoph Böhmwalder 	if (ret_nested_attribute_table && (!err || err == -ENOMSG))
1215*8098eeb6SChristoph Böhmwalder 		*ret_nested_attribute_table = ntb;
1216*8098eeb6SChristoph Böhmwalder 	else
1217*8098eeb6SChristoph Böhmwalder 		kfree(ntb);
1218*8098eeb6SChristoph Böhmwalder 	return err;
1219*8098eeb6SChristoph Böhmwalder }
1220*8098eeb6SChristoph Böhmwalder 
1221*8098eeb6SChristoph Böhmwalder int start_ov_parms_from_attrs(struct start_ov_parms *s,
1222*8098eeb6SChristoph Böhmwalder 				struct genl_info *info)
1223*8098eeb6SChristoph Böhmwalder {
1224*8098eeb6SChristoph Böhmwalder 	return __start_ov_parms_from_attrs(s, NULL, info);
1225*8098eeb6SChristoph Böhmwalder }
1226*8098eeb6SChristoph Böhmwalder 
1227*8098eeb6SChristoph Böhmwalder int start_ov_parms_ntb_from_attrs(
1228*8098eeb6SChristoph Böhmwalder 			struct nlattr ***ret_nested_attribute_table,
1229*8098eeb6SChristoph Böhmwalder 			struct genl_info *info)
1230*8098eeb6SChristoph Böhmwalder {
1231*8098eeb6SChristoph Böhmwalder 	return __start_ov_parms_from_attrs(NULL, ret_nested_attribute_table, info);
1232*8098eeb6SChristoph Böhmwalder }
1233*8098eeb6SChristoph Böhmwalder 
1234*8098eeb6SChristoph Böhmwalder static int __new_c_uuid_parms_from_attrs(struct new_c_uuid_parms *s,
1235*8098eeb6SChristoph Böhmwalder 		struct nlattr ***ret_nested_attribute_table,
1236*8098eeb6SChristoph Böhmwalder 		struct genl_info *info)
1237*8098eeb6SChristoph Böhmwalder {
1238*8098eeb6SChristoph Böhmwalder 	const int maxtype = DRBD_A_NEW_C_UUID_PARMS_CLEAR_BM;
1239*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = info->attrs[DRBD_NLA_NEW_C_UUID_PARMS];
1240*8098eeb6SChristoph Böhmwalder 	struct nlattr **ntb;
1241*8098eeb6SChristoph Böhmwalder 	struct nlattr *nla;
1242*8098eeb6SChristoph Böhmwalder 	int err = 0;
1243*8098eeb6SChristoph Böhmwalder 
1244*8098eeb6SChristoph Böhmwalder 	if (ret_nested_attribute_table)
1245*8098eeb6SChristoph Böhmwalder 		*ret_nested_attribute_table = NULL;
1246*8098eeb6SChristoph Böhmwalder 	if (!tla)
1247*8098eeb6SChristoph Böhmwalder 		return -ENOMSG;
1248*8098eeb6SChristoph Böhmwalder 	ntb = kcalloc(DRBD_A_NEW_C_UUID_PARMS_CLEAR_BM + 1, sizeof(*ntb), GFP_KERNEL);
1249*8098eeb6SChristoph Böhmwalder 	if (!ntb)
1250*8098eeb6SChristoph Böhmwalder 		return -ENOMEM;
1251*8098eeb6SChristoph Böhmwalder 	err = nla_parse_nested_deprecated(ntb, maxtype, tla, drbd_new_c_uuid_parms_nl_policy, NULL);
1252*8098eeb6SChristoph Böhmwalder 	if (err)
1253*8098eeb6SChristoph Böhmwalder 		goto out;
1254*8098eeb6SChristoph Böhmwalder 
1255*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_NEW_C_UUID_PARMS_CLEAR_BM];
1256*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1257*8098eeb6SChristoph Böhmwalder 		s->clear_bm = nla_get_u8(nla);
1258*8098eeb6SChristoph Böhmwalder 
1259*8098eeb6SChristoph Böhmwalder out:
1260*8098eeb6SChristoph Böhmwalder 	if (ret_nested_attribute_table && (!err || err == -ENOMSG))
1261*8098eeb6SChristoph Böhmwalder 		*ret_nested_attribute_table = ntb;
1262*8098eeb6SChristoph Böhmwalder 	else
1263*8098eeb6SChristoph Böhmwalder 		kfree(ntb);
1264*8098eeb6SChristoph Böhmwalder 	return err;
1265*8098eeb6SChristoph Böhmwalder }
1266*8098eeb6SChristoph Böhmwalder 
1267*8098eeb6SChristoph Böhmwalder int new_c_uuid_parms_from_attrs(struct new_c_uuid_parms *s,
1268*8098eeb6SChristoph Böhmwalder 				struct genl_info *info)
1269*8098eeb6SChristoph Böhmwalder {
1270*8098eeb6SChristoph Böhmwalder 	return __new_c_uuid_parms_from_attrs(s, NULL, info);
1271*8098eeb6SChristoph Böhmwalder }
1272*8098eeb6SChristoph Böhmwalder 
1273*8098eeb6SChristoph Böhmwalder int new_c_uuid_parms_ntb_from_attrs(
1274*8098eeb6SChristoph Böhmwalder 			struct nlattr ***ret_nested_attribute_table,
1275*8098eeb6SChristoph Böhmwalder 			struct genl_info *info)
1276*8098eeb6SChristoph Böhmwalder {
1277*8098eeb6SChristoph Böhmwalder 	return __new_c_uuid_parms_from_attrs(NULL, ret_nested_attribute_table, info);
1278*8098eeb6SChristoph Böhmwalder }
1279*8098eeb6SChristoph Böhmwalder 
1280*8098eeb6SChristoph Böhmwalder static int __disconnect_parms_from_attrs(struct disconnect_parms *s,
1281*8098eeb6SChristoph Böhmwalder 		struct nlattr ***ret_nested_attribute_table,
1282*8098eeb6SChristoph Böhmwalder 		struct genl_info *info)
1283*8098eeb6SChristoph Böhmwalder {
1284*8098eeb6SChristoph Böhmwalder 	const int maxtype = DRBD_A_DISCONNECT_PARMS_FORCE_DISCONNECT;
1285*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = info->attrs[DRBD_NLA_DISCONNECT_PARMS];
1286*8098eeb6SChristoph Böhmwalder 	struct nlattr **ntb;
1287*8098eeb6SChristoph Böhmwalder 	struct nlattr *nla;
1288*8098eeb6SChristoph Böhmwalder 	int err = 0;
1289*8098eeb6SChristoph Böhmwalder 
1290*8098eeb6SChristoph Böhmwalder 	if (ret_nested_attribute_table)
1291*8098eeb6SChristoph Böhmwalder 		*ret_nested_attribute_table = NULL;
1292*8098eeb6SChristoph Böhmwalder 	if (!tla)
1293*8098eeb6SChristoph Böhmwalder 		return -ENOMSG;
1294*8098eeb6SChristoph Böhmwalder 	ntb = kcalloc(DRBD_A_DISCONNECT_PARMS_FORCE_DISCONNECT + 1, sizeof(*ntb), GFP_KERNEL);
1295*8098eeb6SChristoph Böhmwalder 	if (!ntb)
1296*8098eeb6SChristoph Böhmwalder 		return -ENOMEM;
1297*8098eeb6SChristoph Böhmwalder 	err = nla_parse_nested_deprecated(ntb, maxtype, tla, drbd_disconnect_parms_nl_policy, NULL);
1298*8098eeb6SChristoph Böhmwalder 	if (err)
1299*8098eeb6SChristoph Böhmwalder 		goto out;
1300*8098eeb6SChristoph Böhmwalder 
1301*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DISCONNECT_PARMS_FORCE_DISCONNECT];
1302*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1303*8098eeb6SChristoph Böhmwalder 		s->force_disconnect = nla_get_u8(nla);
1304*8098eeb6SChristoph Böhmwalder 
1305*8098eeb6SChristoph Böhmwalder out:
1306*8098eeb6SChristoph Böhmwalder 	if (ret_nested_attribute_table && (!err || err == -ENOMSG))
1307*8098eeb6SChristoph Böhmwalder 		*ret_nested_attribute_table = ntb;
1308*8098eeb6SChristoph Böhmwalder 	else
1309*8098eeb6SChristoph Böhmwalder 		kfree(ntb);
1310*8098eeb6SChristoph Böhmwalder 	return err;
1311*8098eeb6SChristoph Böhmwalder }
1312*8098eeb6SChristoph Böhmwalder 
1313*8098eeb6SChristoph Böhmwalder int disconnect_parms_from_attrs(struct disconnect_parms *s,
1314*8098eeb6SChristoph Böhmwalder 				struct genl_info *info)
1315*8098eeb6SChristoph Böhmwalder {
1316*8098eeb6SChristoph Böhmwalder 	return __disconnect_parms_from_attrs(s, NULL, info);
1317*8098eeb6SChristoph Böhmwalder }
1318*8098eeb6SChristoph Böhmwalder 
1319*8098eeb6SChristoph Böhmwalder int disconnect_parms_ntb_from_attrs(
1320*8098eeb6SChristoph Böhmwalder 			struct nlattr ***ret_nested_attribute_table,
1321*8098eeb6SChristoph Böhmwalder 			struct genl_info *info)
1322*8098eeb6SChristoph Böhmwalder {
1323*8098eeb6SChristoph Böhmwalder 	return __disconnect_parms_from_attrs(NULL, ret_nested_attribute_table, info);
1324*8098eeb6SChristoph Böhmwalder }
1325*8098eeb6SChristoph Böhmwalder 
1326*8098eeb6SChristoph Böhmwalder static int __detach_parms_from_attrs(struct detach_parms *s,
1327*8098eeb6SChristoph Böhmwalder 		struct nlattr ***ret_nested_attribute_table,
1328*8098eeb6SChristoph Böhmwalder 		struct genl_info *info)
1329*8098eeb6SChristoph Böhmwalder {
1330*8098eeb6SChristoph Böhmwalder 	const int maxtype = DRBD_A_DETACH_PARMS_FORCE_DETACH;
1331*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = info->attrs[DRBD_NLA_DETACH_PARMS];
1332*8098eeb6SChristoph Böhmwalder 	struct nlattr **ntb;
1333*8098eeb6SChristoph Böhmwalder 	struct nlattr *nla;
1334*8098eeb6SChristoph Böhmwalder 	int err = 0;
1335*8098eeb6SChristoph Böhmwalder 
1336*8098eeb6SChristoph Böhmwalder 	if (ret_nested_attribute_table)
1337*8098eeb6SChristoph Böhmwalder 		*ret_nested_attribute_table = NULL;
1338*8098eeb6SChristoph Böhmwalder 	if (!tla)
1339*8098eeb6SChristoph Böhmwalder 		return -ENOMSG;
1340*8098eeb6SChristoph Böhmwalder 	ntb = kcalloc(DRBD_A_DETACH_PARMS_FORCE_DETACH + 1, sizeof(*ntb), GFP_KERNEL);
1341*8098eeb6SChristoph Böhmwalder 	if (!ntb)
1342*8098eeb6SChristoph Böhmwalder 		return -ENOMEM;
1343*8098eeb6SChristoph Böhmwalder 	err = nla_parse_nested_deprecated(ntb, maxtype, tla, drbd_detach_parms_nl_policy, NULL);
1344*8098eeb6SChristoph Böhmwalder 	if (err)
1345*8098eeb6SChristoph Böhmwalder 		goto out;
1346*8098eeb6SChristoph Böhmwalder 
1347*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DETACH_PARMS_FORCE_DETACH];
1348*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1349*8098eeb6SChristoph Böhmwalder 		s->force_detach = nla_get_u8(nla);
1350*8098eeb6SChristoph Böhmwalder 
1351*8098eeb6SChristoph Böhmwalder out:
1352*8098eeb6SChristoph Böhmwalder 	if (ret_nested_attribute_table && (!err || err == -ENOMSG))
1353*8098eeb6SChristoph Böhmwalder 		*ret_nested_attribute_table = ntb;
1354*8098eeb6SChristoph Böhmwalder 	else
1355*8098eeb6SChristoph Böhmwalder 		kfree(ntb);
1356*8098eeb6SChristoph Böhmwalder 	return err;
1357*8098eeb6SChristoph Böhmwalder }
1358*8098eeb6SChristoph Böhmwalder 
1359*8098eeb6SChristoph Böhmwalder int detach_parms_from_attrs(struct detach_parms *s,
1360*8098eeb6SChristoph Böhmwalder 				struct genl_info *info)
1361*8098eeb6SChristoph Böhmwalder {
1362*8098eeb6SChristoph Böhmwalder 	return __detach_parms_from_attrs(s, NULL, info);
1363*8098eeb6SChristoph Böhmwalder }
1364*8098eeb6SChristoph Böhmwalder 
1365*8098eeb6SChristoph Böhmwalder int detach_parms_ntb_from_attrs(
1366*8098eeb6SChristoph Böhmwalder 			struct nlattr ***ret_nested_attribute_table,
1367*8098eeb6SChristoph Böhmwalder 			struct genl_info *info)
1368*8098eeb6SChristoph Böhmwalder {
1369*8098eeb6SChristoph Böhmwalder 	return __detach_parms_from_attrs(NULL, ret_nested_attribute_table, info);
1370*8098eeb6SChristoph Böhmwalder }
1371*8098eeb6SChristoph Böhmwalder 
1372*8098eeb6SChristoph Böhmwalder static int __resource_info_from_attrs(struct resource_info *s,
1373*8098eeb6SChristoph Böhmwalder 		struct nlattr ***ret_nested_attribute_table,
1374*8098eeb6SChristoph Böhmwalder 		struct genl_info *info)
1375*8098eeb6SChristoph Böhmwalder {
1376*8098eeb6SChristoph Böhmwalder 	const int maxtype = DRBD_A_RESOURCE_INFO_RES_SUSP_FEN;
1377*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = info->attrs[DRBD_NLA_RESOURCE_INFO];
1378*8098eeb6SChristoph Böhmwalder 	struct nlattr **ntb;
1379*8098eeb6SChristoph Böhmwalder 	struct nlattr *nla;
1380*8098eeb6SChristoph Böhmwalder 	int err = 0;
1381*8098eeb6SChristoph Böhmwalder 
1382*8098eeb6SChristoph Böhmwalder 	if (ret_nested_attribute_table)
1383*8098eeb6SChristoph Böhmwalder 		*ret_nested_attribute_table = NULL;
1384*8098eeb6SChristoph Böhmwalder 	if (!tla)
1385*8098eeb6SChristoph Böhmwalder 		return -ENOMSG;
1386*8098eeb6SChristoph Böhmwalder 	ntb = kcalloc(DRBD_A_RESOURCE_INFO_RES_SUSP_FEN + 1, sizeof(*ntb), GFP_KERNEL);
1387*8098eeb6SChristoph Böhmwalder 	if (!ntb)
1388*8098eeb6SChristoph Böhmwalder 		return -ENOMEM;
1389*8098eeb6SChristoph Böhmwalder 	err = nla_parse_nested_deprecated(ntb, maxtype, tla, drbd_resource_info_nl_policy, NULL);
1390*8098eeb6SChristoph Böhmwalder 	if (err)
1391*8098eeb6SChristoph Böhmwalder 		goto out;
1392*8098eeb6SChristoph Böhmwalder 
1393*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_RESOURCE_INFO_RES_ROLE];
1394*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1395*8098eeb6SChristoph Böhmwalder 		s->res_role = nla_get_u32(nla);
1396*8098eeb6SChristoph Böhmwalder 
1397*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_RESOURCE_INFO_RES_SUSP];
1398*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1399*8098eeb6SChristoph Böhmwalder 		s->res_susp = nla_get_u8(nla);
1400*8098eeb6SChristoph Böhmwalder 
1401*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_RESOURCE_INFO_RES_SUSP_NOD];
1402*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1403*8098eeb6SChristoph Böhmwalder 		s->res_susp_nod = nla_get_u8(nla);
1404*8098eeb6SChristoph Böhmwalder 
1405*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_RESOURCE_INFO_RES_SUSP_FEN];
1406*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1407*8098eeb6SChristoph Böhmwalder 		s->res_susp_fen = nla_get_u8(nla);
1408*8098eeb6SChristoph Böhmwalder 
1409*8098eeb6SChristoph Böhmwalder out:
1410*8098eeb6SChristoph Böhmwalder 	if (ret_nested_attribute_table && (!err || err == -ENOMSG))
1411*8098eeb6SChristoph Böhmwalder 		*ret_nested_attribute_table = ntb;
1412*8098eeb6SChristoph Böhmwalder 	else
1413*8098eeb6SChristoph Böhmwalder 		kfree(ntb);
1414*8098eeb6SChristoph Böhmwalder 	return err;
1415*8098eeb6SChristoph Böhmwalder }
1416*8098eeb6SChristoph Böhmwalder 
1417*8098eeb6SChristoph Böhmwalder int resource_info_from_attrs(struct resource_info *s,
1418*8098eeb6SChristoph Böhmwalder 				struct genl_info *info)
1419*8098eeb6SChristoph Böhmwalder {
1420*8098eeb6SChristoph Böhmwalder 	return __resource_info_from_attrs(s, NULL, info);
1421*8098eeb6SChristoph Böhmwalder }
1422*8098eeb6SChristoph Böhmwalder 
1423*8098eeb6SChristoph Böhmwalder int resource_info_ntb_from_attrs(
1424*8098eeb6SChristoph Böhmwalder 			struct nlattr ***ret_nested_attribute_table,
1425*8098eeb6SChristoph Böhmwalder 			struct genl_info *info)
1426*8098eeb6SChristoph Böhmwalder {
1427*8098eeb6SChristoph Böhmwalder 	return __resource_info_from_attrs(NULL, ret_nested_attribute_table, info);
1428*8098eeb6SChristoph Böhmwalder }
1429*8098eeb6SChristoph Böhmwalder 
1430*8098eeb6SChristoph Böhmwalder static int __device_info_from_attrs(struct device_info *s,
1431*8098eeb6SChristoph Böhmwalder 		struct nlattr ***ret_nested_attribute_table,
1432*8098eeb6SChristoph Böhmwalder 		struct genl_info *info)
1433*8098eeb6SChristoph Böhmwalder {
1434*8098eeb6SChristoph Böhmwalder 	const int maxtype = DRBD_A_DEVICE_INFO_DEV_DISK_STATE;
1435*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = info->attrs[DRBD_NLA_DEVICE_INFO];
1436*8098eeb6SChristoph Böhmwalder 	struct nlattr **ntb;
1437*8098eeb6SChristoph Böhmwalder 	struct nlattr *nla;
1438*8098eeb6SChristoph Böhmwalder 	int err = 0;
1439*8098eeb6SChristoph Böhmwalder 
1440*8098eeb6SChristoph Böhmwalder 	if (ret_nested_attribute_table)
1441*8098eeb6SChristoph Böhmwalder 		*ret_nested_attribute_table = NULL;
1442*8098eeb6SChristoph Böhmwalder 	if (!tla)
1443*8098eeb6SChristoph Böhmwalder 		return -ENOMSG;
1444*8098eeb6SChristoph Böhmwalder 	ntb = kcalloc(DRBD_A_DEVICE_INFO_DEV_DISK_STATE + 1, sizeof(*ntb), GFP_KERNEL);
1445*8098eeb6SChristoph Böhmwalder 	if (!ntb)
1446*8098eeb6SChristoph Böhmwalder 		return -ENOMEM;
1447*8098eeb6SChristoph Böhmwalder 	err = nla_parse_nested_deprecated(ntb, maxtype, tla, drbd_device_info_nl_policy, NULL);
1448*8098eeb6SChristoph Böhmwalder 	if (err)
1449*8098eeb6SChristoph Böhmwalder 		goto out;
1450*8098eeb6SChristoph Böhmwalder 
1451*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DEVICE_INFO_DEV_DISK_STATE];
1452*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1453*8098eeb6SChristoph Böhmwalder 		s->dev_disk_state = nla_get_u32(nla);
1454*8098eeb6SChristoph Böhmwalder 
1455*8098eeb6SChristoph Böhmwalder out:
1456*8098eeb6SChristoph Böhmwalder 	if (ret_nested_attribute_table && (!err || err == -ENOMSG))
1457*8098eeb6SChristoph Böhmwalder 		*ret_nested_attribute_table = ntb;
1458*8098eeb6SChristoph Böhmwalder 	else
1459*8098eeb6SChristoph Böhmwalder 		kfree(ntb);
1460*8098eeb6SChristoph Böhmwalder 	return err;
1461*8098eeb6SChristoph Böhmwalder }
1462*8098eeb6SChristoph Böhmwalder 
1463*8098eeb6SChristoph Böhmwalder int device_info_from_attrs(struct device_info *s,
1464*8098eeb6SChristoph Böhmwalder 				struct genl_info *info)
1465*8098eeb6SChristoph Böhmwalder {
1466*8098eeb6SChristoph Böhmwalder 	return __device_info_from_attrs(s, NULL, info);
1467*8098eeb6SChristoph Böhmwalder }
1468*8098eeb6SChristoph Böhmwalder 
1469*8098eeb6SChristoph Böhmwalder int device_info_ntb_from_attrs(
1470*8098eeb6SChristoph Böhmwalder 			struct nlattr ***ret_nested_attribute_table,
1471*8098eeb6SChristoph Böhmwalder 			struct genl_info *info)
1472*8098eeb6SChristoph Böhmwalder {
1473*8098eeb6SChristoph Böhmwalder 	return __device_info_from_attrs(NULL, ret_nested_attribute_table, info);
1474*8098eeb6SChristoph Böhmwalder }
1475*8098eeb6SChristoph Böhmwalder 
1476*8098eeb6SChristoph Böhmwalder static int __connection_info_from_attrs(struct connection_info *s,
1477*8098eeb6SChristoph Böhmwalder 		struct nlattr ***ret_nested_attribute_table,
1478*8098eeb6SChristoph Böhmwalder 		struct genl_info *info)
1479*8098eeb6SChristoph Böhmwalder {
1480*8098eeb6SChristoph Böhmwalder 	const int maxtype = DRBD_A_CONNECTION_INFO_CONN_ROLE;
1481*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = info->attrs[DRBD_NLA_CONNECTION_INFO];
1482*8098eeb6SChristoph Böhmwalder 	struct nlattr **ntb;
1483*8098eeb6SChristoph Böhmwalder 	struct nlattr *nla;
1484*8098eeb6SChristoph Böhmwalder 	int err = 0;
1485*8098eeb6SChristoph Böhmwalder 
1486*8098eeb6SChristoph Böhmwalder 	if (ret_nested_attribute_table)
1487*8098eeb6SChristoph Böhmwalder 		*ret_nested_attribute_table = NULL;
1488*8098eeb6SChristoph Böhmwalder 	if (!tla)
1489*8098eeb6SChristoph Böhmwalder 		return -ENOMSG;
1490*8098eeb6SChristoph Böhmwalder 	ntb = kcalloc(DRBD_A_CONNECTION_INFO_CONN_ROLE + 1, sizeof(*ntb), GFP_KERNEL);
1491*8098eeb6SChristoph Böhmwalder 	if (!ntb)
1492*8098eeb6SChristoph Böhmwalder 		return -ENOMEM;
1493*8098eeb6SChristoph Böhmwalder 	err = nla_parse_nested_deprecated(ntb, maxtype, tla, drbd_connection_info_nl_policy, NULL);
1494*8098eeb6SChristoph Böhmwalder 	if (err)
1495*8098eeb6SChristoph Böhmwalder 		goto out;
1496*8098eeb6SChristoph Böhmwalder 
1497*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_CONNECTION_INFO_CONN_CONNECTION_STATE];
1498*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1499*8098eeb6SChristoph Böhmwalder 		s->conn_connection_state = nla_get_u32(nla);
1500*8098eeb6SChristoph Böhmwalder 
1501*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_CONNECTION_INFO_CONN_ROLE];
1502*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1503*8098eeb6SChristoph Böhmwalder 		s->conn_role = nla_get_u32(nla);
1504*8098eeb6SChristoph Böhmwalder 
1505*8098eeb6SChristoph Böhmwalder out:
1506*8098eeb6SChristoph Böhmwalder 	if (ret_nested_attribute_table && (!err || err == -ENOMSG))
1507*8098eeb6SChristoph Böhmwalder 		*ret_nested_attribute_table = ntb;
1508*8098eeb6SChristoph Böhmwalder 	else
1509*8098eeb6SChristoph Böhmwalder 		kfree(ntb);
1510*8098eeb6SChristoph Böhmwalder 	return err;
1511*8098eeb6SChristoph Böhmwalder }
1512*8098eeb6SChristoph Böhmwalder 
1513*8098eeb6SChristoph Böhmwalder int connection_info_from_attrs(struct connection_info *s,
1514*8098eeb6SChristoph Böhmwalder 				struct genl_info *info)
1515*8098eeb6SChristoph Böhmwalder {
1516*8098eeb6SChristoph Böhmwalder 	return __connection_info_from_attrs(s, NULL, info);
1517*8098eeb6SChristoph Böhmwalder }
1518*8098eeb6SChristoph Böhmwalder 
1519*8098eeb6SChristoph Böhmwalder int connection_info_ntb_from_attrs(
1520*8098eeb6SChristoph Böhmwalder 			struct nlattr ***ret_nested_attribute_table,
1521*8098eeb6SChristoph Böhmwalder 			struct genl_info *info)
1522*8098eeb6SChristoph Böhmwalder {
1523*8098eeb6SChristoph Böhmwalder 	return __connection_info_from_attrs(NULL, ret_nested_attribute_table, info);
1524*8098eeb6SChristoph Böhmwalder }
1525*8098eeb6SChristoph Böhmwalder 
1526*8098eeb6SChristoph Böhmwalder static int __peer_device_info_from_attrs(struct peer_device_info *s,
1527*8098eeb6SChristoph Böhmwalder 		struct nlattr ***ret_nested_attribute_table,
1528*8098eeb6SChristoph Böhmwalder 		struct genl_info *info)
1529*8098eeb6SChristoph Böhmwalder {
1530*8098eeb6SChristoph Böhmwalder 	const int maxtype = DRBD_A_PEER_DEVICE_INFO_PEER_RESYNC_SUSP_DEPENDENCY;
1531*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = info->attrs[DRBD_NLA_PEER_DEVICE_INFO];
1532*8098eeb6SChristoph Böhmwalder 	struct nlattr **ntb;
1533*8098eeb6SChristoph Böhmwalder 	struct nlattr *nla;
1534*8098eeb6SChristoph Böhmwalder 	int err = 0;
1535*8098eeb6SChristoph Böhmwalder 
1536*8098eeb6SChristoph Böhmwalder 	if (ret_nested_attribute_table)
1537*8098eeb6SChristoph Böhmwalder 		*ret_nested_attribute_table = NULL;
1538*8098eeb6SChristoph Böhmwalder 	if (!tla)
1539*8098eeb6SChristoph Böhmwalder 		return -ENOMSG;
1540*8098eeb6SChristoph Böhmwalder 	ntb = kcalloc(DRBD_A_PEER_DEVICE_INFO_PEER_RESYNC_SUSP_DEPENDENCY + 1, sizeof(*ntb), GFP_KERNEL);
1541*8098eeb6SChristoph Böhmwalder 	if (!ntb)
1542*8098eeb6SChristoph Böhmwalder 		return -ENOMEM;
1543*8098eeb6SChristoph Böhmwalder 	err = nla_parse_nested_deprecated(ntb, maxtype, tla, drbd_peer_device_info_nl_policy, NULL);
1544*8098eeb6SChristoph Böhmwalder 	if (err)
1545*8098eeb6SChristoph Böhmwalder 		goto out;
1546*8098eeb6SChristoph Böhmwalder 
1547*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_PEER_DEVICE_INFO_PEER_REPL_STATE];
1548*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1549*8098eeb6SChristoph Böhmwalder 		s->peer_repl_state = nla_get_u32(nla);
1550*8098eeb6SChristoph Böhmwalder 
1551*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_PEER_DEVICE_INFO_PEER_DISK_STATE];
1552*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1553*8098eeb6SChristoph Böhmwalder 		s->peer_disk_state = nla_get_u32(nla);
1554*8098eeb6SChristoph Böhmwalder 
1555*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_PEER_DEVICE_INFO_PEER_RESYNC_SUSP_USER];
1556*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1557*8098eeb6SChristoph Böhmwalder 		s->peer_resync_susp_user = nla_get_u32(nla);
1558*8098eeb6SChristoph Böhmwalder 
1559*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_PEER_DEVICE_INFO_PEER_RESYNC_SUSP_PEER];
1560*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1561*8098eeb6SChristoph Böhmwalder 		s->peer_resync_susp_peer = nla_get_u32(nla);
1562*8098eeb6SChristoph Böhmwalder 
1563*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_PEER_DEVICE_INFO_PEER_RESYNC_SUSP_DEPENDENCY];
1564*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1565*8098eeb6SChristoph Böhmwalder 		s->peer_resync_susp_dependency = nla_get_u32(nla);
1566*8098eeb6SChristoph Böhmwalder 
1567*8098eeb6SChristoph Böhmwalder out:
1568*8098eeb6SChristoph Böhmwalder 	if (ret_nested_attribute_table && (!err || err == -ENOMSG))
1569*8098eeb6SChristoph Böhmwalder 		*ret_nested_attribute_table = ntb;
1570*8098eeb6SChristoph Böhmwalder 	else
1571*8098eeb6SChristoph Böhmwalder 		kfree(ntb);
1572*8098eeb6SChristoph Böhmwalder 	return err;
1573*8098eeb6SChristoph Böhmwalder }
1574*8098eeb6SChristoph Böhmwalder 
1575*8098eeb6SChristoph Böhmwalder int peer_device_info_from_attrs(struct peer_device_info *s,
1576*8098eeb6SChristoph Böhmwalder 				struct genl_info *info)
1577*8098eeb6SChristoph Böhmwalder {
1578*8098eeb6SChristoph Böhmwalder 	return __peer_device_info_from_attrs(s, NULL, info);
1579*8098eeb6SChristoph Böhmwalder }
1580*8098eeb6SChristoph Böhmwalder 
1581*8098eeb6SChristoph Böhmwalder int peer_device_info_ntb_from_attrs(
1582*8098eeb6SChristoph Böhmwalder 			struct nlattr ***ret_nested_attribute_table,
1583*8098eeb6SChristoph Böhmwalder 			struct genl_info *info)
1584*8098eeb6SChristoph Böhmwalder {
1585*8098eeb6SChristoph Böhmwalder 	return __peer_device_info_from_attrs(NULL, ret_nested_attribute_table, info);
1586*8098eeb6SChristoph Böhmwalder }
1587*8098eeb6SChristoph Böhmwalder 
1588*8098eeb6SChristoph Böhmwalder static int __resource_statistics_from_attrs(struct resource_statistics *s,
1589*8098eeb6SChristoph Böhmwalder 		struct nlattr ***ret_nested_attribute_table,
1590*8098eeb6SChristoph Böhmwalder 		struct genl_info *info)
1591*8098eeb6SChristoph Böhmwalder {
1592*8098eeb6SChristoph Böhmwalder 	const int maxtype = DRBD_A_RESOURCE_STATISTICS_RES_STAT_WRITE_ORDERING;
1593*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = info->attrs[DRBD_NLA_RESOURCE_STATISTICS];
1594*8098eeb6SChristoph Böhmwalder 	struct nlattr **ntb;
1595*8098eeb6SChristoph Böhmwalder 	struct nlattr *nla;
1596*8098eeb6SChristoph Böhmwalder 	int err = 0;
1597*8098eeb6SChristoph Böhmwalder 
1598*8098eeb6SChristoph Böhmwalder 	if (ret_nested_attribute_table)
1599*8098eeb6SChristoph Böhmwalder 		*ret_nested_attribute_table = NULL;
1600*8098eeb6SChristoph Böhmwalder 	if (!tla)
1601*8098eeb6SChristoph Böhmwalder 		return -ENOMSG;
1602*8098eeb6SChristoph Böhmwalder 	ntb = kcalloc(DRBD_A_RESOURCE_STATISTICS_RES_STAT_WRITE_ORDERING + 1, sizeof(*ntb), GFP_KERNEL);
1603*8098eeb6SChristoph Böhmwalder 	if (!ntb)
1604*8098eeb6SChristoph Böhmwalder 		return -ENOMEM;
1605*8098eeb6SChristoph Böhmwalder 	err = nla_parse_nested_deprecated(ntb, maxtype, tla, drbd_resource_statistics_nl_policy, NULL);
1606*8098eeb6SChristoph Böhmwalder 	if (err)
1607*8098eeb6SChristoph Böhmwalder 		goto out;
1608*8098eeb6SChristoph Böhmwalder 
1609*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_RESOURCE_STATISTICS_RES_STAT_WRITE_ORDERING];
1610*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1611*8098eeb6SChristoph Böhmwalder 		s->res_stat_write_ordering = nla_get_u32(nla);
1612*8098eeb6SChristoph Böhmwalder 
1613*8098eeb6SChristoph Böhmwalder out:
1614*8098eeb6SChristoph Böhmwalder 	if (ret_nested_attribute_table && (!err || err == -ENOMSG))
1615*8098eeb6SChristoph Böhmwalder 		*ret_nested_attribute_table = ntb;
1616*8098eeb6SChristoph Böhmwalder 	else
1617*8098eeb6SChristoph Böhmwalder 		kfree(ntb);
1618*8098eeb6SChristoph Böhmwalder 	return err;
1619*8098eeb6SChristoph Böhmwalder }
1620*8098eeb6SChristoph Böhmwalder 
1621*8098eeb6SChristoph Böhmwalder int resource_statistics_from_attrs(struct resource_statistics *s,
1622*8098eeb6SChristoph Böhmwalder 				struct genl_info *info)
1623*8098eeb6SChristoph Böhmwalder {
1624*8098eeb6SChristoph Böhmwalder 	return __resource_statistics_from_attrs(s, NULL, info);
1625*8098eeb6SChristoph Böhmwalder }
1626*8098eeb6SChristoph Böhmwalder 
1627*8098eeb6SChristoph Böhmwalder int resource_statistics_ntb_from_attrs(
1628*8098eeb6SChristoph Böhmwalder 			struct nlattr ***ret_nested_attribute_table,
1629*8098eeb6SChristoph Böhmwalder 			struct genl_info *info)
1630*8098eeb6SChristoph Böhmwalder {
1631*8098eeb6SChristoph Böhmwalder 	return __resource_statistics_from_attrs(NULL, ret_nested_attribute_table, info);
1632*8098eeb6SChristoph Böhmwalder }
1633*8098eeb6SChristoph Böhmwalder 
1634*8098eeb6SChristoph Böhmwalder static int __device_statistics_from_attrs(struct device_statistics *s,
1635*8098eeb6SChristoph Böhmwalder 		struct nlattr ***ret_nested_attribute_table,
1636*8098eeb6SChristoph Böhmwalder 		struct genl_info *info)
1637*8098eeb6SChristoph Böhmwalder {
1638*8098eeb6SChristoph Böhmwalder 	const int maxtype = DRBD_A_DEVICE_STATISTICS_HISTORY_UUIDS;
1639*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = info->attrs[DRBD_NLA_DEVICE_STATISTICS];
1640*8098eeb6SChristoph Böhmwalder 	struct nlattr **ntb;
1641*8098eeb6SChristoph Böhmwalder 	struct nlattr *nla;
1642*8098eeb6SChristoph Böhmwalder 	int err = 0;
1643*8098eeb6SChristoph Böhmwalder 
1644*8098eeb6SChristoph Böhmwalder 	if (ret_nested_attribute_table)
1645*8098eeb6SChristoph Böhmwalder 		*ret_nested_attribute_table = NULL;
1646*8098eeb6SChristoph Böhmwalder 	if (!tla)
1647*8098eeb6SChristoph Böhmwalder 		return -ENOMSG;
1648*8098eeb6SChristoph Böhmwalder 	ntb = kcalloc(DRBD_A_DEVICE_STATISTICS_HISTORY_UUIDS + 1, sizeof(*ntb), GFP_KERNEL);
1649*8098eeb6SChristoph Böhmwalder 	if (!ntb)
1650*8098eeb6SChristoph Böhmwalder 		return -ENOMEM;
1651*8098eeb6SChristoph Böhmwalder 	err = nla_parse_nested_deprecated(ntb, maxtype, tla, drbd_device_statistics_nl_policy, NULL);
1652*8098eeb6SChristoph Böhmwalder 	if (err)
1653*8098eeb6SChristoph Böhmwalder 		goto out;
1654*8098eeb6SChristoph Böhmwalder 
1655*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DEVICE_STATISTICS_DEV_SIZE];
1656*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1657*8098eeb6SChristoph Böhmwalder 		s->dev_size = nla_get_u64(nla);
1658*8098eeb6SChristoph Böhmwalder 
1659*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DEVICE_STATISTICS_DEV_READ];
1660*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1661*8098eeb6SChristoph Böhmwalder 		s->dev_read = nla_get_u64(nla);
1662*8098eeb6SChristoph Böhmwalder 
1663*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DEVICE_STATISTICS_DEV_WRITE];
1664*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1665*8098eeb6SChristoph Böhmwalder 		s->dev_write = nla_get_u64(nla);
1666*8098eeb6SChristoph Böhmwalder 
1667*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DEVICE_STATISTICS_DEV_AL_WRITES];
1668*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1669*8098eeb6SChristoph Böhmwalder 		s->dev_al_writes = nla_get_u64(nla);
1670*8098eeb6SChristoph Böhmwalder 
1671*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DEVICE_STATISTICS_DEV_BM_WRITES];
1672*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1673*8098eeb6SChristoph Böhmwalder 		s->dev_bm_writes = nla_get_u64(nla);
1674*8098eeb6SChristoph Böhmwalder 
1675*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DEVICE_STATISTICS_DEV_UPPER_PENDING];
1676*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1677*8098eeb6SChristoph Böhmwalder 		s->dev_upper_pending = nla_get_u32(nla);
1678*8098eeb6SChristoph Böhmwalder 
1679*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DEVICE_STATISTICS_DEV_LOWER_PENDING];
1680*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1681*8098eeb6SChristoph Böhmwalder 		s->dev_lower_pending = nla_get_u32(nla);
1682*8098eeb6SChristoph Böhmwalder 
1683*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DEVICE_STATISTICS_DEV_UPPER_BLOCKED];
1684*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1685*8098eeb6SChristoph Böhmwalder 		s->dev_upper_blocked = nla_get_u8(nla);
1686*8098eeb6SChristoph Böhmwalder 
1687*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DEVICE_STATISTICS_DEV_LOWER_BLOCKED];
1688*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1689*8098eeb6SChristoph Böhmwalder 		s->dev_lower_blocked = nla_get_u8(nla);
1690*8098eeb6SChristoph Böhmwalder 
1691*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DEVICE_STATISTICS_DEV_AL_SUSPENDED];
1692*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1693*8098eeb6SChristoph Böhmwalder 		s->dev_al_suspended = nla_get_u8(nla);
1694*8098eeb6SChristoph Böhmwalder 
1695*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DEVICE_STATISTICS_DEV_EXPOSED_DATA_UUID];
1696*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1697*8098eeb6SChristoph Böhmwalder 		s->dev_exposed_data_uuid = nla_get_u64(nla);
1698*8098eeb6SChristoph Böhmwalder 
1699*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DEVICE_STATISTICS_DEV_CURRENT_UUID];
1700*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1701*8098eeb6SChristoph Böhmwalder 		s->dev_current_uuid = nla_get_u64(nla);
1702*8098eeb6SChristoph Böhmwalder 
1703*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DEVICE_STATISTICS_DEV_DISK_FLAGS];
1704*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1705*8098eeb6SChristoph Böhmwalder 		s->dev_disk_flags = nla_get_u32(nla);
1706*8098eeb6SChristoph Böhmwalder 
1707*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_DEVICE_STATISTICS_HISTORY_UUIDS];
1708*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1709*8098eeb6SChristoph Böhmwalder 		s->history_uuids_len = nla_memcpy(s->history_uuids, nla, DRBD_NL_HISTORY_UUIDS_SIZE);
1710*8098eeb6SChristoph Böhmwalder 
1711*8098eeb6SChristoph Böhmwalder out:
1712*8098eeb6SChristoph Böhmwalder 	if (ret_nested_attribute_table && (!err || err == -ENOMSG))
1713*8098eeb6SChristoph Böhmwalder 		*ret_nested_attribute_table = ntb;
1714*8098eeb6SChristoph Böhmwalder 	else
1715*8098eeb6SChristoph Böhmwalder 		kfree(ntb);
1716*8098eeb6SChristoph Böhmwalder 	return err;
1717*8098eeb6SChristoph Böhmwalder }
1718*8098eeb6SChristoph Böhmwalder 
1719*8098eeb6SChristoph Böhmwalder int device_statistics_from_attrs(struct device_statistics *s,
1720*8098eeb6SChristoph Böhmwalder 				struct genl_info *info)
1721*8098eeb6SChristoph Böhmwalder {
1722*8098eeb6SChristoph Böhmwalder 	return __device_statistics_from_attrs(s, NULL, info);
1723*8098eeb6SChristoph Böhmwalder }
1724*8098eeb6SChristoph Böhmwalder 
1725*8098eeb6SChristoph Böhmwalder int device_statistics_ntb_from_attrs(
1726*8098eeb6SChristoph Böhmwalder 			struct nlattr ***ret_nested_attribute_table,
1727*8098eeb6SChristoph Böhmwalder 			struct genl_info *info)
1728*8098eeb6SChristoph Böhmwalder {
1729*8098eeb6SChristoph Böhmwalder 	return __device_statistics_from_attrs(NULL, ret_nested_attribute_table, info);
1730*8098eeb6SChristoph Böhmwalder }
1731*8098eeb6SChristoph Böhmwalder 
1732*8098eeb6SChristoph Böhmwalder static int __connection_statistics_from_attrs(struct connection_statistics *s,
1733*8098eeb6SChristoph Böhmwalder 		struct nlattr ***ret_nested_attribute_table,
1734*8098eeb6SChristoph Böhmwalder 		struct genl_info *info)
1735*8098eeb6SChristoph Böhmwalder {
1736*8098eeb6SChristoph Böhmwalder 	const int maxtype = DRBD_A_CONNECTION_STATISTICS_CONN_CONGESTED;
1737*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = info->attrs[DRBD_NLA_CONNECTION_STATISTICS];
1738*8098eeb6SChristoph Böhmwalder 	struct nlattr **ntb;
1739*8098eeb6SChristoph Böhmwalder 	struct nlattr *nla;
1740*8098eeb6SChristoph Böhmwalder 	int err = 0;
1741*8098eeb6SChristoph Böhmwalder 
1742*8098eeb6SChristoph Böhmwalder 	if (ret_nested_attribute_table)
1743*8098eeb6SChristoph Böhmwalder 		*ret_nested_attribute_table = NULL;
1744*8098eeb6SChristoph Böhmwalder 	if (!tla)
1745*8098eeb6SChristoph Böhmwalder 		return -ENOMSG;
1746*8098eeb6SChristoph Böhmwalder 	ntb = kcalloc(DRBD_A_CONNECTION_STATISTICS_CONN_CONGESTED + 1, sizeof(*ntb), GFP_KERNEL);
1747*8098eeb6SChristoph Böhmwalder 	if (!ntb)
1748*8098eeb6SChristoph Böhmwalder 		return -ENOMEM;
1749*8098eeb6SChristoph Böhmwalder 	err = nla_parse_nested_deprecated(ntb, maxtype, tla, drbd_connection_statistics_nl_policy, NULL);
1750*8098eeb6SChristoph Böhmwalder 	if (err)
1751*8098eeb6SChristoph Böhmwalder 		goto out;
1752*8098eeb6SChristoph Böhmwalder 
1753*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_CONNECTION_STATISTICS_CONN_CONGESTED];
1754*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1755*8098eeb6SChristoph Böhmwalder 		s->conn_congested = nla_get_u8(nla);
1756*8098eeb6SChristoph Böhmwalder 
1757*8098eeb6SChristoph Böhmwalder out:
1758*8098eeb6SChristoph Böhmwalder 	if (ret_nested_attribute_table && (!err || err == -ENOMSG))
1759*8098eeb6SChristoph Böhmwalder 		*ret_nested_attribute_table = ntb;
1760*8098eeb6SChristoph Böhmwalder 	else
1761*8098eeb6SChristoph Böhmwalder 		kfree(ntb);
1762*8098eeb6SChristoph Böhmwalder 	return err;
1763*8098eeb6SChristoph Böhmwalder }
1764*8098eeb6SChristoph Böhmwalder 
1765*8098eeb6SChristoph Böhmwalder int connection_statistics_from_attrs(struct connection_statistics *s,
1766*8098eeb6SChristoph Böhmwalder 				struct genl_info *info)
1767*8098eeb6SChristoph Böhmwalder {
1768*8098eeb6SChristoph Böhmwalder 	return __connection_statistics_from_attrs(s, NULL, info);
1769*8098eeb6SChristoph Böhmwalder }
1770*8098eeb6SChristoph Böhmwalder 
1771*8098eeb6SChristoph Böhmwalder int connection_statistics_ntb_from_attrs(
1772*8098eeb6SChristoph Böhmwalder 			struct nlattr ***ret_nested_attribute_table,
1773*8098eeb6SChristoph Böhmwalder 			struct genl_info *info)
1774*8098eeb6SChristoph Böhmwalder {
1775*8098eeb6SChristoph Böhmwalder 	return __connection_statistics_from_attrs(NULL, ret_nested_attribute_table, info);
1776*8098eeb6SChristoph Böhmwalder }
1777*8098eeb6SChristoph Böhmwalder 
1778*8098eeb6SChristoph Böhmwalder static int __peer_device_statistics_from_attrs(struct peer_device_statistics *s,
1779*8098eeb6SChristoph Böhmwalder 		struct nlattr ***ret_nested_attribute_table,
1780*8098eeb6SChristoph Böhmwalder 		struct genl_info *info)
1781*8098eeb6SChristoph Böhmwalder {
1782*8098eeb6SChristoph Böhmwalder 	const int maxtype = DRBD_A_PEER_DEVICE_STATISTICS_PEER_DEV_FLAGS;
1783*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = info->attrs[DRBD_NLA_PEER_DEVICE_STATISTICS];
1784*8098eeb6SChristoph Böhmwalder 	struct nlattr **ntb;
1785*8098eeb6SChristoph Böhmwalder 	struct nlattr *nla;
1786*8098eeb6SChristoph Böhmwalder 	int err = 0;
1787*8098eeb6SChristoph Böhmwalder 
1788*8098eeb6SChristoph Böhmwalder 	if (ret_nested_attribute_table)
1789*8098eeb6SChristoph Böhmwalder 		*ret_nested_attribute_table = NULL;
1790*8098eeb6SChristoph Böhmwalder 	if (!tla)
1791*8098eeb6SChristoph Böhmwalder 		return -ENOMSG;
1792*8098eeb6SChristoph Böhmwalder 	ntb = kcalloc(DRBD_A_PEER_DEVICE_STATISTICS_PEER_DEV_FLAGS + 1, sizeof(*ntb), GFP_KERNEL);
1793*8098eeb6SChristoph Böhmwalder 	if (!ntb)
1794*8098eeb6SChristoph Böhmwalder 		return -ENOMEM;
1795*8098eeb6SChristoph Böhmwalder 	err = nla_parse_nested_deprecated(ntb, maxtype, tla, drbd_peer_device_statistics_nl_policy, NULL);
1796*8098eeb6SChristoph Böhmwalder 	if (err)
1797*8098eeb6SChristoph Böhmwalder 		goto out;
1798*8098eeb6SChristoph Böhmwalder 
1799*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_PEER_DEVICE_STATISTICS_PEER_DEV_RECEIVED];
1800*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1801*8098eeb6SChristoph Böhmwalder 		s->peer_dev_received = nla_get_u64(nla);
1802*8098eeb6SChristoph Böhmwalder 
1803*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_PEER_DEVICE_STATISTICS_PEER_DEV_SENT];
1804*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1805*8098eeb6SChristoph Böhmwalder 		s->peer_dev_sent = nla_get_u64(nla);
1806*8098eeb6SChristoph Böhmwalder 
1807*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_PEER_DEVICE_STATISTICS_PEER_DEV_PENDING];
1808*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1809*8098eeb6SChristoph Böhmwalder 		s->peer_dev_pending = nla_get_u32(nla);
1810*8098eeb6SChristoph Böhmwalder 
1811*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_PEER_DEVICE_STATISTICS_PEER_DEV_UNACKED];
1812*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1813*8098eeb6SChristoph Böhmwalder 		s->peer_dev_unacked = nla_get_u32(nla);
1814*8098eeb6SChristoph Böhmwalder 
1815*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_PEER_DEVICE_STATISTICS_PEER_DEV_OUT_OF_SYNC];
1816*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1817*8098eeb6SChristoph Böhmwalder 		s->peer_dev_out_of_sync = nla_get_u64(nla);
1818*8098eeb6SChristoph Böhmwalder 
1819*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_PEER_DEVICE_STATISTICS_PEER_DEV_RESYNC_FAILED];
1820*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1821*8098eeb6SChristoph Böhmwalder 		s->peer_dev_resync_failed = nla_get_u64(nla);
1822*8098eeb6SChristoph Böhmwalder 
1823*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_PEER_DEVICE_STATISTICS_PEER_DEV_BITMAP_UUID];
1824*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1825*8098eeb6SChristoph Böhmwalder 		s->peer_dev_bitmap_uuid = nla_get_u64(nla);
1826*8098eeb6SChristoph Böhmwalder 
1827*8098eeb6SChristoph Böhmwalder 	nla = ntb[DRBD_A_PEER_DEVICE_STATISTICS_PEER_DEV_FLAGS];
1828*8098eeb6SChristoph Böhmwalder 	if (nla && s)
1829*8098eeb6SChristoph Böhmwalder 		s->peer_dev_flags = nla_get_u32(nla);
1830*8098eeb6SChristoph Böhmwalder 
1831*8098eeb6SChristoph Böhmwalder out:
1832*8098eeb6SChristoph Böhmwalder 	if (ret_nested_attribute_table && (!err || err == -ENOMSG))
1833*8098eeb6SChristoph Böhmwalder 		*ret_nested_attribute_table = ntb;
1834*8098eeb6SChristoph Böhmwalder 	else
1835*8098eeb6SChristoph Böhmwalder 		kfree(ntb);
1836*8098eeb6SChristoph Böhmwalder 	return err;
1837*8098eeb6SChristoph Böhmwalder }
1838*8098eeb6SChristoph Böhmwalder 
1839*8098eeb6SChristoph Böhmwalder int peer_device_statistics_from_attrs(struct peer_device_statistics *s,
1840*8098eeb6SChristoph Böhmwalder 				struct genl_info *info)
1841*8098eeb6SChristoph Böhmwalder {
1842*8098eeb6SChristoph Böhmwalder 	return __peer_device_statistics_from_attrs(s, NULL, info);
1843*8098eeb6SChristoph Böhmwalder }
1844*8098eeb6SChristoph Böhmwalder 
1845*8098eeb6SChristoph Böhmwalder int peer_device_statistics_ntb_from_attrs(
1846*8098eeb6SChristoph Böhmwalder 			struct nlattr ***ret_nested_attribute_table,
1847*8098eeb6SChristoph Böhmwalder 			struct genl_info *info)
1848*8098eeb6SChristoph Böhmwalder {
1849*8098eeb6SChristoph Böhmwalder 	return __peer_device_statistics_from_attrs(NULL, ret_nested_attribute_table, info);
1850*8098eeb6SChristoph Böhmwalder }
1851*8098eeb6SChristoph Böhmwalder 
1852*8098eeb6SChristoph Böhmwalder int drbd_cfg_reply_to_skb(struct sk_buff *skb, struct drbd_cfg_reply *s)
1853*8098eeb6SChristoph Böhmwalder {
1854*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = nla_nest_start(skb, DRBD_NLA_CFG_REPLY);
1855*8098eeb6SChristoph Böhmwalder 
1856*8098eeb6SChristoph Böhmwalder 	if (!tla)
1857*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
1858*8098eeb6SChristoph Böhmwalder 
1859*8098eeb6SChristoph Böhmwalder 	if (nla_put(skb, DRBD_A_DRBD_CFG_REPLY_INFO_TEXT, min_t(int, 0,
1860*8098eeb6SChristoph Böhmwalder 			s->info_text_len + (s->info_text_len < 0)), s->info_text))
1861*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
1862*8098eeb6SChristoph Böhmwalder 
1863*8098eeb6SChristoph Böhmwalder 	nla_nest_end(skb, tla);
1864*8098eeb6SChristoph Böhmwalder 	return 0;
1865*8098eeb6SChristoph Böhmwalder 
1866*8098eeb6SChristoph Böhmwalder nla_put_failure:
1867*8098eeb6SChristoph Böhmwalder 	if (tla)
1868*8098eeb6SChristoph Böhmwalder 		nla_nest_cancel(skb, tla);
1869*8098eeb6SChristoph Böhmwalder 	return -EMSGSIZE;
1870*8098eeb6SChristoph Böhmwalder }
1871*8098eeb6SChristoph Böhmwalder 
1872*8098eeb6SChristoph Böhmwalder int drbd_cfg_context_to_skb(struct sk_buff *skb, struct drbd_cfg_context *s)
1873*8098eeb6SChristoph Böhmwalder {
1874*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = nla_nest_start(skb, DRBD_NLA_CFG_CONTEXT);
1875*8098eeb6SChristoph Böhmwalder 
1876*8098eeb6SChristoph Böhmwalder 	if (!tla)
1877*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
1878*8098eeb6SChristoph Böhmwalder 
1879*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_DRBD_CFG_CONTEXT_CTX_VOLUME, s->ctx_volume))
1880*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
1881*8098eeb6SChristoph Böhmwalder 	if (nla_put(skb, DRBD_A_DRBD_CFG_CONTEXT_CTX_RESOURCE_NAME, min_t(int, 128,
1882*8098eeb6SChristoph Böhmwalder 			s->ctx_resource_name_len + (s->ctx_resource_name_len < 128)), s->ctx_resource_name))
1883*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
1884*8098eeb6SChristoph Böhmwalder 	if (nla_put(skb, DRBD_A_DRBD_CFG_CONTEXT_CTX_MY_ADDR, min_t(int, 128,
1885*8098eeb6SChristoph Böhmwalder 			s->ctx_my_addr_len), s->ctx_my_addr))
1886*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
1887*8098eeb6SChristoph Böhmwalder 	if (nla_put(skb, DRBD_A_DRBD_CFG_CONTEXT_CTX_PEER_ADDR, min_t(int, 128,
1888*8098eeb6SChristoph Böhmwalder 			s->ctx_peer_addr_len), s->ctx_peer_addr))
1889*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
1890*8098eeb6SChristoph Böhmwalder 
1891*8098eeb6SChristoph Böhmwalder 	nla_nest_end(skb, tla);
1892*8098eeb6SChristoph Böhmwalder 	return 0;
1893*8098eeb6SChristoph Böhmwalder 
1894*8098eeb6SChristoph Böhmwalder nla_put_failure:
1895*8098eeb6SChristoph Böhmwalder 	if (tla)
1896*8098eeb6SChristoph Böhmwalder 		nla_nest_cancel(skb, tla);
1897*8098eeb6SChristoph Böhmwalder 	return -EMSGSIZE;
1898*8098eeb6SChristoph Böhmwalder }
1899*8098eeb6SChristoph Böhmwalder 
1900*8098eeb6SChristoph Böhmwalder int disk_conf_to_skb(struct sk_buff *skb, struct disk_conf *s)
1901*8098eeb6SChristoph Böhmwalder {
1902*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = nla_nest_start(skb, DRBD_NLA_DISK_CONF);
1903*8098eeb6SChristoph Böhmwalder 
1904*8098eeb6SChristoph Böhmwalder 	if (!tla)
1905*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
1906*8098eeb6SChristoph Böhmwalder 
1907*8098eeb6SChristoph Böhmwalder 	if (nla_put(skb, DRBD_A_DISK_CONF_BACKING_DEV, min_t(int, 128,
1908*8098eeb6SChristoph Böhmwalder 			s->backing_dev_len + (s->backing_dev_len < 128)), s->backing_dev))
1909*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
1910*8098eeb6SChristoph Böhmwalder 	if (nla_put(skb, DRBD_A_DISK_CONF_META_DEV, min_t(int, 128,
1911*8098eeb6SChristoph Böhmwalder 			s->meta_dev_len + (s->meta_dev_len < 128)), s->meta_dev))
1912*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
1913*8098eeb6SChristoph Böhmwalder 	if (nla_put_s32(skb, DRBD_A_DISK_CONF_META_DEV_IDX, s->meta_dev_idx))
1914*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
1915*8098eeb6SChristoph Böhmwalder 	if (nla_put_u64_64bit(skb, DRBD_A_DISK_CONF_DISK_SIZE, s->disk_size, 0))
1916*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
1917*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_DISK_CONF_MAX_BIO_BVECS, s->max_bio_bvecs))
1918*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
1919*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_DISK_CONF_ON_IO_ERROR, s->on_io_error))
1920*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
1921*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_DISK_CONF_FENCING, s->fencing))
1922*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
1923*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_DISK_CONF_RESYNC_RATE, s->resync_rate))
1924*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
1925*8098eeb6SChristoph Böhmwalder 	if (nla_put_s32(skb, DRBD_A_DISK_CONF_RESYNC_AFTER, s->resync_after))
1926*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
1927*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_DISK_CONF_AL_EXTENTS, s->al_extents))
1928*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
1929*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_DISK_CONF_C_PLAN_AHEAD, s->c_plan_ahead))
1930*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
1931*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_DISK_CONF_C_DELAY_TARGET, s->c_delay_target))
1932*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
1933*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_DISK_CONF_C_FILL_TARGET, s->c_fill_target))
1934*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
1935*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_DISK_CONF_C_MAX_RATE, s->c_max_rate))
1936*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
1937*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_DISK_CONF_C_MIN_RATE, s->c_min_rate))
1938*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
1939*8098eeb6SChristoph Böhmwalder 	if (nla_put_u8(skb, DRBD_A_DISK_CONF_DISK_BARRIER, s->disk_barrier))
1940*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
1941*8098eeb6SChristoph Böhmwalder 	if (nla_put_u8(skb, DRBD_A_DISK_CONF_DISK_FLUSHES, s->disk_flushes))
1942*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
1943*8098eeb6SChristoph Böhmwalder 	if (nla_put_u8(skb, DRBD_A_DISK_CONF_DISK_DRAIN, s->disk_drain))
1944*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
1945*8098eeb6SChristoph Böhmwalder 	if (nla_put_u8(skb, DRBD_A_DISK_CONF_MD_FLUSHES, s->md_flushes))
1946*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
1947*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_DISK_CONF_DISK_TIMEOUT, s->disk_timeout))
1948*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
1949*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_DISK_CONF_READ_BALANCING, s->read_balancing))
1950*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
1951*8098eeb6SChristoph Böhmwalder 	if (nla_put_u8(skb, DRBD_A_DISK_CONF_AL_UPDATES, s->al_updates))
1952*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
1953*8098eeb6SChristoph Böhmwalder 	if (nla_put_u8(skb, DRBD_A_DISK_CONF_DISCARD_ZEROES_IF_ALIGNED, s->discard_zeroes_if_aligned))
1954*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
1955*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_DISK_CONF_RS_DISCARD_GRANULARITY, s->rs_discard_granularity))
1956*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
1957*8098eeb6SChristoph Böhmwalder 	if (nla_put_u8(skb, DRBD_A_DISK_CONF_DISABLE_WRITE_SAME, s->disable_write_same))
1958*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
1959*8098eeb6SChristoph Böhmwalder 
1960*8098eeb6SChristoph Böhmwalder 	nla_nest_end(skb, tla);
1961*8098eeb6SChristoph Böhmwalder 	return 0;
1962*8098eeb6SChristoph Böhmwalder 
1963*8098eeb6SChristoph Böhmwalder nla_put_failure:
1964*8098eeb6SChristoph Böhmwalder 	if (tla)
1965*8098eeb6SChristoph Böhmwalder 		nla_nest_cancel(skb, tla);
1966*8098eeb6SChristoph Böhmwalder 	return -EMSGSIZE;
1967*8098eeb6SChristoph Böhmwalder }
1968*8098eeb6SChristoph Böhmwalder 
1969*8098eeb6SChristoph Böhmwalder int res_opts_to_skb(struct sk_buff *skb, struct res_opts *s)
1970*8098eeb6SChristoph Böhmwalder {
1971*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = nla_nest_start(skb, DRBD_NLA_RESOURCE_OPTS);
1972*8098eeb6SChristoph Böhmwalder 
1973*8098eeb6SChristoph Böhmwalder 	if (!tla)
1974*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
1975*8098eeb6SChristoph Böhmwalder 
1976*8098eeb6SChristoph Böhmwalder 	if (nla_put(skb, DRBD_A_RES_OPTS_CPU_MASK, min_t(int, DRBD_CPU_MASK_SIZE,
1977*8098eeb6SChristoph Böhmwalder 			s->cpu_mask_len + (s->cpu_mask_len < DRBD_CPU_MASK_SIZE)), s->cpu_mask))
1978*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
1979*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_RES_OPTS_ON_NO_DATA, s->on_no_data))
1980*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
1981*8098eeb6SChristoph Böhmwalder 
1982*8098eeb6SChristoph Böhmwalder 	nla_nest_end(skb, tla);
1983*8098eeb6SChristoph Böhmwalder 	return 0;
1984*8098eeb6SChristoph Böhmwalder 
1985*8098eeb6SChristoph Böhmwalder nla_put_failure:
1986*8098eeb6SChristoph Böhmwalder 	if (tla)
1987*8098eeb6SChristoph Böhmwalder 		nla_nest_cancel(skb, tla);
1988*8098eeb6SChristoph Böhmwalder 	return -EMSGSIZE;
1989*8098eeb6SChristoph Böhmwalder }
1990*8098eeb6SChristoph Böhmwalder 
1991*8098eeb6SChristoph Böhmwalder int net_conf_to_skb(struct sk_buff *skb, struct net_conf *s)
1992*8098eeb6SChristoph Böhmwalder {
1993*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = nla_nest_start(skb, DRBD_NLA_NET_CONF);
1994*8098eeb6SChristoph Böhmwalder 
1995*8098eeb6SChristoph Böhmwalder 	if (!tla)
1996*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
1997*8098eeb6SChristoph Böhmwalder 
1998*8098eeb6SChristoph Böhmwalder 	if (nla_put(skb, DRBD_A_NET_CONF_SHARED_SECRET, min_t(int, SHARED_SECRET_MAX,
1999*8098eeb6SChristoph Böhmwalder 			s->shared_secret_len + (s->shared_secret_len < SHARED_SECRET_MAX)), s->shared_secret))
2000*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2001*8098eeb6SChristoph Böhmwalder 	if (nla_put(skb, DRBD_A_NET_CONF_CRAM_HMAC_ALG, min_t(int, SHARED_SECRET_MAX,
2002*8098eeb6SChristoph Böhmwalder 			s->cram_hmac_alg_len + (s->cram_hmac_alg_len < SHARED_SECRET_MAX)), s->cram_hmac_alg))
2003*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2004*8098eeb6SChristoph Böhmwalder 	if (nla_put(skb, DRBD_A_NET_CONF_INTEGRITY_ALG, min_t(int, SHARED_SECRET_MAX,
2005*8098eeb6SChristoph Böhmwalder 			s->integrity_alg_len + (s->integrity_alg_len < SHARED_SECRET_MAX)), s->integrity_alg))
2006*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2007*8098eeb6SChristoph Böhmwalder 	if (nla_put(skb, DRBD_A_NET_CONF_VERIFY_ALG, min_t(int, SHARED_SECRET_MAX,
2008*8098eeb6SChristoph Böhmwalder 			s->verify_alg_len + (s->verify_alg_len < SHARED_SECRET_MAX)), s->verify_alg))
2009*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2010*8098eeb6SChristoph Böhmwalder 	if (nla_put(skb, DRBD_A_NET_CONF_CSUMS_ALG, min_t(int, SHARED_SECRET_MAX,
2011*8098eeb6SChristoph Böhmwalder 			s->csums_alg_len + (s->csums_alg_len < SHARED_SECRET_MAX)), s->csums_alg))
2012*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2013*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_NET_CONF_WIRE_PROTOCOL, s->wire_protocol))
2014*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2015*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_NET_CONF_CONNECT_INT, s->connect_int))
2016*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2017*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_NET_CONF_TIMEOUT, s->timeout))
2018*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2019*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_NET_CONF_PING_INT, s->ping_int))
2020*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2021*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_NET_CONF_PING_TIMEO, s->ping_timeo))
2022*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2023*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_NET_CONF_SNDBUF_SIZE, s->sndbuf_size))
2024*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2025*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_NET_CONF_RCVBUF_SIZE, s->rcvbuf_size))
2026*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2027*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_NET_CONF_KO_COUNT, s->ko_count))
2028*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2029*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_NET_CONF_MAX_BUFFERS, s->max_buffers))
2030*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2031*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_NET_CONF_MAX_EPOCH_SIZE, s->max_epoch_size))
2032*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2033*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_NET_CONF_UNPLUG_WATERMARK, s->unplug_watermark))
2034*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2035*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_NET_CONF_AFTER_SB_0P, s->after_sb_0p))
2036*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2037*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_NET_CONF_AFTER_SB_1P, s->after_sb_1p))
2038*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2039*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_NET_CONF_AFTER_SB_2P, s->after_sb_2p))
2040*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2041*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_NET_CONF_RR_CONFLICT, s->rr_conflict))
2042*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2043*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_NET_CONF_ON_CONGESTION, s->on_congestion))
2044*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2045*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_NET_CONF_CONG_FILL, s->cong_fill))
2046*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2047*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_NET_CONF_CONG_EXTENTS, s->cong_extents))
2048*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2049*8098eeb6SChristoph Böhmwalder 	if (nla_put_u8(skb, DRBD_A_NET_CONF_TWO_PRIMARIES, s->two_primaries))
2050*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2051*8098eeb6SChristoph Böhmwalder 	if (nla_put_u8(skb, DRBD_A_NET_CONF_DISCARD_MY_DATA, s->discard_my_data))
2052*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2053*8098eeb6SChristoph Böhmwalder 	if (nla_put_u8(skb, DRBD_A_NET_CONF_TCP_CORK, s->tcp_cork))
2054*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2055*8098eeb6SChristoph Böhmwalder 	if (nla_put_u8(skb, DRBD_A_NET_CONF_ALWAYS_ASBP, s->always_asbp))
2056*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2057*8098eeb6SChristoph Böhmwalder 	if (nla_put_u8(skb, DRBD_A_NET_CONF_TENTATIVE, s->tentative))
2058*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2059*8098eeb6SChristoph Böhmwalder 	if (nla_put_u8(skb, DRBD_A_NET_CONF_USE_RLE, s->use_rle))
2060*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2061*8098eeb6SChristoph Böhmwalder 	if (nla_put_u8(skb, DRBD_A_NET_CONF_CSUMS_AFTER_CRASH_ONLY, s->csums_after_crash_only))
2062*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2063*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_NET_CONF_SOCK_CHECK_TIMEO, s->sock_check_timeo))
2064*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2065*8098eeb6SChristoph Böhmwalder 
2066*8098eeb6SChristoph Böhmwalder 	nla_nest_end(skb, tla);
2067*8098eeb6SChristoph Böhmwalder 	return 0;
2068*8098eeb6SChristoph Böhmwalder 
2069*8098eeb6SChristoph Böhmwalder nla_put_failure:
2070*8098eeb6SChristoph Böhmwalder 	if (tla)
2071*8098eeb6SChristoph Böhmwalder 		nla_nest_cancel(skb, tla);
2072*8098eeb6SChristoph Böhmwalder 	return -EMSGSIZE;
2073*8098eeb6SChristoph Böhmwalder }
2074*8098eeb6SChristoph Böhmwalder 
2075*8098eeb6SChristoph Böhmwalder int set_role_parms_to_skb(struct sk_buff *skb, struct set_role_parms *s)
2076*8098eeb6SChristoph Böhmwalder {
2077*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = nla_nest_start(skb, DRBD_NLA_SET_ROLE_PARMS);
2078*8098eeb6SChristoph Böhmwalder 
2079*8098eeb6SChristoph Böhmwalder 	if (!tla)
2080*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2081*8098eeb6SChristoph Böhmwalder 
2082*8098eeb6SChristoph Böhmwalder 	if (nla_put_u8(skb, DRBD_A_SET_ROLE_PARMS_ASSUME_UPTODATE, s->assume_uptodate))
2083*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2084*8098eeb6SChristoph Böhmwalder 
2085*8098eeb6SChristoph Böhmwalder 	nla_nest_end(skb, tla);
2086*8098eeb6SChristoph Böhmwalder 	return 0;
2087*8098eeb6SChristoph Böhmwalder 
2088*8098eeb6SChristoph Böhmwalder nla_put_failure:
2089*8098eeb6SChristoph Böhmwalder 	if (tla)
2090*8098eeb6SChristoph Böhmwalder 		nla_nest_cancel(skb, tla);
2091*8098eeb6SChristoph Böhmwalder 	return -EMSGSIZE;
2092*8098eeb6SChristoph Böhmwalder }
2093*8098eeb6SChristoph Böhmwalder 
2094*8098eeb6SChristoph Böhmwalder int resize_parms_to_skb(struct sk_buff *skb, struct resize_parms *s)
2095*8098eeb6SChristoph Böhmwalder {
2096*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = nla_nest_start(skb, DRBD_NLA_RESIZE_PARMS);
2097*8098eeb6SChristoph Böhmwalder 
2098*8098eeb6SChristoph Böhmwalder 	if (!tla)
2099*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2100*8098eeb6SChristoph Böhmwalder 
2101*8098eeb6SChristoph Böhmwalder 	if (nla_put_u64_64bit(skb, DRBD_A_RESIZE_PARMS_RESIZE_SIZE, s->resize_size, 0))
2102*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2103*8098eeb6SChristoph Böhmwalder 	if (nla_put_u8(skb, DRBD_A_RESIZE_PARMS_RESIZE_FORCE, s->resize_force))
2104*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2105*8098eeb6SChristoph Böhmwalder 	if (nla_put_u8(skb, DRBD_A_RESIZE_PARMS_NO_RESYNC, s->no_resync))
2106*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2107*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_RESIZE_PARMS_AL_STRIPES, s->al_stripes))
2108*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2109*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_RESIZE_PARMS_AL_STRIPE_SIZE, s->al_stripe_size))
2110*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2111*8098eeb6SChristoph Böhmwalder 
2112*8098eeb6SChristoph Böhmwalder 	nla_nest_end(skb, tla);
2113*8098eeb6SChristoph Böhmwalder 	return 0;
2114*8098eeb6SChristoph Böhmwalder 
2115*8098eeb6SChristoph Böhmwalder nla_put_failure:
2116*8098eeb6SChristoph Böhmwalder 	if (tla)
2117*8098eeb6SChristoph Böhmwalder 		nla_nest_cancel(skb, tla);
2118*8098eeb6SChristoph Böhmwalder 	return -EMSGSIZE;
2119*8098eeb6SChristoph Böhmwalder }
2120*8098eeb6SChristoph Böhmwalder 
2121*8098eeb6SChristoph Böhmwalder int state_info_to_skb(struct sk_buff *skb, struct state_info *s)
2122*8098eeb6SChristoph Böhmwalder {
2123*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = nla_nest_start(skb, DRBD_NLA_STATE_INFO);
2124*8098eeb6SChristoph Böhmwalder 
2125*8098eeb6SChristoph Böhmwalder 	if (!tla)
2126*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2127*8098eeb6SChristoph Böhmwalder 
2128*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_STATE_INFO_SIB_REASON, s->sib_reason))
2129*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2130*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_STATE_INFO_CURRENT_STATE, s->current_state))
2131*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2132*8098eeb6SChristoph Böhmwalder 	if (nla_put_u64_64bit(skb, DRBD_A_STATE_INFO_CAPACITY, s->capacity, 0))
2133*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2134*8098eeb6SChristoph Böhmwalder 	if (nla_put_u64_64bit(skb, DRBD_A_STATE_INFO_ED_UUID, s->ed_uuid, 0))
2135*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2136*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_STATE_INFO_PREV_STATE, s->prev_state))
2137*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2138*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_STATE_INFO_NEW_STATE, s->new_state))
2139*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2140*8098eeb6SChristoph Böhmwalder 	if (nla_put(skb, DRBD_A_STATE_INFO_UUIDS, min_t(int, DRBD_NL_UUIDS_SIZE,
2141*8098eeb6SChristoph Böhmwalder 			s->uuids_len), s->uuids))
2142*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2143*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_STATE_INFO_DISK_FLAGS, s->disk_flags))
2144*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2145*8098eeb6SChristoph Böhmwalder 	if (nla_put_u64_64bit(skb, DRBD_A_STATE_INFO_BITS_TOTAL, s->bits_total, 0))
2146*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2147*8098eeb6SChristoph Böhmwalder 	if (nla_put_u64_64bit(skb, DRBD_A_STATE_INFO_BITS_OOS, s->bits_oos, 0))
2148*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2149*8098eeb6SChristoph Böhmwalder 	if (nla_put_u64_64bit(skb, DRBD_A_STATE_INFO_BITS_RS_TOTAL, s->bits_rs_total, 0))
2150*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2151*8098eeb6SChristoph Böhmwalder 	if (nla_put_u64_64bit(skb, DRBD_A_STATE_INFO_BITS_RS_FAILED, s->bits_rs_failed, 0))
2152*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2153*8098eeb6SChristoph Böhmwalder 	if (nla_put(skb, DRBD_A_STATE_INFO_HELPER, min_t(int, 32,
2154*8098eeb6SChristoph Böhmwalder 			s->helper_len + (s->helper_len < 32)), s->helper))
2155*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2156*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_STATE_INFO_HELPER_EXIT_CODE, s->helper_exit_code))
2157*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2158*8098eeb6SChristoph Böhmwalder 	if (nla_put_u64_64bit(skb, DRBD_A_STATE_INFO_SEND_CNT, s->send_cnt, 0))
2159*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2160*8098eeb6SChristoph Böhmwalder 	if (nla_put_u64_64bit(skb, DRBD_A_STATE_INFO_RECV_CNT, s->recv_cnt, 0))
2161*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2162*8098eeb6SChristoph Böhmwalder 	if (nla_put_u64_64bit(skb, DRBD_A_STATE_INFO_READ_CNT, s->read_cnt, 0))
2163*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2164*8098eeb6SChristoph Böhmwalder 	if (nla_put_u64_64bit(skb, DRBD_A_STATE_INFO_WRIT_CNT, s->writ_cnt, 0))
2165*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2166*8098eeb6SChristoph Böhmwalder 	if (nla_put_u64_64bit(skb, DRBD_A_STATE_INFO_AL_WRIT_CNT, s->al_writ_cnt, 0))
2167*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2168*8098eeb6SChristoph Böhmwalder 	if (nla_put_u64_64bit(skb, DRBD_A_STATE_INFO_BM_WRIT_CNT, s->bm_writ_cnt, 0))
2169*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2170*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_STATE_INFO_AP_BIO_CNT, s->ap_bio_cnt))
2171*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2172*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_STATE_INFO_AP_PENDING_CNT, s->ap_pending_cnt))
2173*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2174*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_STATE_INFO_RS_PENDING_CNT, s->rs_pending_cnt))
2175*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2176*8098eeb6SChristoph Böhmwalder 
2177*8098eeb6SChristoph Böhmwalder 	nla_nest_end(skb, tla);
2178*8098eeb6SChristoph Böhmwalder 	return 0;
2179*8098eeb6SChristoph Böhmwalder 
2180*8098eeb6SChristoph Böhmwalder nla_put_failure:
2181*8098eeb6SChristoph Böhmwalder 	if (tla)
2182*8098eeb6SChristoph Böhmwalder 		nla_nest_cancel(skb, tla);
2183*8098eeb6SChristoph Böhmwalder 	return -EMSGSIZE;
2184*8098eeb6SChristoph Böhmwalder }
2185*8098eeb6SChristoph Böhmwalder 
2186*8098eeb6SChristoph Böhmwalder int start_ov_parms_to_skb(struct sk_buff *skb, struct start_ov_parms *s)
2187*8098eeb6SChristoph Böhmwalder {
2188*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = nla_nest_start(skb, DRBD_NLA_START_OV_PARMS);
2189*8098eeb6SChristoph Böhmwalder 
2190*8098eeb6SChristoph Böhmwalder 	if (!tla)
2191*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2192*8098eeb6SChristoph Böhmwalder 
2193*8098eeb6SChristoph Böhmwalder 	if (nla_put_u64_64bit(skb, DRBD_A_START_OV_PARMS_OV_START_SECTOR, s->ov_start_sector, 0))
2194*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2195*8098eeb6SChristoph Böhmwalder 	if (nla_put_u64_64bit(skb, DRBD_A_START_OV_PARMS_OV_STOP_SECTOR, s->ov_stop_sector, 0))
2196*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2197*8098eeb6SChristoph Böhmwalder 
2198*8098eeb6SChristoph Böhmwalder 	nla_nest_end(skb, tla);
2199*8098eeb6SChristoph Böhmwalder 	return 0;
2200*8098eeb6SChristoph Böhmwalder 
2201*8098eeb6SChristoph Böhmwalder nla_put_failure:
2202*8098eeb6SChristoph Böhmwalder 	if (tla)
2203*8098eeb6SChristoph Böhmwalder 		nla_nest_cancel(skb, tla);
2204*8098eeb6SChristoph Böhmwalder 	return -EMSGSIZE;
2205*8098eeb6SChristoph Böhmwalder }
2206*8098eeb6SChristoph Böhmwalder 
2207*8098eeb6SChristoph Böhmwalder int new_c_uuid_parms_to_skb(struct sk_buff *skb, struct new_c_uuid_parms *s)
2208*8098eeb6SChristoph Böhmwalder {
2209*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = nla_nest_start(skb, DRBD_NLA_NEW_C_UUID_PARMS);
2210*8098eeb6SChristoph Böhmwalder 
2211*8098eeb6SChristoph Böhmwalder 	if (!tla)
2212*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2213*8098eeb6SChristoph Böhmwalder 
2214*8098eeb6SChristoph Böhmwalder 	if (nla_put_u8(skb, DRBD_A_NEW_C_UUID_PARMS_CLEAR_BM, s->clear_bm))
2215*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2216*8098eeb6SChristoph Böhmwalder 
2217*8098eeb6SChristoph Böhmwalder 	nla_nest_end(skb, tla);
2218*8098eeb6SChristoph Böhmwalder 	return 0;
2219*8098eeb6SChristoph Böhmwalder 
2220*8098eeb6SChristoph Böhmwalder nla_put_failure:
2221*8098eeb6SChristoph Böhmwalder 	if (tla)
2222*8098eeb6SChristoph Böhmwalder 		nla_nest_cancel(skb, tla);
2223*8098eeb6SChristoph Böhmwalder 	return -EMSGSIZE;
2224*8098eeb6SChristoph Böhmwalder }
2225*8098eeb6SChristoph Böhmwalder 
2226*8098eeb6SChristoph Böhmwalder int timeout_parms_to_skb(struct sk_buff *skb, struct timeout_parms *s)
2227*8098eeb6SChristoph Böhmwalder {
2228*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = nla_nest_start(skb, DRBD_NLA_TIMEOUT_PARMS);
2229*8098eeb6SChristoph Böhmwalder 
2230*8098eeb6SChristoph Böhmwalder 	if (!tla)
2231*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2232*8098eeb6SChristoph Böhmwalder 
2233*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_TIMEOUT_PARMS_TIMEOUT_TYPE, s->timeout_type))
2234*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2235*8098eeb6SChristoph Böhmwalder 
2236*8098eeb6SChristoph Böhmwalder 	nla_nest_end(skb, tla);
2237*8098eeb6SChristoph Böhmwalder 	return 0;
2238*8098eeb6SChristoph Böhmwalder 
2239*8098eeb6SChristoph Böhmwalder nla_put_failure:
2240*8098eeb6SChristoph Böhmwalder 	if (tla)
2241*8098eeb6SChristoph Böhmwalder 		nla_nest_cancel(skb, tla);
2242*8098eeb6SChristoph Böhmwalder 	return -EMSGSIZE;
2243*8098eeb6SChristoph Böhmwalder }
2244*8098eeb6SChristoph Böhmwalder 
2245*8098eeb6SChristoph Böhmwalder int disconnect_parms_to_skb(struct sk_buff *skb, struct disconnect_parms *s)
2246*8098eeb6SChristoph Böhmwalder {
2247*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = nla_nest_start(skb, DRBD_NLA_DISCONNECT_PARMS);
2248*8098eeb6SChristoph Böhmwalder 
2249*8098eeb6SChristoph Böhmwalder 	if (!tla)
2250*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2251*8098eeb6SChristoph Böhmwalder 
2252*8098eeb6SChristoph Böhmwalder 	if (nla_put_u8(skb, DRBD_A_DISCONNECT_PARMS_FORCE_DISCONNECT, s->force_disconnect))
2253*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2254*8098eeb6SChristoph Böhmwalder 
2255*8098eeb6SChristoph Böhmwalder 	nla_nest_end(skb, tla);
2256*8098eeb6SChristoph Böhmwalder 	return 0;
2257*8098eeb6SChristoph Böhmwalder 
2258*8098eeb6SChristoph Böhmwalder nla_put_failure:
2259*8098eeb6SChristoph Böhmwalder 	if (tla)
2260*8098eeb6SChristoph Böhmwalder 		nla_nest_cancel(skb, tla);
2261*8098eeb6SChristoph Böhmwalder 	return -EMSGSIZE;
2262*8098eeb6SChristoph Böhmwalder }
2263*8098eeb6SChristoph Böhmwalder 
2264*8098eeb6SChristoph Böhmwalder int detach_parms_to_skb(struct sk_buff *skb, struct detach_parms *s)
2265*8098eeb6SChristoph Böhmwalder {
2266*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = nla_nest_start(skb, DRBD_NLA_DETACH_PARMS);
2267*8098eeb6SChristoph Böhmwalder 
2268*8098eeb6SChristoph Böhmwalder 	if (!tla)
2269*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2270*8098eeb6SChristoph Böhmwalder 
2271*8098eeb6SChristoph Böhmwalder 	if (nla_put_u8(skb, DRBD_A_DETACH_PARMS_FORCE_DETACH, s->force_detach))
2272*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2273*8098eeb6SChristoph Böhmwalder 
2274*8098eeb6SChristoph Böhmwalder 	nla_nest_end(skb, tla);
2275*8098eeb6SChristoph Böhmwalder 	return 0;
2276*8098eeb6SChristoph Böhmwalder 
2277*8098eeb6SChristoph Böhmwalder nla_put_failure:
2278*8098eeb6SChristoph Böhmwalder 	if (tla)
2279*8098eeb6SChristoph Böhmwalder 		nla_nest_cancel(skb, tla);
2280*8098eeb6SChristoph Böhmwalder 	return -EMSGSIZE;
2281*8098eeb6SChristoph Böhmwalder }
2282*8098eeb6SChristoph Böhmwalder 
2283*8098eeb6SChristoph Böhmwalder int resource_info_to_skb(struct sk_buff *skb, struct resource_info *s)
2284*8098eeb6SChristoph Böhmwalder {
2285*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = nla_nest_start(skb, DRBD_NLA_RESOURCE_INFO);
2286*8098eeb6SChristoph Böhmwalder 
2287*8098eeb6SChristoph Böhmwalder 	if (!tla)
2288*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2289*8098eeb6SChristoph Böhmwalder 
2290*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_RESOURCE_INFO_RES_ROLE, s->res_role))
2291*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2292*8098eeb6SChristoph Böhmwalder 	if (nla_put_u8(skb, DRBD_A_RESOURCE_INFO_RES_SUSP, s->res_susp))
2293*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2294*8098eeb6SChristoph Böhmwalder 	if (nla_put_u8(skb, DRBD_A_RESOURCE_INFO_RES_SUSP_NOD, s->res_susp_nod))
2295*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2296*8098eeb6SChristoph Böhmwalder 	if (nla_put_u8(skb, DRBD_A_RESOURCE_INFO_RES_SUSP_FEN, s->res_susp_fen))
2297*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2298*8098eeb6SChristoph Böhmwalder 
2299*8098eeb6SChristoph Böhmwalder 	nla_nest_end(skb, tla);
2300*8098eeb6SChristoph Böhmwalder 	return 0;
2301*8098eeb6SChristoph Böhmwalder 
2302*8098eeb6SChristoph Böhmwalder nla_put_failure:
2303*8098eeb6SChristoph Böhmwalder 	if (tla)
2304*8098eeb6SChristoph Böhmwalder 		nla_nest_cancel(skb, tla);
2305*8098eeb6SChristoph Böhmwalder 	return -EMSGSIZE;
2306*8098eeb6SChristoph Böhmwalder }
2307*8098eeb6SChristoph Böhmwalder 
2308*8098eeb6SChristoph Böhmwalder int device_info_to_skb(struct sk_buff *skb, struct device_info *s)
2309*8098eeb6SChristoph Böhmwalder {
2310*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = nla_nest_start(skb, DRBD_NLA_DEVICE_INFO);
2311*8098eeb6SChristoph Böhmwalder 
2312*8098eeb6SChristoph Böhmwalder 	if (!tla)
2313*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2314*8098eeb6SChristoph Böhmwalder 
2315*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_DEVICE_INFO_DEV_DISK_STATE, s->dev_disk_state))
2316*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2317*8098eeb6SChristoph Böhmwalder 
2318*8098eeb6SChristoph Böhmwalder 	nla_nest_end(skb, tla);
2319*8098eeb6SChristoph Böhmwalder 	return 0;
2320*8098eeb6SChristoph Böhmwalder 
2321*8098eeb6SChristoph Böhmwalder nla_put_failure:
2322*8098eeb6SChristoph Böhmwalder 	if (tla)
2323*8098eeb6SChristoph Böhmwalder 		nla_nest_cancel(skb, tla);
2324*8098eeb6SChristoph Böhmwalder 	return -EMSGSIZE;
2325*8098eeb6SChristoph Böhmwalder }
2326*8098eeb6SChristoph Böhmwalder 
2327*8098eeb6SChristoph Böhmwalder int connection_info_to_skb(struct sk_buff *skb, struct connection_info *s)
2328*8098eeb6SChristoph Böhmwalder {
2329*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = nla_nest_start(skb, DRBD_NLA_CONNECTION_INFO);
2330*8098eeb6SChristoph Böhmwalder 
2331*8098eeb6SChristoph Böhmwalder 	if (!tla)
2332*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2333*8098eeb6SChristoph Böhmwalder 
2334*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_CONNECTION_INFO_CONN_CONNECTION_STATE, s->conn_connection_state))
2335*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2336*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_CONNECTION_INFO_CONN_ROLE, s->conn_role))
2337*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2338*8098eeb6SChristoph Böhmwalder 
2339*8098eeb6SChristoph Böhmwalder 	nla_nest_end(skb, tla);
2340*8098eeb6SChristoph Böhmwalder 	return 0;
2341*8098eeb6SChristoph Böhmwalder 
2342*8098eeb6SChristoph Böhmwalder nla_put_failure:
2343*8098eeb6SChristoph Böhmwalder 	if (tla)
2344*8098eeb6SChristoph Böhmwalder 		nla_nest_cancel(skb, tla);
2345*8098eeb6SChristoph Böhmwalder 	return -EMSGSIZE;
2346*8098eeb6SChristoph Böhmwalder }
2347*8098eeb6SChristoph Böhmwalder 
2348*8098eeb6SChristoph Böhmwalder int peer_device_info_to_skb(struct sk_buff *skb, struct peer_device_info *s)
2349*8098eeb6SChristoph Böhmwalder {
2350*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = nla_nest_start(skb, DRBD_NLA_PEER_DEVICE_INFO);
2351*8098eeb6SChristoph Böhmwalder 
2352*8098eeb6SChristoph Böhmwalder 	if (!tla)
2353*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2354*8098eeb6SChristoph Böhmwalder 
2355*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_PEER_DEVICE_INFO_PEER_REPL_STATE, s->peer_repl_state))
2356*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2357*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_PEER_DEVICE_INFO_PEER_DISK_STATE, s->peer_disk_state))
2358*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2359*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_PEER_DEVICE_INFO_PEER_RESYNC_SUSP_USER, s->peer_resync_susp_user))
2360*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2361*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_PEER_DEVICE_INFO_PEER_RESYNC_SUSP_PEER, s->peer_resync_susp_peer))
2362*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2363*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_PEER_DEVICE_INFO_PEER_RESYNC_SUSP_DEPENDENCY, s->peer_resync_susp_dependency))
2364*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2365*8098eeb6SChristoph Böhmwalder 
2366*8098eeb6SChristoph Böhmwalder 	nla_nest_end(skb, tla);
2367*8098eeb6SChristoph Böhmwalder 	return 0;
2368*8098eeb6SChristoph Böhmwalder 
2369*8098eeb6SChristoph Böhmwalder nla_put_failure:
2370*8098eeb6SChristoph Böhmwalder 	if (tla)
2371*8098eeb6SChristoph Böhmwalder 		nla_nest_cancel(skb, tla);
2372*8098eeb6SChristoph Böhmwalder 	return -EMSGSIZE;
2373*8098eeb6SChristoph Böhmwalder }
2374*8098eeb6SChristoph Böhmwalder 
2375*8098eeb6SChristoph Böhmwalder int resource_statistics_to_skb(struct sk_buff *skb, struct resource_statistics *s)
2376*8098eeb6SChristoph Böhmwalder {
2377*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = nla_nest_start(skb, DRBD_NLA_RESOURCE_STATISTICS);
2378*8098eeb6SChristoph Böhmwalder 
2379*8098eeb6SChristoph Böhmwalder 	if (!tla)
2380*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2381*8098eeb6SChristoph Böhmwalder 
2382*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_RESOURCE_STATISTICS_RES_STAT_WRITE_ORDERING, s->res_stat_write_ordering))
2383*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2384*8098eeb6SChristoph Böhmwalder 
2385*8098eeb6SChristoph Böhmwalder 	nla_nest_end(skb, tla);
2386*8098eeb6SChristoph Böhmwalder 	return 0;
2387*8098eeb6SChristoph Böhmwalder 
2388*8098eeb6SChristoph Böhmwalder nla_put_failure:
2389*8098eeb6SChristoph Böhmwalder 	if (tla)
2390*8098eeb6SChristoph Böhmwalder 		nla_nest_cancel(skb, tla);
2391*8098eeb6SChristoph Böhmwalder 	return -EMSGSIZE;
2392*8098eeb6SChristoph Böhmwalder }
2393*8098eeb6SChristoph Böhmwalder 
2394*8098eeb6SChristoph Böhmwalder int device_statistics_to_skb(struct sk_buff *skb, struct device_statistics *s)
2395*8098eeb6SChristoph Böhmwalder {
2396*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = nla_nest_start(skb, DRBD_NLA_DEVICE_STATISTICS);
2397*8098eeb6SChristoph Böhmwalder 
2398*8098eeb6SChristoph Böhmwalder 	if (!tla)
2399*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2400*8098eeb6SChristoph Böhmwalder 
2401*8098eeb6SChristoph Böhmwalder 	if (nla_put_u64_64bit(skb, DRBD_A_DEVICE_STATISTICS_DEV_SIZE, s->dev_size, 0))
2402*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2403*8098eeb6SChristoph Böhmwalder 	if (nla_put_u64_64bit(skb, DRBD_A_DEVICE_STATISTICS_DEV_READ, s->dev_read, 0))
2404*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2405*8098eeb6SChristoph Böhmwalder 	if (nla_put_u64_64bit(skb, DRBD_A_DEVICE_STATISTICS_DEV_WRITE, s->dev_write, 0))
2406*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2407*8098eeb6SChristoph Böhmwalder 	if (nla_put_u64_64bit(skb, DRBD_A_DEVICE_STATISTICS_DEV_AL_WRITES, s->dev_al_writes, 0))
2408*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2409*8098eeb6SChristoph Böhmwalder 	if (nla_put_u64_64bit(skb, DRBD_A_DEVICE_STATISTICS_DEV_BM_WRITES, s->dev_bm_writes, 0))
2410*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2411*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_DEVICE_STATISTICS_DEV_UPPER_PENDING, s->dev_upper_pending))
2412*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2413*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_DEVICE_STATISTICS_DEV_LOWER_PENDING, s->dev_lower_pending))
2414*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2415*8098eeb6SChristoph Böhmwalder 	if (nla_put_u8(skb, DRBD_A_DEVICE_STATISTICS_DEV_UPPER_BLOCKED, s->dev_upper_blocked))
2416*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2417*8098eeb6SChristoph Böhmwalder 	if (nla_put_u8(skb, DRBD_A_DEVICE_STATISTICS_DEV_LOWER_BLOCKED, s->dev_lower_blocked))
2418*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2419*8098eeb6SChristoph Böhmwalder 	if (nla_put_u8(skb, DRBD_A_DEVICE_STATISTICS_DEV_AL_SUSPENDED, s->dev_al_suspended))
2420*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2421*8098eeb6SChristoph Böhmwalder 	if (nla_put_u64_64bit(skb, DRBD_A_DEVICE_STATISTICS_DEV_EXPOSED_DATA_UUID, s->dev_exposed_data_uuid, 0))
2422*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2423*8098eeb6SChristoph Böhmwalder 	if (nla_put_u64_64bit(skb, DRBD_A_DEVICE_STATISTICS_DEV_CURRENT_UUID, s->dev_current_uuid, 0))
2424*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2425*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_DEVICE_STATISTICS_DEV_DISK_FLAGS, s->dev_disk_flags))
2426*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2427*8098eeb6SChristoph Böhmwalder 	if (nla_put(skb, DRBD_A_DEVICE_STATISTICS_HISTORY_UUIDS, min_t(int, DRBD_NL_HISTORY_UUIDS_SIZE,
2428*8098eeb6SChristoph Böhmwalder 			s->history_uuids_len), s->history_uuids))
2429*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2430*8098eeb6SChristoph Böhmwalder 
2431*8098eeb6SChristoph Böhmwalder 	nla_nest_end(skb, tla);
2432*8098eeb6SChristoph Böhmwalder 	return 0;
2433*8098eeb6SChristoph Böhmwalder 
2434*8098eeb6SChristoph Böhmwalder nla_put_failure:
2435*8098eeb6SChristoph Böhmwalder 	if (tla)
2436*8098eeb6SChristoph Böhmwalder 		nla_nest_cancel(skb, tla);
2437*8098eeb6SChristoph Böhmwalder 	return -EMSGSIZE;
2438*8098eeb6SChristoph Böhmwalder }
2439*8098eeb6SChristoph Böhmwalder 
2440*8098eeb6SChristoph Böhmwalder int connection_statistics_to_skb(struct sk_buff *skb, struct connection_statistics *s)
2441*8098eeb6SChristoph Böhmwalder {
2442*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = nla_nest_start(skb, DRBD_NLA_CONNECTION_STATISTICS);
2443*8098eeb6SChristoph Böhmwalder 
2444*8098eeb6SChristoph Böhmwalder 	if (!tla)
2445*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2446*8098eeb6SChristoph Böhmwalder 
2447*8098eeb6SChristoph Böhmwalder 	if (nla_put_u8(skb, DRBD_A_CONNECTION_STATISTICS_CONN_CONGESTED, s->conn_congested))
2448*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2449*8098eeb6SChristoph Böhmwalder 
2450*8098eeb6SChristoph Böhmwalder 	nla_nest_end(skb, tla);
2451*8098eeb6SChristoph Böhmwalder 	return 0;
2452*8098eeb6SChristoph Böhmwalder 
2453*8098eeb6SChristoph Böhmwalder nla_put_failure:
2454*8098eeb6SChristoph Böhmwalder 	if (tla)
2455*8098eeb6SChristoph Böhmwalder 		nla_nest_cancel(skb, tla);
2456*8098eeb6SChristoph Böhmwalder 	return -EMSGSIZE;
2457*8098eeb6SChristoph Böhmwalder }
2458*8098eeb6SChristoph Böhmwalder 
2459*8098eeb6SChristoph Böhmwalder int peer_device_statistics_to_skb(struct sk_buff *skb, struct peer_device_statistics *s)
2460*8098eeb6SChristoph Böhmwalder {
2461*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = nla_nest_start(skb, DRBD_NLA_PEER_DEVICE_STATISTICS);
2462*8098eeb6SChristoph Böhmwalder 
2463*8098eeb6SChristoph Böhmwalder 	if (!tla)
2464*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2465*8098eeb6SChristoph Böhmwalder 
2466*8098eeb6SChristoph Böhmwalder 	if (nla_put_u64_64bit(skb, DRBD_A_PEER_DEVICE_STATISTICS_PEER_DEV_RECEIVED, s->peer_dev_received, 0))
2467*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2468*8098eeb6SChristoph Böhmwalder 	if (nla_put_u64_64bit(skb, DRBD_A_PEER_DEVICE_STATISTICS_PEER_DEV_SENT, s->peer_dev_sent, 0))
2469*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2470*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_PEER_DEVICE_STATISTICS_PEER_DEV_PENDING, s->peer_dev_pending))
2471*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2472*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_PEER_DEVICE_STATISTICS_PEER_DEV_UNACKED, s->peer_dev_unacked))
2473*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2474*8098eeb6SChristoph Böhmwalder 	if (nla_put_u64_64bit(skb, DRBD_A_PEER_DEVICE_STATISTICS_PEER_DEV_OUT_OF_SYNC, s->peer_dev_out_of_sync, 0))
2475*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2476*8098eeb6SChristoph Böhmwalder 	if (nla_put_u64_64bit(skb, DRBD_A_PEER_DEVICE_STATISTICS_PEER_DEV_RESYNC_FAILED, s->peer_dev_resync_failed, 0))
2477*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2478*8098eeb6SChristoph Böhmwalder 	if (nla_put_u64_64bit(skb, DRBD_A_PEER_DEVICE_STATISTICS_PEER_DEV_BITMAP_UUID, s->peer_dev_bitmap_uuid, 0))
2479*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2480*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_PEER_DEVICE_STATISTICS_PEER_DEV_FLAGS, s->peer_dev_flags))
2481*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2482*8098eeb6SChristoph Böhmwalder 
2483*8098eeb6SChristoph Böhmwalder 	nla_nest_end(skb, tla);
2484*8098eeb6SChristoph Böhmwalder 	return 0;
2485*8098eeb6SChristoph Böhmwalder 
2486*8098eeb6SChristoph Böhmwalder nla_put_failure:
2487*8098eeb6SChristoph Böhmwalder 	if (tla)
2488*8098eeb6SChristoph Böhmwalder 		nla_nest_cancel(skb, tla);
2489*8098eeb6SChristoph Böhmwalder 	return -EMSGSIZE;
2490*8098eeb6SChristoph Böhmwalder }
2491*8098eeb6SChristoph Böhmwalder 
2492*8098eeb6SChristoph Böhmwalder int drbd_notification_header_to_skb(struct sk_buff *skb, struct drbd_notification_header *s)
2493*8098eeb6SChristoph Böhmwalder {
2494*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = nla_nest_start(skb, DRBD_NLA_NOTIFICATION_HEADER);
2495*8098eeb6SChristoph Böhmwalder 
2496*8098eeb6SChristoph Böhmwalder 	if (!tla)
2497*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2498*8098eeb6SChristoph Böhmwalder 
2499*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_DRBD_NOTIFICATION_HEADER_NH_TYPE, s->nh_type))
2500*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2501*8098eeb6SChristoph Böhmwalder 
2502*8098eeb6SChristoph Böhmwalder 	nla_nest_end(skb, tla);
2503*8098eeb6SChristoph Böhmwalder 	return 0;
2504*8098eeb6SChristoph Böhmwalder 
2505*8098eeb6SChristoph Böhmwalder nla_put_failure:
2506*8098eeb6SChristoph Böhmwalder 	if (tla)
2507*8098eeb6SChristoph Böhmwalder 		nla_nest_cancel(skb, tla);
2508*8098eeb6SChristoph Böhmwalder 	return -EMSGSIZE;
2509*8098eeb6SChristoph Böhmwalder }
2510*8098eeb6SChristoph Böhmwalder 
2511*8098eeb6SChristoph Böhmwalder int drbd_helper_info_to_skb(struct sk_buff *skb, struct drbd_helper_info *s)
2512*8098eeb6SChristoph Böhmwalder {
2513*8098eeb6SChristoph Böhmwalder 	struct nlattr *tla = nla_nest_start(skb, DRBD_NLA_HELPER);
2514*8098eeb6SChristoph Böhmwalder 
2515*8098eeb6SChristoph Böhmwalder 	if (!tla)
2516*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2517*8098eeb6SChristoph Böhmwalder 
2518*8098eeb6SChristoph Böhmwalder 	if (nla_put(skb, DRBD_A_DRBD_HELPER_INFO_HELPER_NAME, min_t(int, 32,
2519*8098eeb6SChristoph Böhmwalder 			s->helper_name_len + (s->helper_name_len < 32)), s->helper_name))
2520*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2521*8098eeb6SChristoph Böhmwalder 	if (nla_put_u32(skb, DRBD_A_DRBD_HELPER_INFO_HELPER_STATUS, s->helper_status))
2522*8098eeb6SChristoph Böhmwalder 		goto nla_put_failure;
2523*8098eeb6SChristoph Böhmwalder 
2524*8098eeb6SChristoph Böhmwalder 	nla_nest_end(skb, tla);
2525*8098eeb6SChristoph Böhmwalder 	return 0;
2526*8098eeb6SChristoph Böhmwalder 
2527*8098eeb6SChristoph Böhmwalder nla_put_failure:
2528*8098eeb6SChristoph Böhmwalder 	if (tla)
2529*8098eeb6SChristoph Böhmwalder 		nla_nest_cancel(skb, tla);
2530*8098eeb6SChristoph Böhmwalder 	return -EMSGSIZE;
2531*8098eeb6SChristoph Böhmwalder }
2532*8098eeb6SChristoph Böhmwalder 
2533*8098eeb6SChristoph Böhmwalder void set_disk_conf_defaults(struct disk_conf *x)
2534*8098eeb6SChristoph Böhmwalder {
2535*8098eeb6SChristoph Böhmwalder 	x->on_io_error = DRBD_ON_IO_ERROR_DEF;
2536*8098eeb6SChristoph Böhmwalder 	x->fencing = DRBD_FENCING_DEF;
2537*8098eeb6SChristoph Böhmwalder 	x->resync_rate = DRBD_RESYNC_RATE_DEF;
2538*8098eeb6SChristoph Böhmwalder 	x->resync_after = DRBD_MINOR_NUMBER_DEF;
2539*8098eeb6SChristoph Böhmwalder 	x->al_extents = DRBD_AL_EXTENTS_DEF;
2540*8098eeb6SChristoph Böhmwalder 	x->c_plan_ahead = DRBD_C_PLAN_AHEAD_DEF;
2541*8098eeb6SChristoph Böhmwalder 	x->c_delay_target = DRBD_C_DELAY_TARGET_DEF;
2542*8098eeb6SChristoph Böhmwalder 	x->c_fill_target = DRBD_C_FILL_TARGET_DEF;
2543*8098eeb6SChristoph Böhmwalder 	x->c_max_rate = DRBD_C_MAX_RATE_DEF;
2544*8098eeb6SChristoph Böhmwalder 	x->c_min_rate = DRBD_C_MIN_RATE_DEF;
2545*8098eeb6SChristoph Böhmwalder 	x->disk_barrier = DRBD_DISK_BARRIER_DEF;
2546*8098eeb6SChristoph Böhmwalder 	x->disk_flushes = DRBD_DISK_FLUSHES_DEF;
2547*8098eeb6SChristoph Böhmwalder 	x->disk_drain = DRBD_DISK_DRAIN_DEF;
2548*8098eeb6SChristoph Böhmwalder 	x->md_flushes = DRBD_MD_FLUSHES_DEF;
2549*8098eeb6SChristoph Böhmwalder 	x->disk_timeout = DRBD_DISK_TIMEOUT_DEF;
2550*8098eeb6SChristoph Böhmwalder 	x->read_balancing = DRBD_READ_BALANCING_DEF;
2551*8098eeb6SChristoph Böhmwalder 	x->al_updates = DRBD_AL_UPDATES_DEF;
2552*8098eeb6SChristoph Böhmwalder 	x->discard_zeroes_if_aligned = DRBD_DISCARD_ZEROES_IF_ALIGNED_DEF;
2553*8098eeb6SChristoph Böhmwalder 	x->rs_discard_granularity = DRBD_RS_DISCARD_GRANULARITY_DEF;
2554*8098eeb6SChristoph Böhmwalder 	x->disable_write_same = DRBD_DISABLE_WRITE_SAME_DEF;
2555*8098eeb6SChristoph Böhmwalder }
2556*8098eeb6SChristoph Böhmwalder 
2557*8098eeb6SChristoph Böhmwalder void set_res_opts_defaults(struct res_opts *x)
2558*8098eeb6SChristoph Böhmwalder {
2559*8098eeb6SChristoph Böhmwalder 	memset(x->cpu_mask, 0, sizeof(x->cpu_mask));
2560*8098eeb6SChristoph Böhmwalder 	x->cpu_mask_len = 0;
2561*8098eeb6SChristoph Böhmwalder 	x->on_no_data = DRBD_ON_NO_DATA_DEF;
2562*8098eeb6SChristoph Böhmwalder }
2563*8098eeb6SChristoph Böhmwalder 
2564*8098eeb6SChristoph Böhmwalder void set_net_conf_defaults(struct net_conf *x)
2565*8098eeb6SChristoph Böhmwalder {
2566*8098eeb6SChristoph Böhmwalder 	memset(x->shared_secret, 0, sizeof(x->shared_secret));
2567*8098eeb6SChristoph Böhmwalder 	x->shared_secret_len = 0;
2568*8098eeb6SChristoph Böhmwalder 	memset(x->cram_hmac_alg, 0, sizeof(x->cram_hmac_alg));
2569*8098eeb6SChristoph Böhmwalder 	x->cram_hmac_alg_len = 0;
2570*8098eeb6SChristoph Böhmwalder 	memset(x->integrity_alg, 0, sizeof(x->integrity_alg));
2571*8098eeb6SChristoph Böhmwalder 	x->integrity_alg_len = 0;
2572*8098eeb6SChristoph Böhmwalder 	memset(x->verify_alg, 0, sizeof(x->verify_alg));
2573*8098eeb6SChristoph Böhmwalder 	x->verify_alg_len = 0;
2574*8098eeb6SChristoph Böhmwalder 	memset(x->csums_alg, 0, sizeof(x->csums_alg));
2575*8098eeb6SChristoph Böhmwalder 	x->csums_alg_len = 0;
2576*8098eeb6SChristoph Böhmwalder 	x->wire_protocol = DRBD_PROTOCOL_DEF;
2577*8098eeb6SChristoph Böhmwalder 	x->connect_int = DRBD_CONNECT_INT_DEF;
2578*8098eeb6SChristoph Böhmwalder 	x->timeout = DRBD_TIMEOUT_DEF;
2579*8098eeb6SChristoph Böhmwalder 	x->ping_int = DRBD_PING_INT_DEF;
2580*8098eeb6SChristoph Böhmwalder 	x->ping_timeo = DRBD_PING_TIMEO_DEF;
2581*8098eeb6SChristoph Böhmwalder 	x->sndbuf_size = DRBD_SNDBUF_SIZE_DEF;
2582*8098eeb6SChristoph Böhmwalder 	x->rcvbuf_size = DRBD_RCVBUF_SIZE_DEF;
2583*8098eeb6SChristoph Böhmwalder 	x->ko_count = DRBD_KO_COUNT_DEF;
2584*8098eeb6SChristoph Böhmwalder 	x->max_buffers = DRBD_MAX_BUFFERS_DEF;
2585*8098eeb6SChristoph Böhmwalder 	x->max_epoch_size = DRBD_MAX_EPOCH_SIZE_DEF;
2586*8098eeb6SChristoph Böhmwalder 	x->unplug_watermark = DRBD_UNPLUG_WATERMARK_DEF;
2587*8098eeb6SChristoph Böhmwalder 	x->after_sb_0p = DRBD_AFTER_SB_0P_DEF;
2588*8098eeb6SChristoph Böhmwalder 	x->after_sb_1p = DRBD_AFTER_SB_1P_DEF;
2589*8098eeb6SChristoph Böhmwalder 	x->after_sb_2p = DRBD_AFTER_SB_2P_DEF;
2590*8098eeb6SChristoph Böhmwalder 	x->rr_conflict = DRBD_RR_CONFLICT_DEF;
2591*8098eeb6SChristoph Böhmwalder 	x->on_congestion = DRBD_ON_CONGESTION_DEF;
2592*8098eeb6SChristoph Böhmwalder 	x->cong_fill = DRBD_CONG_FILL_DEF;
2593*8098eeb6SChristoph Böhmwalder 	x->cong_extents = DRBD_CONG_EXTENTS_DEF;
2594*8098eeb6SChristoph Böhmwalder 	x->two_primaries = DRBD_ALLOW_TWO_PRIMARIES_DEF;
2595*8098eeb6SChristoph Böhmwalder 	x->tcp_cork = DRBD_TCP_CORK_DEF;
2596*8098eeb6SChristoph Böhmwalder 	x->always_asbp = DRBD_ALWAYS_ASBP_DEF;
2597*8098eeb6SChristoph Böhmwalder 	x->use_rle = DRBD_USE_RLE_DEF;
2598*8098eeb6SChristoph Böhmwalder 	x->csums_after_crash_only = DRBD_CSUMS_AFTER_CRASH_ONLY_DEF;
2599*8098eeb6SChristoph Böhmwalder 	x->sock_check_timeo = DRBD_SOCKET_CHECK_TIMEO_DEF;
2600*8098eeb6SChristoph Böhmwalder }
2601*8098eeb6SChristoph Böhmwalder 
2602*8098eeb6SChristoph Böhmwalder void set_resize_parms_defaults(struct resize_parms *x)
2603*8098eeb6SChristoph Böhmwalder {
2604*8098eeb6SChristoph Böhmwalder 	x->al_stripes = DRBD_AL_STRIPES_DEF;
2605*8098eeb6SChristoph Böhmwalder 	x->al_stripe_size = DRBD_AL_STRIPE_SIZE_DEF;
2606*8098eeb6SChristoph Böhmwalder }
2607