1*ec2c35acSLars Ellenberg /* 2*ec2c35acSLars Ellenberg * General overview: 3*ec2c35acSLars Ellenberg * full generic netlink message: 4*ec2c35acSLars Ellenberg * |nlmsghdr|genlmsghdr|<payload> 5*ec2c35acSLars Ellenberg * 6*ec2c35acSLars Ellenberg * payload: 7*ec2c35acSLars Ellenberg * |optional fixed size family header|<sequence of netlink attributes> 8*ec2c35acSLars Ellenberg * 9*ec2c35acSLars Ellenberg * sequence of netlink attributes: 10*ec2c35acSLars Ellenberg * I chose to have all "top level" attributes NLA_NESTED, 11*ec2c35acSLars Ellenberg * corresponding to some real struct. 12*ec2c35acSLars Ellenberg * So we have a sequence of |tla, len|<nested nla sequence> 13*ec2c35acSLars Ellenberg * 14*ec2c35acSLars Ellenberg * nested nla sequence: 15*ec2c35acSLars Ellenberg * may be empty, or contain a sequence of netlink attributes 16*ec2c35acSLars Ellenberg * representing the struct fields. 17*ec2c35acSLars Ellenberg * 18*ec2c35acSLars Ellenberg * The tag number of any field (regardless of containing struct) 19*ec2c35acSLars Ellenberg * will be available as T_ ## field_name, 20*ec2c35acSLars Ellenberg * so you cannot have the same field name in two differnt structs. 21*ec2c35acSLars Ellenberg * 22*ec2c35acSLars Ellenberg * The tag numbers themselves are per struct, though, 23*ec2c35acSLars Ellenberg * so should always begin at 1 (not 0, that is the special "NLA_UNSPEC" type, 24*ec2c35acSLars Ellenberg * which we won't use here). 25*ec2c35acSLars Ellenberg * The tag numbers are used as index in the respective nla_policy array. 26*ec2c35acSLars Ellenberg * 27*ec2c35acSLars Ellenberg * GENL_struct(tag_name, tag_number, struct name, struct fields) - struct and policy 28*ec2c35acSLars Ellenberg * genl_magic_struct.h 29*ec2c35acSLars Ellenberg * generates the struct declaration, 30*ec2c35acSLars Ellenberg * generates an entry in the tla enum, 31*ec2c35acSLars Ellenberg * genl_magic_func.h 32*ec2c35acSLars Ellenberg * generates an entry in the static tla policy 33*ec2c35acSLars Ellenberg * with .type = NLA_NESTED 34*ec2c35acSLars Ellenberg * generates the static <struct_name>_nl_policy definition, 35*ec2c35acSLars Ellenberg * and static conversion functions 36*ec2c35acSLars Ellenberg * 37*ec2c35acSLars Ellenberg * genl_magic_func.h 38*ec2c35acSLars Ellenberg * 39*ec2c35acSLars Ellenberg * GENL_mc_group(group) 40*ec2c35acSLars Ellenberg * genl_magic_struct.h 41*ec2c35acSLars Ellenberg * does nothing 42*ec2c35acSLars Ellenberg * genl_magic_func.h 43*ec2c35acSLars Ellenberg * defines and registers the mcast group, 44*ec2c35acSLars Ellenberg * and provides a send helper 45*ec2c35acSLars Ellenberg * 46*ec2c35acSLars Ellenberg * GENL_notification(op_name, op_num, mcast_group, tla list) 47*ec2c35acSLars Ellenberg * These are notifications to userspace. 48*ec2c35acSLars Ellenberg * 49*ec2c35acSLars Ellenberg * genl_magic_struct.h 50*ec2c35acSLars Ellenberg * generates an entry in the genl_ops enum, 51*ec2c35acSLars Ellenberg * genl_magic_func.h 52*ec2c35acSLars Ellenberg * does nothing 53*ec2c35acSLars Ellenberg * 54*ec2c35acSLars Ellenberg * mcast group: the name of the mcast group this notification should be 55*ec2c35acSLars Ellenberg * expected on 56*ec2c35acSLars Ellenberg * tla list: the list of expected top level attributes, 57*ec2c35acSLars Ellenberg * for documentation and sanity checking. 58*ec2c35acSLars Ellenberg * 59*ec2c35acSLars Ellenberg * GENL_op(op_name, op_num, flags and handler, tla list) - "genl operations" 60*ec2c35acSLars Ellenberg * These are requests from userspace. 61*ec2c35acSLars Ellenberg * 62*ec2c35acSLars Ellenberg * _op and _notification share the same "number space", 63*ec2c35acSLars Ellenberg * op_nr will be assigned to "genlmsghdr->cmd" 64*ec2c35acSLars Ellenberg * 65*ec2c35acSLars Ellenberg * genl_magic_struct.h 66*ec2c35acSLars Ellenberg * generates an entry in the genl_ops enum, 67*ec2c35acSLars Ellenberg * genl_magic_func.h 68*ec2c35acSLars Ellenberg * generates an entry in the static genl_ops array, 69*ec2c35acSLars Ellenberg * and static register/unregister functions to 70*ec2c35acSLars Ellenberg * genl_register_family_with_ops(). 71*ec2c35acSLars Ellenberg * 72*ec2c35acSLars Ellenberg * flags and handler: 73*ec2c35acSLars Ellenberg * GENL_op_init( .doit = x, .dumpit = y, .flags = something) 74*ec2c35acSLars Ellenberg * GENL_doit(x) => .dumpit = NULL, .flags = GENL_ADMIN_PERM 75*ec2c35acSLars Ellenberg * tla list: the list of expected top level attributes, 76*ec2c35acSLars Ellenberg * for documentation and sanity checking. 77*ec2c35acSLars Ellenberg */ 78*ec2c35acSLars Ellenberg 79*ec2c35acSLars Ellenberg /* 80*ec2c35acSLars Ellenberg * STRUCTS 81*ec2c35acSLars Ellenberg */ 82*ec2c35acSLars Ellenberg 83*ec2c35acSLars Ellenberg /* this is sent kernel -> userland on various error conditions, and contains 84*ec2c35acSLars Ellenberg * informational textual info, which is supposedly human readable. 85*ec2c35acSLars Ellenberg * The computer relevant return code is in the drbd_genlmsghdr. 86*ec2c35acSLars Ellenberg */ 87*ec2c35acSLars Ellenberg GENL_struct(DRBD_NLA_CFG_REPLY, 1, drbd_cfg_reply, 88*ec2c35acSLars Ellenberg /* "arbitrary" size strings, nla_policy.len = 0 */ 89*ec2c35acSLars Ellenberg __str_field(1, GENLA_F_MANDATORY, info_text, 0) 90*ec2c35acSLars Ellenberg ) 91*ec2c35acSLars Ellenberg 92*ec2c35acSLars Ellenberg /* Configuration requests typically need a context to operate on. 93*ec2c35acSLars Ellenberg * Possible keys are device minor (fits in the drbd_genlmsghdr), 94*ec2c35acSLars Ellenberg * the replication link (aka connection) name, 95*ec2c35acSLars Ellenberg * and/or the replication group (aka resource) name, 96*ec2c35acSLars Ellenberg * and the volume id within the resource. */ 97*ec2c35acSLars Ellenberg GENL_struct(DRBD_NLA_CFG_CONTEXT, 2, drbd_cfg_context, 98*ec2c35acSLars Ellenberg /* currently only 256 volumes per group, 99*ec2c35acSLars Ellenberg * but maybe we still change that */ 100*ec2c35acSLars Ellenberg __u32_field(1, GENLA_F_MANDATORY, ctx_volume) 101*ec2c35acSLars Ellenberg __str_field(2, GENLA_F_MANDATORY, ctx_conn_name, 128) 102*ec2c35acSLars Ellenberg ) 103*ec2c35acSLars Ellenberg 104*ec2c35acSLars Ellenberg GENL_struct(DRBD_NLA_DISK_CONF, 3, disk_conf, 105*ec2c35acSLars Ellenberg __u64_field(1, GENLA_F_MANDATORY, disk_size) 106*ec2c35acSLars Ellenberg __str_field(2, GENLA_F_REQUIRED, backing_dev, 128) 107*ec2c35acSLars Ellenberg __str_field(3, GENLA_F_REQUIRED, meta_dev, 128) 108*ec2c35acSLars Ellenberg __u32_field(4, GENLA_F_REQUIRED, meta_dev_idx) 109*ec2c35acSLars Ellenberg __u32_field(5, GENLA_F_MANDATORY, max_bio_bvecs) 110*ec2c35acSLars Ellenberg __u32_field(6, GENLA_F_MANDATORY, on_io_error) 111*ec2c35acSLars Ellenberg __u32_field(7, GENLA_F_MANDATORY, fencing) 112*ec2c35acSLars Ellenberg __flg_field(8, GENLA_F_MANDATORY, no_disk_barrier) 113*ec2c35acSLars Ellenberg __flg_field(9, GENLA_F_MANDATORY, no_disk_flush) 114*ec2c35acSLars Ellenberg __flg_field(10, GENLA_F_MANDATORY, no_disk_drain) 115*ec2c35acSLars Ellenberg __flg_field(11, GENLA_F_MANDATORY, no_md_flush) 116*ec2c35acSLars Ellenberg __flg_field(12, GENLA_F_MANDATORY, use_bmbv) 117*ec2c35acSLars Ellenberg ) 118*ec2c35acSLars Ellenberg 119*ec2c35acSLars Ellenberg GENL_struct(DRBD_NLA_SYNCER_CONF, 4, syncer_conf, 120*ec2c35acSLars Ellenberg __u32_field(1, GENLA_F_MANDATORY, rate) 121*ec2c35acSLars Ellenberg __u32_field(2, GENLA_F_MANDATORY, after) 122*ec2c35acSLars Ellenberg __u32_field(3, GENLA_F_MANDATORY, al_extents) 123*ec2c35acSLars Ellenberg __str_field(4, GENLA_F_MANDATORY, cpu_mask, 32) 124*ec2c35acSLars Ellenberg __str_field(5, GENLA_F_MANDATORY, verify_alg, SHARED_SECRET_MAX) 125*ec2c35acSLars Ellenberg __str_field(6, GENLA_F_MANDATORY, csums_alg, SHARED_SECRET_MAX) 126*ec2c35acSLars Ellenberg __flg_field(7, GENLA_F_MANDATORY, use_rle) 127*ec2c35acSLars Ellenberg __u32_field(8, GENLA_F_MANDATORY, on_no_data) 128*ec2c35acSLars Ellenberg __u32_field(9, GENLA_F_MANDATORY, c_plan_ahead) 129*ec2c35acSLars Ellenberg __u32_field(10, GENLA_F_MANDATORY, c_delay_target) 130*ec2c35acSLars Ellenberg __u32_field(11, GENLA_F_MANDATORY, c_fill_target) 131*ec2c35acSLars Ellenberg __u32_field(12, GENLA_F_MANDATORY, c_max_rate) 132*ec2c35acSLars Ellenberg __u32_field(13, GENLA_F_MANDATORY, c_min_rate) 133*ec2c35acSLars Ellenberg ) 134*ec2c35acSLars Ellenberg 135*ec2c35acSLars Ellenberg GENL_struct(DRBD_NLA_NET_CONF, 5, net_conf, 136*ec2c35acSLars Ellenberg __str_field(1, GENLA_F_MANDATORY | GENLA_F_SENSITIVE, 137*ec2c35acSLars Ellenberg shared_secret, SHARED_SECRET_MAX) 138*ec2c35acSLars Ellenberg __str_field(2, GENLA_F_MANDATORY, cram_hmac_alg, SHARED_SECRET_MAX) 139*ec2c35acSLars Ellenberg __str_field(3, GENLA_F_MANDATORY, integrity_alg, SHARED_SECRET_MAX) 140*ec2c35acSLars Ellenberg __str_field(4, GENLA_F_REQUIRED, my_addr, 128) 141*ec2c35acSLars Ellenberg __str_field(5, GENLA_F_REQUIRED, peer_addr, 128) 142*ec2c35acSLars Ellenberg __u32_field(6, GENLA_F_REQUIRED, wire_protocol) 143*ec2c35acSLars Ellenberg __u32_field(7, GENLA_F_MANDATORY, try_connect_int) 144*ec2c35acSLars Ellenberg __u32_field(8, GENLA_F_MANDATORY, timeout) 145*ec2c35acSLars Ellenberg __u32_field(9, GENLA_F_MANDATORY, ping_int) 146*ec2c35acSLars Ellenberg __u32_field(10, GENLA_F_MANDATORY, ping_timeo) 147*ec2c35acSLars Ellenberg __u32_field(11, GENLA_F_MANDATORY, sndbuf_size) 148*ec2c35acSLars Ellenberg __u32_field(12, GENLA_F_MANDATORY, rcvbuf_size) 149*ec2c35acSLars Ellenberg __u32_field(13, GENLA_F_MANDATORY, ko_count) 150*ec2c35acSLars Ellenberg __u32_field(14, GENLA_F_MANDATORY, max_buffers) 151*ec2c35acSLars Ellenberg __u32_field(15, GENLA_F_MANDATORY, max_epoch_size) 152*ec2c35acSLars Ellenberg __u32_field(16, GENLA_F_MANDATORY, unplug_watermark) 153*ec2c35acSLars Ellenberg __u32_field(17, GENLA_F_MANDATORY, after_sb_0p) 154*ec2c35acSLars Ellenberg __u32_field(18, GENLA_F_MANDATORY, after_sb_1p) 155*ec2c35acSLars Ellenberg __u32_field(19, GENLA_F_MANDATORY, after_sb_2p) 156*ec2c35acSLars Ellenberg __u32_field(20, GENLA_F_MANDATORY, rr_conflict) 157*ec2c35acSLars Ellenberg __u32_field(21, GENLA_F_MANDATORY, on_congestion) 158*ec2c35acSLars Ellenberg __u32_field(22, GENLA_F_MANDATORY, cong_fill) 159*ec2c35acSLars Ellenberg __u32_field(23, GENLA_F_MANDATORY, cong_extents) 160*ec2c35acSLars Ellenberg __flg_field(24, GENLA_F_MANDATORY, two_primaries) 161*ec2c35acSLars Ellenberg __flg_field(25, GENLA_F_MANDATORY, want_lose) 162*ec2c35acSLars Ellenberg __flg_field(26, GENLA_F_MANDATORY, no_cork) 163*ec2c35acSLars Ellenberg __flg_field(27, GENLA_F_MANDATORY, always_asbp) 164*ec2c35acSLars Ellenberg __flg_field(28, GENLA_F_MANDATORY, dry_run) 165*ec2c35acSLars Ellenberg ) 166*ec2c35acSLars Ellenberg 167*ec2c35acSLars Ellenberg GENL_struct(DRBD_NLA_SET_ROLE_PARMS, 6, set_role_parms, 168*ec2c35acSLars Ellenberg __flg_field(1, GENLA_F_MANDATORY, assume_uptodate) 169*ec2c35acSLars Ellenberg ) 170*ec2c35acSLars Ellenberg 171*ec2c35acSLars Ellenberg GENL_struct(DRBD_NLA_RESIZE_PARMS, 7, resize_parms, 172*ec2c35acSLars Ellenberg __u64_field(1, GENLA_F_MANDATORY, resize_size) 173*ec2c35acSLars Ellenberg __flg_field(2, GENLA_F_MANDATORY, resize_force) 174*ec2c35acSLars Ellenberg __flg_field(3, GENLA_F_MANDATORY, no_resync) 175*ec2c35acSLars Ellenberg ) 176*ec2c35acSLars Ellenberg 177*ec2c35acSLars Ellenberg GENL_struct(DRBD_NLA_STATE_INFO, 8, state_info, 178*ec2c35acSLars Ellenberg /* the reason of the broadcast, 179*ec2c35acSLars Ellenberg * if this is an event triggered broadcast. */ 180*ec2c35acSLars Ellenberg __u32_field(1, GENLA_F_MANDATORY, sib_reason) 181*ec2c35acSLars Ellenberg __u32_field(2, GENLA_F_REQUIRED, current_state) 182*ec2c35acSLars Ellenberg __u64_field(3, GENLA_F_MANDATORY, capacity) 183*ec2c35acSLars Ellenberg __u64_field(4, GENLA_F_MANDATORY, ed_uuid) 184*ec2c35acSLars Ellenberg 185*ec2c35acSLars Ellenberg /* These are for broadcast from after state change work. 186*ec2c35acSLars Ellenberg * prev_state and new_state are from the moment the state change took 187*ec2c35acSLars Ellenberg * place, new_state is not neccessarily the same as current_state, 188*ec2c35acSLars Ellenberg * there may have been more state changes since. Which will be 189*ec2c35acSLars Ellenberg * broadcasted soon, in their respective after state change work. */ 190*ec2c35acSLars Ellenberg __u32_field(5, GENLA_F_MANDATORY, prev_state) 191*ec2c35acSLars Ellenberg __u32_field(6, GENLA_F_MANDATORY, new_state) 192*ec2c35acSLars Ellenberg 193*ec2c35acSLars Ellenberg /* if we have a local disk: */ 194*ec2c35acSLars Ellenberg __bin_field(7, GENLA_F_MANDATORY, uuids, (UI_SIZE*sizeof(__u64))) 195*ec2c35acSLars Ellenberg __u32_field(8, GENLA_F_MANDATORY, disk_flags) 196*ec2c35acSLars Ellenberg __u64_field(9, GENLA_F_MANDATORY, bits_total) 197*ec2c35acSLars Ellenberg __u64_field(10, GENLA_F_MANDATORY, bits_oos) 198*ec2c35acSLars Ellenberg /* and in case resync or online verify is active */ 199*ec2c35acSLars Ellenberg __u64_field(11, GENLA_F_MANDATORY, bits_rs_total) 200*ec2c35acSLars Ellenberg __u64_field(12, GENLA_F_MANDATORY, bits_rs_failed) 201*ec2c35acSLars Ellenberg 202*ec2c35acSLars Ellenberg /* for pre and post notifications of helper execution */ 203*ec2c35acSLars Ellenberg __str_field(13, GENLA_F_MANDATORY, helper, 32) 204*ec2c35acSLars Ellenberg __u32_field(14, GENLA_F_MANDATORY, helper_exit_code) 205*ec2c35acSLars Ellenberg ) 206*ec2c35acSLars Ellenberg 207*ec2c35acSLars Ellenberg GENL_struct(DRBD_NLA_START_OV_PARMS, 9, start_ov_parms, 208*ec2c35acSLars Ellenberg __u64_field(1, GENLA_F_MANDATORY, ov_start_sector) 209*ec2c35acSLars Ellenberg ) 210*ec2c35acSLars Ellenberg 211*ec2c35acSLars Ellenberg GENL_struct(DRBD_NLA_NEW_C_UUID_PARMS, 10, new_c_uuid_parms, 212*ec2c35acSLars Ellenberg __flg_field(1, GENLA_F_MANDATORY, clear_bm) 213*ec2c35acSLars Ellenberg ) 214*ec2c35acSLars Ellenberg 215*ec2c35acSLars Ellenberg GENL_struct(DRBD_NLA_TIMEOUT_PARMS, 11, timeout_parms, 216*ec2c35acSLars Ellenberg __u32_field(1, GENLA_F_REQUIRED, timeout_type) 217*ec2c35acSLars Ellenberg ) 218*ec2c35acSLars Ellenberg 219*ec2c35acSLars Ellenberg GENL_struct(DRBD_NLA_DISCONNECT_PARMS, 12, disconnect_parms, 220*ec2c35acSLars Ellenberg __flg_field(1, GENLA_F_MANDATORY, force_disconnect) 221*ec2c35acSLars Ellenberg ) 222*ec2c35acSLars Ellenberg 223*ec2c35acSLars Ellenberg /* 224*ec2c35acSLars Ellenberg * Notifications and commands (genlmsghdr->cmd) 225*ec2c35acSLars Ellenberg */ 226*ec2c35acSLars Ellenberg GENL_mc_group(events) 227*ec2c35acSLars Ellenberg 228*ec2c35acSLars Ellenberg /* kernel -> userspace announcement of changes */ 229*ec2c35acSLars Ellenberg GENL_notification( 230*ec2c35acSLars Ellenberg DRBD_EVENT, 1, events, 231*ec2c35acSLars Ellenberg GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED) 232*ec2c35acSLars Ellenberg GENL_tla_expected(DRBD_NLA_STATE_INFO, GENLA_F_REQUIRED) 233*ec2c35acSLars Ellenberg GENL_tla_expected(DRBD_NLA_NET_CONF, GENLA_F_MANDATORY) 234*ec2c35acSLars Ellenberg GENL_tla_expected(DRBD_NLA_DISK_CONF, GENLA_F_MANDATORY) 235*ec2c35acSLars Ellenberg GENL_tla_expected(DRBD_NLA_SYNCER_CONF, GENLA_F_MANDATORY) 236*ec2c35acSLars Ellenberg ) 237*ec2c35acSLars Ellenberg 238*ec2c35acSLars Ellenberg /* query kernel for specific or all info */ 239*ec2c35acSLars Ellenberg GENL_op( 240*ec2c35acSLars Ellenberg DRBD_ADM_GET_STATUS, 2, 241*ec2c35acSLars Ellenberg GENL_op_init( 242*ec2c35acSLars Ellenberg .doit = drbd_adm_get_status, 243*ec2c35acSLars Ellenberg .dumpit = drbd_adm_get_status_all, 244*ec2c35acSLars Ellenberg /* anyone may ask for the status, 245*ec2c35acSLars Ellenberg * it is broadcasted anyways */ 246*ec2c35acSLars Ellenberg ), 247*ec2c35acSLars Ellenberg /* To select the object .doit. 248*ec2c35acSLars Ellenberg * Or a subset of objects in .dumpit. */ 249*ec2c35acSLars Ellenberg GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_MANDATORY) 250*ec2c35acSLars Ellenberg ) 251*ec2c35acSLars Ellenberg 252*ec2c35acSLars Ellenberg #if 0 253*ec2c35acSLars Ellenberg /* TO BE DONE */ 254*ec2c35acSLars Ellenberg /* create or destroy resources, aka replication groups */ 255*ec2c35acSLars Ellenberg GENL_op(DRBD_ADM_CREATE_RESOURCE, 3, GENL_doit(drbd_adm_create_resource), 256*ec2c35acSLars Ellenberg GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED)) 257*ec2c35acSLars Ellenberg GENL_op(DRBD_ADM_DELETE_RESOURCE, 4, GENL_doit(drbd_adm_delete_resource), 258*ec2c35acSLars Ellenberg GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED)) 259*ec2c35acSLars Ellenberg #endif 260*ec2c35acSLars Ellenberg 261*ec2c35acSLars Ellenberg /* add DRBD minor devices as volumes to resources */ 262*ec2c35acSLars Ellenberg GENL_op(DRBD_ADM_ADD_MINOR, 5, GENL_doit(drbd_adm_add_minor), 263*ec2c35acSLars Ellenberg GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED)) 264*ec2c35acSLars Ellenberg GENL_op(DRBD_ADM_DEL_MINOR, 6, GENL_doit(drbd_adm_delete_minor), 265*ec2c35acSLars Ellenberg GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED)) 266*ec2c35acSLars Ellenberg 267*ec2c35acSLars Ellenberg /* add or delete replication links to resources */ 268*ec2c35acSLars Ellenberg GENL_op(DRBD_ADM_ADD_LINK, 7, GENL_doit(drbd_adm_create_connection), 269*ec2c35acSLars Ellenberg GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED)) 270*ec2c35acSLars Ellenberg GENL_op(DRBD_ADM_DEL_LINK, 8, GENL_doit(drbd_adm_delete_connection), 271*ec2c35acSLars Ellenberg GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED)) 272*ec2c35acSLars Ellenberg 273*ec2c35acSLars Ellenberg /* operates on replication links */ 274*ec2c35acSLars Ellenberg GENL_op(DRBD_ADM_SYNCER, 9, 275*ec2c35acSLars Ellenberg GENL_doit(drbd_adm_syncer), 276*ec2c35acSLars Ellenberg GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED) 277*ec2c35acSLars Ellenberg GENL_tla_expected(DRBD_NLA_SYNCER_CONF, GENLA_F_MANDATORY) 278*ec2c35acSLars Ellenberg ) 279*ec2c35acSLars Ellenberg 280*ec2c35acSLars Ellenberg GENL_op( 281*ec2c35acSLars Ellenberg DRBD_ADM_CONNECT, 10, 282*ec2c35acSLars Ellenberg GENL_doit(drbd_adm_connect), 283*ec2c35acSLars Ellenberg GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED) 284*ec2c35acSLars Ellenberg GENL_tla_expected(DRBD_NLA_NET_CONF, GENLA_F_REQUIRED) 285*ec2c35acSLars Ellenberg ) 286*ec2c35acSLars Ellenberg 287*ec2c35acSLars Ellenberg GENL_op(DRBD_ADM_DISCONNECT, 11, GENL_doit(drbd_adm_disconnect), 288*ec2c35acSLars Ellenberg GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED)) 289*ec2c35acSLars Ellenberg 290*ec2c35acSLars Ellenberg /* operates on minors */ 291*ec2c35acSLars Ellenberg GENL_op(DRBD_ADM_ATTACH, 12, 292*ec2c35acSLars Ellenberg GENL_doit(drbd_adm_attach), 293*ec2c35acSLars Ellenberg GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED) 294*ec2c35acSLars Ellenberg GENL_tla_expected(DRBD_NLA_DISK_CONF, GENLA_F_REQUIRED) 295*ec2c35acSLars Ellenberg ) 296*ec2c35acSLars Ellenberg 297*ec2c35acSLars Ellenberg GENL_op( 298*ec2c35acSLars Ellenberg DRBD_ADM_RESIZE, 13, 299*ec2c35acSLars Ellenberg GENL_doit(drbd_adm_resize), 300*ec2c35acSLars Ellenberg GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED) 301*ec2c35acSLars Ellenberg GENL_tla_expected(DRBD_NLA_RESIZE_PARMS, GENLA_F_MANDATORY) 302*ec2c35acSLars Ellenberg ) 303*ec2c35acSLars Ellenberg 304*ec2c35acSLars Ellenberg /* operates on all volumes within a resource */ 305*ec2c35acSLars Ellenberg GENL_op( 306*ec2c35acSLars Ellenberg DRBD_ADM_PRIMARY, 14, 307*ec2c35acSLars Ellenberg GENL_doit(drbd_adm_set_role), 308*ec2c35acSLars Ellenberg GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED) 309*ec2c35acSLars Ellenberg GENL_tla_expected(DRBD_NLA_SET_ROLE_PARMS, GENLA_F_REQUIRED) 310*ec2c35acSLars Ellenberg ) 311*ec2c35acSLars Ellenberg 312*ec2c35acSLars Ellenberg GENL_op( 313*ec2c35acSLars Ellenberg DRBD_ADM_SECONDARY, 15, 314*ec2c35acSLars Ellenberg GENL_doit(drbd_adm_set_role), 315*ec2c35acSLars Ellenberg GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED) 316*ec2c35acSLars Ellenberg GENL_tla_expected(DRBD_NLA_SET_ROLE_PARMS, GENLA_F_REQUIRED) 317*ec2c35acSLars Ellenberg ) 318*ec2c35acSLars Ellenberg 319*ec2c35acSLars Ellenberg GENL_op( 320*ec2c35acSLars Ellenberg DRBD_ADM_NEW_C_UUID, 16, 321*ec2c35acSLars Ellenberg GENL_doit(drbd_adm_new_c_uuid), 322*ec2c35acSLars Ellenberg GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED) 323*ec2c35acSLars Ellenberg GENL_tla_expected(DRBD_NLA_NEW_C_UUID_PARMS, GENLA_F_MANDATORY) 324*ec2c35acSLars Ellenberg ) 325*ec2c35acSLars Ellenberg 326*ec2c35acSLars Ellenberg GENL_op( 327*ec2c35acSLars Ellenberg DRBD_ADM_START_OV, 17, 328*ec2c35acSLars Ellenberg GENL_doit(drbd_adm_start_ov), 329*ec2c35acSLars Ellenberg GENL_tla_expected(DRBD_NLA_START_OV_PARMS, GENLA_F_MANDATORY) 330*ec2c35acSLars Ellenberg ) 331*ec2c35acSLars Ellenberg 332*ec2c35acSLars Ellenberg GENL_op(DRBD_ADM_DETACH, 18, GENL_doit(drbd_adm_detach), 333*ec2c35acSLars Ellenberg GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED)) 334*ec2c35acSLars Ellenberg GENL_op(DRBD_ADM_INVALIDATE, 19, GENL_doit(drbd_adm_invalidate), 335*ec2c35acSLars Ellenberg GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED)) 336*ec2c35acSLars Ellenberg GENL_op(DRBD_ADM_INVAL_PEER, 20, GENL_doit(drbd_adm_invalidate_peer), 337*ec2c35acSLars Ellenberg GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED)) 338*ec2c35acSLars Ellenberg GENL_op(DRBD_ADM_PAUSE_SYNC, 21, GENL_doit(drbd_adm_pause_sync), 339*ec2c35acSLars Ellenberg GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED)) 340*ec2c35acSLars Ellenberg GENL_op(DRBD_ADM_RESUME_SYNC, 22, GENL_doit(drbd_adm_resume_sync), 341*ec2c35acSLars Ellenberg GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED)) 342*ec2c35acSLars Ellenberg GENL_op(DRBD_ADM_SUSPEND_IO, 23, GENL_doit(drbd_adm_suspend_io), 343*ec2c35acSLars Ellenberg GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED)) 344*ec2c35acSLars Ellenberg GENL_op(DRBD_ADM_RESUME_IO, 24, GENL_doit(drbd_adm_resume_io), 345*ec2c35acSLars Ellenberg GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED)) 346*ec2c35acSLars Ellenberg GENL_op(DRBD_ADM_OUTDATE, 25, GENL_doit(drbd_adm_outdate), 347*ec2c35acSLars Ellenberg GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED)) 348*ec2c35acSLars Ellenberg GENL_op(DRBD_ADM_GET_TIMEOUT_TYPE, 26, GENL_doit(drbd_adm_get_timeout_type), 349*ec2c35acSLars Ellenberg GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED)) 350