Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * General overview:
0004  * full generic netlink message:
0005  * |nlmsghdr|genlmsghdr|<payload>
0006  *
0007  * payload:
0008  * |optional fixed size family header|<sequence of netlink attributes>
0009  *
0010  * sequence of netlink attributes:
0011  * I chose to have all "top level" attributes NLA_NESTED,
0012  * corresponding to some real struct.
0013  * So we have a sequence of |tla, len|<nested nla sequence>
0014  *
0015  * nested nla sequence:
0016  * may be empty, or contain a sequence of netlink attributes
0017  * representing the struct fields.
0018  *
0019  * The tag number of any field (regardless of containing struct)
0020  * will be available as T_ ## field_name,
0021  * so you cannot have the same field name in two differnt structs.
0022  *
0023  * The tag numbers themselves are per struct, though,
0024  * so should always begin at 1 (not 0, that is the special "NLA_UNSPEC" type,
0025  * which we won't use here).
0026  * The tag numbers are used as index in the respective nla_policy array.
0027  *
0028  * GENL_struct(tag_name, tag_number, struct name, struct fields) - struct and policy
0029  *  genl_magic_struct.h
0030  *      generates the struct declaration,
0031  *      generates an entry in the tla enum,
0032  *  genl_magic_func.h
0033  *      generates an entry in the static tla policy
0034  *      with .type = NLA_NESTED
0035  *      generates the static <struct_name>_nl_policy definition,
0036  *      and static conversion functions
0037  *
0038  *  genl_magic_func.h
0039  *
0040  * GENL_mc_group(group)
0041  *  genl_magic_struct.h
0042  *      does nothing
0043  *  genl_magic_func.h
0044  *      defines and registers the mcast group,
0045  *      and provides a send helper
0046  *
0047  * GENL_notification(op_name, op_num, mcast_group, tla list)
0048  *  These are notifications to userspace.
0049  *
0050  *  genl_magic_struct.h
0051  *      generates an entry in the genl_ops enum,
0052  *  genl_magic_func.h
0053  *      does nothing
0054  *
0055  *  mcast group: the name of the mcast group this notification should be
0056  *  expected on
0057  *  tla list: the list of expected top level attributes,
0058  *  for documentation and sanity checking.
0059  *
0060  * GENL_op(op_name, op_num, flags and handler, tla list) - "genl operations"
0061  *  These are requests from userspace.
0062  *
0063  *  _op and _notification share the same "number space",
0064  *  op_nr will be assigned to "genlmsghdr->cmd"
0065  *
0066  *  genl_magic_struct.h
0067  *      generates an entry in the genl_ops enum,
0068  *  genl_magic_func.h
0069  *      generates an entry in the static genl_ops array,
0070  *      and static register/unregister functions to
0071  *      genl_register_family().
0072  *
0073  *  flags and handler:
0074  *      GENL_op_init( .doit = x, .dumpit = y, .flags = something)
0075  *      GENL_doit(x) => .dumpit = NULL, .flags = GENL_ADMIN_PERM
0076  *  tla list: the list of expected top level attributes,
0077  *  for documentation and sanity checking.
0078  */
0079 
0080 /*
0081  * STRUCTS
0082  */
0083 
0084 /* this is sent kernel -> userland on various error conditions, and contains
0085  * informational textual info, which is supposedly human readable.
0086  * The computer relevant return code is in the drbd_genlmsghdr.
0087  */
0088 GENL_struct(DRBD_NLA_CFG_REPLY, 1, drbd_cfg_reply,
0089         /* "arbitrary" size strings, nla_policy.len = 0 */
0090     __str_field(1, DRBD_GENLA_F_MANDATORY,  info_text, 0)
0091 )
0092 
0093 /* Configuration requests typically need a context to operate on.
0094  * Possible keys are device minor (fits in the drbd_genlmsghdr),
0095  * the replication link (aka connection) name,
0096  * and/or the replication group (aka resource) name,
0097  * and the volume id within the resource. */
0098 GENL_struct(DRBD_NLA_CFG_CONTEXT, 2, drbd_cfg_context,
0099     __u32_field(1, DRBD_GENLA_F_MANDATORY,  ctx_volume)
0100     __str_field(2, DRBD_GENLA_F_MANDATORY,  ctx_resource_name, 128)
0101     __bin_field(3, DRBD_GENLA_F_MANDATORY,  ctx_my_addr, 128)
0102     __bin_field(4, DRBD_GENLA_F_MANDATORY,  ctx_peer_addr, 128)
0103 )
0104 
0105 GENL_struct(DRBD_NLA_DISK_CONF, 3, disk_conf,
0106     __str_field(1, DRBD_F_REQUIRED | DRBD_F_INVARIANT,  backing_dev,    128)
0107     __str_field(2, DRBD_F_REQUIRED | DRBD_F_INVARIANT,  meta_dev,   128)
0108     __s32_field(3, DRBD_F_REQUIRED | DRBD_F_INVARIANT,  meta_dev_idx)
0109 
0110     /* use the resize command to try and change the disk_size */
0111     __u64_field(4, DRBD_GENLA_F_MANDATORY | DRBD_F_INVARIANT,   disk_size)
0112     /* we could change the max_bio_bvecs,
0113      * but it won't propagate through the stack */
0114     __u32_field(5, DRBD_GENLA_F_MANDATORY | DRBD_F_INVARIANT,   max_bio_bvecs)
0115 
0116     __u32_field_def(6, DRBD_GENLA_F_MANDATORY,  on_io_error, DRBD_ON_IO_ERROR_DEF)
0117     __u32_field_def(7, DRBD_GENLA_F_MANDATORY,  fencing, DRBD_FENCING_DEF)
0118 
0119     __u32_field_def(8,  DRBD_GENLA_F_MANDATORY, resync_rate, DRBD_RESYNC_RATE_DEF)
0120     __s32_field_def(9,  DRBD_GENLA_F_MANDATORY, resync_after, DRBD_MINOR_NUMBER_DEF)
0121     __u32_field_def(10, DRBD_GENLA_F_MANDATORY, al_extents, DRBD_AL_EXTENTS_DEF)
0122     __u32_field_def(11, DRBD_GENLA_F_MANDATORY, c_plan_ahead, DRBD_C_PLAN_AHEAD_DEF)
0123     __u32_field_def(12, DRBD_GENLA_F_MANDATORY, c_delay_target, DRBD_C_DELAY_TARGET_DEF)
0124     __u32_field_def(13, DRBD_GENLA_F_MANDATORY, c_fill_target, DRBD_C_FILL_TARGET_DEF)
0125     __u32_field_def(14, DRBD_GENLA_F_MANDATORY, c_max_rate, DRBD_C_MAX_RATE_DEF)
0126     __u32_field_def(15, DRBD_GENLA_F_MANDATORY, c_min_rate, DRBD_C_MIN_RATE_DEF)
0127     __u32_field_def(20,     DRBD_GENLA_F_MANDATORY, disk_timeout, DRBD_DISK_TIMEOUT_DEF)
0128     __u32_field_def(21,     0 /* OPTIONAL */,       read_balancing, DRBD_READ_BALANCING_DEF)
0129     __u32_field_def(25,     0 /* OPTIONAL */,       rs_discard_granularity, DRBD_RS_DISCARD_GRANULARITY_DEF)
0130 
0131     __flg_field_def(16, DRBD_GENLA_F_MANDATORY, disk_barrier, DRBD_DISK_BARRIER_DEF)
0132     __flg_field_def(17, DRBD_GENLA_F_MANDATORY, disk_flushes, DRBD_DISK_FLUSHES_DEF)
0133     __flg_field_def(18, DRBD_GENLA_F_MANDATORY, disk_drain, DRBD_DISK_DRAIN_DEF)
0134     __flg_field_def(19, DRBD_GENLA_F_MANDATORY, md_flushes, DRBD_MD_FLUSHES_DEF)
0135     __flg_field_def(23,     0 /* OPTIONAL */,   al_updates, DRBD_AL_UPDATES_DEF)
0136     __flg_field_def(24,     0 /* OPTIONAL */,   discard_zeroes_if_aligned, DRBD_DISCARD_ZEROES_IF_ALIGNED_DEF)
0137     __flg_field_def(26,     0 /* OPTIONAL */,   disable_write_same, DRBD_DISABLE_WRITE_SAME_DEF)
0138 )
0139 
0140 GENL_struct(DRBD_NLA_RESOURCE_OPTS, 4, res_opts,
0141     __str_field_def(1,  DRBD_GENLA_F_MANDATORY, cpu_mask,       DRBD_CPU_MASK_SIZE)
0142     __u32_field_def(2,  DRBD_GENLA_F_MANDATORY, on_no_data, DRBD_ON_NO_DATA_DEF)
0143 )
0144 
0145 GENL_struct(DRBD_NLA_NET_CONF, 5, net_conf,
0146     __str_field_def(1,  DRBD_GENLA_F_MANDATORY | DRBD_F_SENSITIVE,
0147                         shared_secret,  SHARED_SECRET_MAX)
0148     __str_field_def(2,  DRBD_GENLA_F_MANDATORY, cram_hmac_alg,  SHARED_SECRET_MAX)
0149     __str_field_def(3,  DRBD_GENLA_F_MANDATORY, integrity_alg,  SHARED_SECRET_MAX)
0150     __str_field_def(4,  DRBD_GENLA_F_MANDATORY, verify_alg,     SHARED_SECRET_MAX)
0151     __str_field_def(5,  DRBD_GENLA_F_MANDATORY, csums_alg,  SHARED_SECRET_MAX)
0152     __u32_field_def(6,  DRBD_GENLA_F_MANDATORY, wire_protocol, DRBD_PROTOCOL_DEF)
0153     __u32_field_def(7,  DRBD_GENLA_F_MANDATORY, connect_int, DRBD_CONNECT_INT_DEF)
0154     __u32_field_def(8,  DRBD_GENLA_F_MANDATORY, timeout, DRBD_TIMEOUT_DEF)
0155     __u32_field_def(9,  DRBD_GENLA_F_MANDATORY, ping_int, DRBD_PING_INT_DEF)
0156     __u32_field_def(10, DRBD_GENLA_F_MANDATORY, ping_timeo, DRBD_PING_TIMEO_DEF)
0157     __u32_field_def(11, DRBD_GENLA_F_MANDATORY, sndbuf_size, DRBD_SNDBUF_SIZE_DEF)
0158     __u32_field_def(12, DRBD_GENLA_F_MANDATORY, rcvbuf_size, DRBD_RCVBUF_SIZE_DEF)
0159     __u32_field_def(13, DRBD_GENLA_F_MANDATORY, ko_count, DRBD_KO_COUNT_DEF)
0160     __u32_field_def(14, DRBD_GENLA_F_MANDATORY, max_buffers, DRBD_MAX_BUFFERS_DEF)
0161     __u32_field_def(15, DRBD_GENLA_F_MANDATORY, max_epoch_size, DRBD_MAX_EPOCH_SIZE_DEF)
0162     __u32_field_def(16, DRBD_GENLA_F_MANDATORY, unplug_watermark, DRBD_UNPLUG_WATERMARK_DEF)
0163     __u32_field_def(17, DRBD_GENLA_F_MANDATORY, after_sb_0p, DRBD_AFTER_SB_0P_DEF)
0164     __u32_field_def(18, DRBD_GENLA_F_MANDATORY, after_sb_1p, DRBD_AFTER_SB_1P_DEF)
0165     __u32_field_def(19, DRBD_GENLA_F_MANDATORY, after_sb_2p, DRBD_AFTER_SB_2P_DEF)
0166     __u32_field_def(20, DRBD_GENLA_F_MANDATORY, rr_conflict, DRBD_RR_CONFLICT_DEF)
0167     __u32_field_def(21, DRBD_GENLA_F_MANDATORY, on_congestion, DRBD_ON_CONGESTION_DEF)
0168     __u32_field_def(22, DRBD_GENLA_F_MANDATORY, cong_fill, DRBD_CONG_FILL_DEF)
0169     __u32_field_def(23, DRBD_GENLA_F_MANDATORY, cong_extents, DRBD_CONG_EXTENTS_DEF)
0170     __flg_field_def(24, DRBD_GENLA_F_MANDATORY, two_primaries, DRBD_ALLOW_TWO_PRIMARIES_DEF)
0171     __flg_field(25, DRBD_GENLA_F_MANDATORY | DRBD_F_INVARIANT,  discard_my_data)
0172     __flg_field_def(26, DRBD_GENLA_F_MANDATORY, tcp_cork, DRBD_TCP_CORK_DEF)
0173     __flg_field_def(27, DRBD_GENLA_F_MANDATORY, always_asbp, DRBD_ALWAYS_ASBP_DEF)
0174     __flg_field(28, DRBD_GENLA_F_MANDATORY | DRBD_F_INVARIANT,  tentative)
0175     __flg_field_def(29, DRBD_GENLA_F_MANDATORY, use_rle, DRBD_USE_RLE_DEF)
0176     /* 9: __u32_field_def(30,   DRBD_GENLA_F_MANDATORY, fencing_policy, DRBD_FENCING_DEF) */
0177     /* 9: __str_field_def(31,     DRBD_GENLA_F_MANDATORY, name, SHARED_SECRET_MAX) */
0178     /* 9: __u32_field(32,         DRBD_F_REQUIRED | DRBD_F_INVARIANT,     peer_node_id) */
0179     __flg_field_def(33, 0 /* OPTIONAL */,   csums_after_crash_only, DRBD_CSUMS_AFTER_CRASH_ONLY_DEF)
0180     __u32_field_def(34, 0 /* OPTIONAL */, sock_check_timeo, DRBD_SOCKET_CHECK_TIMEO_DEF)
0181 )
0182 
0183 GENL_struct(DRBD_NLA_SET_ROLE_PARMS, 6, set_role_parms,
0184     __flg_field(1, DRBD_GENLA_F_MANDATORY,  assume_uptodate)
0185 )
0186 
0187 GENL_struct(DRBD_NLA_RESIZE_PARMS, 7, resize_parms,
0188     __u64_field(1, DRBD_GENLA_F_MANDATORY,  resize_size)
0189     __flg_field(2, DRBD_GENLA_F_MANDATORY,  resize_force)
0190     __flg_field(3, DRBD_GENLA_F_MANDATORY,  no_resync)
0191     __u32_field_def(4, 0 /* OPTIONAL */, al_stripes, DRBD_AL_STRIPES_DEF)
0192     __u32_field_def(5, 0 /* OPTIONAL */, al_stripe_size, DRBD_AL_STRIPE_SIZE_DEF)
0193 )
0194 
0195 GENL_struct(DRBD_NLA_STATE_INFO, 8, state_info,
0196     /* the reason of the broadcast,
0197      * if this is an event triggered broadcast. */
0198     __u32_field(1, DRBD_GENLA_F_MANDATORY,  sib_reason)
0199     __u32_field(2, DRBD_F_REQUIRED, current_state)
0200     __u64_field(3, DRBD_GENLA_F_MANDATORY,  capacity)
0201     __u64_field(4, DRBD_GENLA_F_MANDATORY,  ed_uuid)
0202 
0203     /* These are for broadcast from after state change work.
0204      * prev_state and new_state are from the moment the state change took
0205      * place, new_state is not neccessarily the same as current_state,
0206      * there may have been more state changes since.  Which will be
0207      * broadcasted soon, in their respective after state change work.  */
0208     __u32_field(5, DRBD_GENLA_F_MANDATORY,  prev_state)
0209     __u32_field(6, DRBD_GENLA_F_MANDATORY,  new_state)
0210 
0211     /* if we have a local disk: */
0212     __bin_field(7, DRBD_GENLA_F_MANDATORY,  uuids, (UI_SIZE*sizeof(__u64)))
0213     __u32_field(8, DRBD_GENLA_F_MANDATORY,  disk_flags)
0214     __u64_field(9, DRBD_GENLA_F_MANDATORY,  bits_total)
0215     __u64_field(10, DRBD_GENLA_F_MANDATORY, bits_oos)
0216     /* and in case resync or online verify is active */
0217     __u64_field(11, DRBD_GENLA_F_MANDATORY, bits_rs_total)
0218     __u64_field(12, DRBD_GENLA_F_MANDATORY, bits_rs_failed)
0219 
0220     /* for pre and post notifications of helper execution */
0221     __str_field(13, DRBD_GENLA_F_MANDATORY, helper, 32)
0222     __u32_field(14, DRBD_GENLA_F_MANDATORY, helper_exit_code)
0223 
0224     __u64_field(15,                      0, send_cnt)
0225     __u64_field(16,                      0, recv_cnt)
0226     __u64_field(17,                      0, read_cnt)
0227     __u64_field(18,                      0, writ_cnt)
0228     __u64_field(19,                      0, al_writ_cnt)
0229     __u64_field(20,                      0, bm_writ_cnt)
0230     __u32_field(21,                      0, ap_bio_cnt)
0231     __u32_field(22,                      0, ap_pending_cnt)
0232     __u32_field(23,                      0, rs_pending_cnt)
0233 )
0234 
0235 GENL_struct(DRBD_NLA_START_OV_PARMS, 9, start_ov_parms,
0236     __u64_field(1, DRBD_GENLA_F_MANDATORY,  ov_start_sector)
0237     __u64_field(2, DRBD_GENLA_F_MANDATORY,  ov_stop_sector)
0238 )
0239 
0240 GENL_struct(DRBD_NLA_NEW_C_UUID_PARMS, 10, new_c_uuid_parms,
0241     __flg_field(1, DRBD_GENLA_F_MANDATORY, clear_bm)
0242 )
0243 
0244 GENL_struct(DRBD_NLA_TIMEOUT_PARMS, 11, timeout_parms,
0245     __u32_field(1,  DRBD_F_REQUIRED,    timeout_type)
0246 )
0247 
0248 GENL_struct(DRBD_NLA_DISCONNECT_PARMS, 12, disconnect_parms,
0249     __flg_field(1, DRBD_GENLA_F_MANDATORY,  force_disconnect)
0250 )
0251 
0252 GENL_struct(DRBD_NLA_DETACH_PARMS, 13, detach_parms,
0253     __flg_field(1, DRBD_GENLA_F_MANDATORY,  force_detach)
0254 )
0255 
0256 GENL_struct(DRBD_NLA_RESOURCE_INFO, 15, resource_info,
0257     __u32_field(1, 0, res_role)
0258     __flg_field(2, 0, res_susp)
0259     __flg_field(3, 0, res_susp_nod)
0260     __flg_field(4, 0, res_susp_fen)
0261     /* __flg_field(5, 0, res_weak) */
0262 )
0263 
0264 GENL_struct(DRBD_NLA_DEVICE_INFO, 16, device_info,
0265     __u32_field(1, 0, dev_disk_state)
0266 )
0267 
0268 GENL_struct(DRBD_NLA_CONNECTION_INFO, 17, connection_info,
0269     __u32_field(1, 0, conn_connection_state)
0270     __u32_field(2, 0, conn_role)
0271 )
0272 
0273 GENL_struct(DRBD_NLA_PEER_DEVICE_INFO, 18, peer_device_info,
0274     __u32_field(1, 0, peer_repl_state)
0275     __u32_field(2, 0, peer_disk_state)
0276     __u32_field(3, 0, peer_resync_susp_user)
0277     __u32_field(4, 0, peer_resync_susp_peer)
0278     __u32_field(5, 0, peer_resync_susp_dependency)
0279 )
0280 
0281 GENL_struct(DRBD_NLA_RESOURCE_STATISTICS, 19, resource_statistics,
0282     __u32_field(1, 0, res_stat_write_ordering)
0283 )
0284 
0285 GENL_struct(DRBD_NLA_DEVICE_STATISTICS, 20, device_statistics,
0286     __u64_field(1, 0, dev_size)  /* (sectors) */
0287     __u64_field(2, 0, dev_read)  /* (sectors) */
0288     __u64_field(3, 0, dev_write)  /* (sectors) */
0289     __u64_field(4, 0, dev_al_writes)  /* activity log writes (count) */
0290     __u64_field(5, 0, dev_bm_writes)  /*  bitmap writes  (count) */
0291     __u32_field(6, 0, dev_upper_pending)  /* application requests in progress */
0292     __u32_field(7, 0, dev_lower_pending)  /* backing device requests in progress */
0293     __flg_field(8, 0, dev_upper_blocked)
0294     __flg_field(9, 0, dev_lower_blocked)
0295     __flg_field(10, 0, dev_al_suspended)  /* activity log suspended */
0296     __u64_field(11, 0, dev_exposed_data_uuid)
0297     __u64_field(12, 0, dev_current_uuid)
0298     __u32_field(13, 0, dev_disk_flags)
0299     __bin_field(14, 0, history_uuids, HISTORY_UUIDS * sizeof(__u64))
0300 )
0301 
0302 GENL_struct(DRBD_NLA_CONNECTION_STATISTICS, 21, connection_statistics,
0303     __flg_field(1, 0, conn_congested)
0304 )
0305 
0306 GENL_struct(DRBD_NLA_PEER_DEVICE_STATISTICS, 22, peer_device_statistics,
0307     __u64_field(1, 0, peer_dev_received)  /* sectors */
0308     __u64_field(2, 0, peer_dev_sent)  /* sectors */
0309     __u32_field(3, 0, peer_dev_pending)  /* number of requests */
0310     __u32_field(4, 0, peer_dev_unacked)  /* number of requests */
0311     __u64_field(5, 0, peer_dev_out_of_sync)  /* sectors */
0312     __u64_field(6, 0, peer_dev_resync_failed)  /* sectors */
0313     __u64_field(7, 0, peer_dev_bitmap_uuid)
0314     __u32_field(9, 0, peer_dev_flags)
0315 )
0316 
0317 GENL_struct(DRBD_NLA_NOTIFICATION_HEADER, 23, drbd_notification_header,
0318     __u32_field(1, DRBD_GENLA_F_MANDATORY, nh_type)
0319 )
0320 
0321 GENL_struct(DRBD_NLA_HELPER, 24, drbd_helper_info,
0322     __str_field(1, DRBD_GENLA_F_MANDATORY, helper_name, 32)
0323     __u32_field(2, DRBD_GENLA_F_MANDATORY, helper_status)
0324 )
0325 
0326 /*
0327  * Notifications and commands (genlmsghdr->cmd)
0328  */
0329 GENL_mc_group(events)
0330 
0331     /* kernel -> userspace announcement of changes */
0332 GENL_notification(
0333     DRBD_EVENT, 1, events,
0334     GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED)
0335     GENL_tla_expected(DRBD_NLA_STATE_INFO, DRBD_F_REQUIRED)
0336     GENL_tla_expected(DRBD_NLA_NET_CONF, DRBD_GENLA_F_MANDATORY)
0337     GENL_tla_expected(DRBD_NLA_DISK_CONF, DRBD_GENLA_F_MANDATORY)
0338     GENL_tla_expected(DRBD_NLA_SYNCER_CONF, DRBD_GENLA_F_MANDATORY)
0339 )
0340 
0341     /* query kernel for specific or all info */
0342 GENL_op(
0343     DRBD_ADM_GET_STATUS, 2,
0344     GENL_op_init(
0345         .doit = drbd_adm_get_status,
0346         .dumpit = drbd_adm_get_status_all,
0347         /* anyone may ask for the status,
0348          * it is broadcasted anyways */
0349     ),
0350     /* To select the object .doit.
0351      * Or a subset of objects in .dumpit. */
0352     GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_GENLA_F_MANDATORY)
0353 )
0354 
0355     /* add DRBD minor devices as volumes to resources */
0356 GENL_op(DRBD_ADM_NEW_MINOR, 5, GENL_doit(drbd_adm_new_minor),
0357     GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED))
0358 GENL_op(DRBD_ADM_DEL_MINOR, 6, GENL_doit(drbd_adm_del_minor),
0359     GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED))
0360 
0361     /* add or delete resources */
0362 GENL_op(DRBD_ADM_NEW_RESOURCE, 7, GENL_doit(drbd_adm_new_resource),
0363     GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED))
0364 GENL_op(DRBD_ADM_DEL_RESOURCE, 8, GENL_doit(drbd_adm_del_resource),
0365     GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED))
0366 
0367 GENL_op(DRBD_ADM_RESOURCE_OPTS, 9,
0368     GENL_doit(drbd_adm_resource_opts),
0369     GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED)
0370     GENL_tla_expected(DRBD_NLA_RESOURCE_OPTS, DRBD_GENLA_F_MANDATORY)
0371 )
0372 
0373 GENL_op(
0374     DRBD_ADM_CONNECT, 10,
0375     GENL_doit(drbd_adm_connect),
0376     GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED)
0377     GENL_tla_expected(DRBD_NLA_NET_CONF, DRBD_F_REQUIRED)
0378 )
0379 
0380 GENL_op(
0381     DRBD_ADM_CHG_NET_OPTS, 29,
0382     GENL_doit(drbd_adm_net_opts),
0383     GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED)
0384     GENL_tla_expected(DRBD_NLA_NET_CONF, DRBD_F_REQUIRED)
0385 )
0386 
0387 GENL_op(DRBD_ADM_DISCONNECT, 11, GENL_doit(drbd_adm_disconnect),
0388     GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED))
0389 
0390 GENL_op(DRBD_ADM_ATTACH, 12,
0391     GENL_doit(drbd_adm_attach),
0392     GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED)
0393     GENL_tla_expected(DRBD_NLA_DISK_CONF, DRBD_F_REQUIRED)
0394 )
0395 
0396 GENL_op(DRBD_ADM_CHG_DISK_OPTS, 28,
0397     GENL_doit(drbd_adm_disk_opts),
0398     GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED)
0399     GENL_tla_expected(DRBD_NLA_DISK_OPTS, DRBD_F_REQUIRED)
0400 )
0401 
0402 GENL_op(
0403     DRBD_ADM_RESIZE, 13,
0404     GENL_doit(drbd_adm_resize),
0405     GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED)
0406     GENL_tla_expected(DRBD_NLA_RESIZE_PARMS, DRBD_GENLA_F_MANDATORY)
0407 )
0408 
0409 GENL_op(
0410     DRBD_ADM_PRIMARY, 14,
0411     GENL_doit(drbd_adm_set_role),
0412     GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED)
0413     GENL_tla_expected(DRBD_NLA_SET_ROLE_PARMS, DRBD_F_REQUIRED)
0414 )
0415 
0416 GENL_op(
0417     DRBD_ADM_SECONDARY, 15,
0418     GENL_doit(drbd_adm_set_role),
0419     GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED)
0420     GENL_tla_expected(DRBD_NLA_SET_ROLE_PARMS, DRBD_F_REQUIRED)
0421 )
0422 
0423 GENL_op(
0424     DRBD_ADM_NEW_C_UUID, 16,
0425     GENL_doit(drbd_adm_new_c_uuid),
0426     GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED)
0427     GENL_tla_expected(DRBD_NLA_NEW_C_UUID_PARMS, DRBD_GENLA_F_MANDATORY)
0428 )
0429 
0430 GENL_op(
0431     DRBD_ADM_START_OV, 17,
0432     GENL_doit(drbd_adm_start_ov),
0433     GENL_tla_expected(DRBD_NLA_START_OV_PARMS, DRBD_GENLA_F_MANDATORY)
0434 )
0435 
0436 GENL_op(DRBD_ADM_DETACH,    18, GENL_doit(drbd_adm_detach),
0437     GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED)
0438     GENL_tla_expected(DRBD_NLA_DETACH_PARMS, DRBD_GENLA_F_MANDATORY))
0439 
0440 GENL_op(DRBD_ADM_INVALIDATE,    19, GENL_doit(drbd_adm_invalidate),
0441     GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED))
0442 GENL_op(DRBD_ADM_INVAL_PEER,    20, GENL_doit(drbd_adm_invalidate_peer),
0443     GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED))
0444 GENL_op(DRBD_ADM_PAUSE_SYNC,    21, GENL_doit(drbd_adm_pause_sync),
0445     GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED))
0446 GENL_op(DRBD_ADM_RESUME_SYNC,   22, GENL_doit(drbd_adm_resume_sync),
0447     GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED))
0448 GENL_op(DRBD_ADM_SUSPEND_IO,    23, GENL_doit(drbd_adm_suspend_io),
0449     GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED))
0450 GENL_op(DRBD_ADM_RESUME_IO, 24, GENL_doit(drbd_adm_resume_io),
0451     GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED))
0452 GENL_op(DRBD_ADM_OUTDATE,   25, GENL_doit(drbd_adm_outdate),
0453     GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED))
0454 GENL_op(DRBD_ADM_GET_TIMEOUT_TYPE, 26, GENL_doit(drbd_adm_get_timeout_type),
0455     GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED))
0456 GENL_op(DRBD_ADM_DOWN,      27, GENL_doit(drbd_adm_down),
0457     GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED))
0458 
0459 GENL_op(DRBD_ADM_GET_RESOURCES, 30,
0460      GENL_op_init(
0461          .dumpit = drbd_adm_dump_resources,
0462      ),
0463      GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_GENLA_F_MANDATORY)
0464      GENL_tla_expected(DRBD_NLA_RESOURCE_INFO, DRBD_GENLA_F_MANDATORY)
0465      GENL_tla_expected(DRBD_NLA_RESOURCE_STATISTICS, DRBD_GENLA_F_MANDATORY))
0466 
0467 GENL_op(DRBD_ADM_GET_DEVICES, 31,
0468      GENL_op_init(
0469          .dumpit = drbd_adm_dump_devices,
0470          .done = drbd_adm_dump_devices_done,
0471      ),
0472      GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_GENLA_F_MANDATORY)
0473      GENL_tla_expected(DRBD_NLA_DEVICE_INFO, DRBD_GENLA_F_MANDATORY)
0474      GENL_tla_expected(DRBD_NLA_DEVICE_STATISTICS, DRBD_GENLA_F_MANDATORY))
0475 
0476 GENL_op(DRBD_ADM_GET_CONNECTIONS, 32,
0477      GENL_op_init(
0478          .dumpit = drbd_adm_dump_connections,
0479          .done = drbd_adm_dump_connections_done,
0480      ),
0481      GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_GENLA_F_MANDATORY)
0482      GENL_tla_expected(DRBD_NLA_CONNECTION_INFO, DRBD_GENLA_F_MANDATORY)
0483      GENL_tla_expected(DRBD_NLA_CONNECTION_STATISTICS, DRBD_GENLA_F_MANDATORY))
0484 
0485 GENL_op(DRBD_ADM_GET_PEER_DEVICES, 33,
0486      GENL_op_init(
0487          .dumpit = drbd_adm_dump_peer_devices,
0488          .done = drbd_adm_dump_peer_devices_done,
0489      ),
0490      GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_GENLA_F_MANDATORY)
0491      GENL_tla_expected(DRBD_NLA_PEER_DEVICE_INFO, DRBD_GENLA_F_MANDATORY)
0492      GENL_tla_expected(DRBD_NLA_PEER_DEVICE_STATISTICS, DRBD_GENLA_F_MANDATORY))
0493 
0494 GENL_notification(
0495     DRBD_RESOURCE_STATE, 34, events,
0496     GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED)
0497     GENL_tla_expected(DRBD_NLA_NOTIFICATION_HEADER, DRBD_F_REQUIRED)
0498     GENL_tla_expected(DRBD_NLA_RESOURCE_INFO, DRBD_F_REQUIRED)
0499     GENL_tla_expected(DRBD_NLA_RESOURCE_STATISTICS, DRBD_F_REQUIRED))
0500 
0501 GENL_notification(
0502     DRBD_DEVICE_STATE, 35, events,
0503     GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED)
0504     GENL_tla_expected(DRBD_NLA_NOTIFICATION_HEADER, DRBD_F_REQUIRED)
0505     GENL_tla_expected(DRBD_NLA_DEVICE_INFO, DRBD_F_REQUIRED)
0506     GENL_tla_expected(DRBD_NLA_DEVICE_STATISTICS, DRBD_F_REQUIRED))
0507 
0508 GENL_notification(
0509     DRBD_CONNECTION_STATE, 36, events,
0510     GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED)
0511     GENL_tla_expected(DRBD_NLA_NOTIFICATION_HEADER, DRBD_F_REQUIRED)
0512     GENL_tla_expected(DRBD_NLA_CONNECTION_INFO, DRBD_F_REQUIRED)
0513     GENL_tla_expected(DRBD_NLA_CONNECTION_STATISTICS, DRBD_F_REQUIRED))
0514 
0515 GENL_notification(
0516     DRBD_PEER_DEVICE_STATE, 37, events,
0517     GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED)
0518     GENL_tla_expected(DRBD_NLA_NOTIFICATION_HEADER, DRBD_F_REQUIRED)
0519     GENL_tla_expected(DRBD_NLA_PEER_DEVICE_INFO, DRBD_F_REQUIRED)
0520     GENL_tla_expected(DRBD_NLA_PEER_DEVICE_STATISTICS, DRBD_F_REQUIRED))
0521 
0522 GENL_op(
0523     DRBD_ADM_GET_INITIAL_STATE, 38,
0524     GENL_op_init(
0525             .dumpit = drbd_adm_get_initial_state,
0526     ),
0527     GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_GENLA_F_MANDATORY))
0528 
0529 GENL_notification(
0530     DRBD_HELPER, 40, events,
0531     GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, DRBD_F_REQUIRED)
0532     GENL_tla_expected(DRBD_NLA_HELPER, DRBD_F_REQUIRED))
0533 
0534 GENL_notification(
0535     DRBD_INITIAL_STATE_DONE, 41, events,
0536     GENL_tla_expected(DRBD_NLA_NOTIFICATION_HEADER, DRBD_F_REQUIRED))