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