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