drbd: Generate the drbd_set_*_defaults() functions from drbd_genl.h
authorAndreas Gruenbacher <agruen@linbit.com>
Tue, 3 May 2011 12:56:09 +0000 (14:56 +0200)
committerPhilipp Reisner <philipp.reisner@linbit.com>
Thu, 8 Nov 2012 15:55:38 +0000 (16:55 +0100)
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
drivers/block/drbd/drbd_int.h
drivers/block/drbd/drbd_main.c
drivers/block/drbd/drbd_nl.c
include/linux/drbd_genl.h
include/linux/genl_magic_func.h
include/linux/genl_magic_struct.h

index 44f7726..8655fcb 100644 (file)
@@ -1390,7 +1390,7 @@ extern int is_valid_ar_handle(struct drbd_request *, sector_t);
 
 
 /* drbd_nl.c */
-extern void drbd_set_res_opts_default(struct res_opts *r);
+extern void drbd_set_res_opts_defaults(struct res_opts *r);
 extern int drbd_msg_put_info(const char *info);
 extern void drbd_suspend_io(struct drbd_conf *mdev);
 extern void drbd_resume_io(struct drbd_conf *mdev);
index 427e959..4ae3e7a 100644 (file)
@@ -2488,7 +2488,7 @@ struct drbd_tconn *conn_create(const char *name)
        drbd_thread_init(tconn, &tconn->worker, drbd_worker, "worker");
        drbd_thread_init(tconn, &tconn->asender, drbd_asender, "asender");
 
-       drbd_set_res_opts_default(&tconn->res_opts);
+       drbd_set_res_opts_defaults(&tconn->res_opts);
 
        down_write(&drbd_cfg_rwsem);
        kref_init(&tconn->kref);
index 7320ac0..f5732cf 100644 (file)
@@ -1090,77 +1090,6 @@ static bool should_set_defaults(struct genl_info *info)
        return 0 != (flags & DRBD_GENL_F_SET_DEFAULTS);
 }
 
-/* Maybe we should we generate these functions
- * from the drbd_genl.h magic as well?
- * That way we would not "accidentally forget" to add defaults here. */
-
-#define RESET_ARRAY_FIELD(field) do { \
-       memset(field, 0, sizeof(field)); \
-       field ## _len = 0; \
-} while (0)
-void drbd_set_res_opts_default(struct res_opts *r)
-{
-       RESET_ARRAY_FIELD(r->cpu_mask);
-       r->on_no_data  = DRBD_ON_NO_DATA_DEF;
-}
-
-static void drbd_set_net_conf_defaults(struct net_conf *nc)
-{
-       /* Do NOT (re)set those fields marked as GENLA_F_INVARIANT
-        * in drbd_genl.h, they can only be change with disconnect/reconnect */
-       RESET_ARRAY_FIELD(nc->shared_secret);
-
-       RESET_ARRAY_FIELD(nc->cram_hmac_alg);
-       RESET_ARRAY_FIELD(nc->integrity_alg);
-       RESET_ARRAY_FIELD(nc->verify_alg);
-       RESET_ARRAY_FIELD(nc->csums_alg);
-#undef RESET_ARRAY_FIELD
-
-       nc->wire_protocol = DRBD_PROTOCOL_DEF;
-       nc->try_connect_int = DRBD_CONNECT_INT_DEF;
-       nc->timeout = DRBD_TIMEOUT_DEF;
-       nc->ping_int = DRBD_PING_INT_DEF;
-       nc->ping_timeo = DRBD_PING_TIMEO_DEF;
-       nc->sndbuf_size = DRBD_SNDBUF_SIZE_DEF;
-       nc->rcvbuf_size = DRBD_RCVBUF_SIZE_DEF;
-       nc->ko_count = DRBD_KO_COUNT_DEF;
-       nc->max_buffers = DRBD_MAX_BUFFERS_DEF;
-       nc->max_epoch_size = DRBD_MAX_EPOCH_SIZE_DEF;
-       nc->unplug_watermark = DRBD_UNPLUG_WATERMARK_DEF;
-       nc->after_sb_0p = DRBD_AFTER_SB_0P_DEF;
-       nc->after_sb_1p = DRBD_AFTER_SB_1P_DEF;
-       nc->after_sb_2p = DRBD_AFTER_SB_2P_DEF;
-       nc->rr_conflict = DRBD_RR_CONFLICT_DEF;
-       nc->on_congestion = DRBD_ON_CONGESTION_DEF;
-       nc->cong_fill = DRBD_CONG_FILL_DEF;
-       nc->cong_extents = DRBD_CONG_EXTENTS_DEF;
-       nc->two_primaries = 0;
-       nc->no_cork = 0;
-       nc->always_asbp = 0;
-       nc->use_rle = 0;
-}
-
-static void drbd_set_disk_conf_defaults(struct disk_conf *dc)
-{
-       /* Do NOT (re)set those fields marked as GENLA_F_INVARIANT
-        * in drbd_genl.h, they can only be change with detach/reattach */
-       dc->on_io_error = DRBD_ON_IO_ERROR_DEF;
-       dc->fencing = DRBD_FENCING_DEF;
-       dc->resync_rate = DRBD_RATE_DEF;
-       dc->resync_after = DRBD_AFTER_DEF;
-       dc->al_extents = DRBD_AL_EXTENTS_DEF;
-       dc->c_plan_ahead = DRBD_C_PLAN_AHEAD_DEF;
-       dc->c_delay_target = DRBD_C_DELAY_TARGET_DEF;
-       dc->c_fill_target = DRBD_C_FILL_TARGET_DEF;
-       dc->c_max_rate = DRBD_C_MAX_RATE_DEF;
-       dc->c_min_rate = DRBD_C_MIN_RATE_DEF;
-       dc->no_disk_barrier = 0;
-       dc->no_disk_flush = 0;
-       dc->no_disk_drain = 0;
-       dc->no_md_flush = 0;
-}
-
-
 int drbd_adm_disk_opts(struct sk_buff *skb, struct genl_info *info)
 {
        enum drbd_ret_code retcode;
@@ -1198,7 +1127,7 @@ int drbd_adm_disk_opts(struct sk_buff *skb, struct genl_info *info)
 
        memcpy(new_disk_conf, &mdev->ldev->dc, sizeof(*new_disk_conf));
        if (should_set_defaults(info))
-               drbd_set_disk_conf_defaults(new_disk_conf);
+               set_disk_conf_defaults(new_disk_conf);
 
        err = disk_conf_from_attrs_for_change(new_disk_conf, info);
        if (err) {
@@ -1315,7 +1244,7 @@ int drbd_adm_attach(struct sk_buff *skb, struct genl_info *info)
                goto fail;
        }
 
-       drbd_set_disk_conf_defaults(&nbc->dc);
+       set_disk_conf_defaults(&nbc->dc);
 
        err = disk_conf_from_attrs(&nbc->dc, info);
        if (err) {
@@ -1911,7 +1840,7 @@ int drbd_adm_net_opts(struct sk_buff *skb, struct genl_info *info)
 
        *new_conf = *old_conf;
        if (should_set_defaults(info))
-               drbd_set_net_conf_defaults(new_conf);
+               set_net_conf_defaults(new_conf);
 
        err = net_conf_from_attrs_for_change(new_conf, info);
        if (err) {
@@ -2029,7 +1958,7 @@ int drbd_adm_connect(struct sk_buff *skb, struct genl_info *info)
                goto fail;
        }
 
-       drbd_set_net_conf_defaults(new_conf);
+       set_net_conf_defaults(new_conf);
 
        err = net_conf_from_attrs(new_conf, info);
        if (err) {
@@ -2301,6 +2230,11 @@ int drbd_adm_resize(struct sk_buff *skb, struct genl_info *info)
        return 0;
 }
 
+void drbd_set_res_opts_defaults(struct res_opts *r)
+{
+       return set_res_opts_defaults(r);
+}
+
 int drbd_adm_resource_opts(struct sk_buff *skb, struct genl_info *info)
 {
        enum drbd_ret_code retcode;
@@ -2325,7 +2259,7 @@ int drbd_adm_resource_opts(struct sk_buff *skb, struct genl_info *info)
 
        res_opts = tconn->res_opts;
        if (should_set_defaults(info))
-               drbd_set_res_opts_default(&res_opts);
+               set_res_opts_defaults(&res_opts);
 
        err = res_opts_from_attrs(&res_opts, info);
        if (err) {
index 10144d5..5498006 100644 (file)
@@ -110,63 +110,62 @@ GENL_struct(DRBD_NLA_DISK_CONF, 3, disk_conf,
         * but it won't propagate through the stack */
        __u32_field(5, GENLA_F_MANDATORY | GENLA_F_INVARIANT,   max_bio_bvecs)
 
-       __u32_field(6, GENLA_F_MANDATORY,       on_io_error)
-       __u32_field(7, GENLA_F_MANDATORY,       fencing)
-
-       __u32_field(8,  GENLA_F_MANDATORY,      resync_rate)
-       __u32_field(9,  GENLA_F_MANDATORY,      resync_after)
-       __u32_field(10, GENLA_F_MANDATORY,      al_extents)
-       __u32_field(11, GENLA_F_MANDATORY,      c_plan_ahead)
-       __u32_field(12, GENLA_F_MANDATORY,      c_delay_target)
-       __u32_field(13, GENLA_F_MANDATORY,      c_fill_target)
-       __u32_field(14, GENLA_F_MANDATORY,      c_max_rate)
-       __u32_field(15, GENLA_F_MANDATORY,      c_min_rate)
-
-       __flg_field(16, GENLA_F_MANDATORY,      no_disk_barrier)
-       __flg_field(17, GENLA_F_MANDATORY,      no_disk_flush)
-       __flg_field(18, GENLA_F_MANDATORY,      no_disk_drain)
-       __flg_field(19, GENLA_F_MANDATORY,      no_md_flush)
-
+       __u32_field_def(6, GENLA_F_MANDATORY,   on_io_error, DRBD_ON_IO_ERROR_DEF)
+       __u32_field_def(7, GENLA_F_MANDATORY,   fencing, DRBD_FENCING_DEF)
+
+       __u32_field_def(8,      GENLA_F_MANDATORY,      resync_rate, DRBD_RATE_DEF)
+       __u32_field_def(9,      GENLA_F_MANDATORY,      resync_after, DRBD_AFTER_DEF)
+       __u32_field_def(10,     GENLA_F_MANDATORY,      al_extents, DRBD_AL_EXTENTS_DEF)
+       __u32_field_def(11,     GENLA_F_MANDATORY,      c_plan_ahead, DRBD_C_PLAN_AHEAD_DEF)
+       __u32_field_def(12,     GENLA_F_MANDATORY,      c_delay_target, DRBD_C_DELAY_TARGET_DEF)
+       __u32_field_def(13,     GENLA_F_MANDATORY,      c_fill_target, DRBD_C_FILL_TARGET_DEF)
+       __u32_field_def(14,     GENLA_F_MANDATORY,      c_max_rate, DRBD_C_MAX_RATE_DEF)
+       __u32_field_def(15,     GENLA_F_MANDATORY,      c_min_rate, DRBD_C_MIN_RATE_DEF)
+
+       __flg_field_def(16, GENLA_F_MANDATORY,  no_disk_barrier, 0)
+       __flg_field_def(17, GENLA_F_MANDATORY,  no_disk_flush, 0)
+       __flg_field_def(18, GENLA_F_MANDATORY,  no_disk_drain, 0)
+       __flg_field_def(19, GENLA_F_MANDATORY,  no_md_flush, 0)
 )
 
 GENL_struct(DRBD_NLA_RESOURCE_OPTS, 4, res_opts,
-       __str_field(1,  GENLA_F_MANDATORY,      cpu_mask,       32)
-       __u32_field(2,  GENLA_F_MANDATORY,      on_no_data)
+       __str_field_def(1,      GENLA_F_MANDATORY,      cpu_mask,       32)
+       __u32_field_def(2,      GENLA_F_MANDATORY,      on_no_data, DRBD_ON_NO_DATA_DEF)
 )
 
 GENL_struct(DRBD_NLA_NET_CONF, 5, net_conf,
        __bin_field(1,  GENLA_F_REQUIRED | GENLA_F_INVARIANT,   my_addr,        128)
        __bin_field(2,  GENLA_F_REQUIRED | GENLA_F_INVARIANT,   peer_addr,      128)
-       __str_field(3,  GENLA_F_MANDATORY | GENLA_F_SENSITIVE,
+       __str_field_def(3,      GENLA_F_MANDATORY | GENLA_F_SENSITIVE,
                                                shared_secret,  SHARED_SECRET_MAX)
-       __str_field(4,  GENLA_F_MANDATORY,      cram_hmac_alg,  SHARED_SECRET_MAX)
-       __str_field(5,  GENLA_F_MANDATORY,      integrity_alg,  SHARED_SECRET_MAX)
-       __str_field(6,  GENLA_F_MANDATORY,      verify_alg,     SHARED_SECRET_MAX)
-       __str_field(7,  GENLA_F_MANDATORY,      csums_alg,      SHARED_SECRET_MAX)
-       __u32_field(8,  GENLA_F_MANDATORY,      wire_protocol)
-       __u32_field(9,  GENLA_F_MANDATORY,      try_connect_int)
-       __u32_field(10, GENLA_F_MANDATORY,      timeout)
-       __u32_field(11, GENLA_F_MANDATORY,      ping_int)
-       __u32_field(12, GENLA_F_MANDATORY,      ping_timeo)
-       __u32_field(13, GENLA_F_MANDATORY,      sndbuf_size)
-       __u32_field(14, GENLA_F_MANDATORY,      rcvbuf_size)
-       __u32_field(15, GENLA_F_MANDATORY,      ko_count)
-       __u32_field(16, GENLA_F_MANDATORY,      max_buffers)
-       __u32_field(17, GENLA_F_MANDATORY,      max_epoch_size)
-       __u32_field(18, GENLA_F_MANDATORY,      unplug_watermark)
-       __u32_field(19, GENLA_F_MANDATORY,      after_sb_0p)
-       __u32_field(20, GENLA_F_MANDATORY,      after_sb_1p)
-       __u32_field(21, GENLA_F_MANDATORY,      after_sb_2p)
-       __u32_field(22, GENLA_F_MANDATORY,      rr_conflict)
-       __u32_field(23, GENLA_F_MANDATORY,      on_congestion)
-       __u32_field(24, GENLA_F_MANDATORY,      cong_fill)
-       __u32_field(25, GENLA_F_MANDATORY,      cong_extents)
-       __flg_field(26, GENLA_F_MANDATORY,      two_primaries)
+       __str_field_def(4,      GENLA_F_MANDATORY,      cram_hmac_alg,  SHARED_SECRET_MAX)
+       __str_field_def(5,      GENLA_F_MANDATORY,      integrity_alg,  SHARED_SECRET_MAX)
+       __str_field_def(6,      GENLA_F_MANDATORY,      verify_alg,     SHARED_SECRET_MAX)
+       __str_field_def(7,      GENLA_F_MANDATORY,      csums_alg,      SHARED_SECRET_MAX)
+       __u32_field_def(8,      GENLA_F_MANDATORY,      wire_protocol, DRBD_PROTOCOL_DEF)
+       __u32_field_def(9,      GENLA_F_MANDATORY,      try_connect_int, DRBD_CONNECT_INT_DEF)
+       __u32_field_def(10,     GENLA_F_MANDATORY,      timeout, DRBD_TIMEOUT_DEF)
+       __u32_field_def(11,     GENLA_F_MANDATORY,      ping_int, DRBD_PING_INT_DEF)
+       __u32_field_def(12,     GENLA_F_MANDATORY,      ping_timeo, DRBD_PING_TIMEO_DEF)
+       __u32_field_def(13,     GENLA_F_MANDATORY,      sndbuf_size, DRBD_SNDBUF_SIZE_DEF)
+       __u32_field_def(14,     GENLA_F_MANDATORY,      rcvbuf_size, DRBD_RCVBUF_SIZE_DEF)
+       __u32_field_def(15,     GENLA_F_MANDATORY,      ko_count, DRBD_KO_COUNT_DEF)
+       __u32_field_def(16,     GENLA_F_MANDATORY,      max_buffers, DRBD_MAX_BUFFERS_DEF)
+       __u32_field_def(17,     GENLA_F_MANDATORY,      max_epoch_size, DRBD_MAX_EPOCH_SIZE_DEF)
+       __u32_field_def(18,     GENLA_F_MANDATORY,      unplug_watermark, DRBD_UNPLUG_WATERMARK_DEF)
+       __u32_field_def(19,     GENLA_F_MANDATORY,      after_sb_0p, DRBD_AFTER_SB_0P_DEF)
+       __u32_field_def(20,     GENLA_F_MANDATORY,      after_sb_1p, DRBD_AFTER_SB_1P_DEF)
+       __u32_field_def(21,     GENLA_F_MANDATORY,      after_sb_2p, DRBD_AFTER_SB_2P_DEF)
+       __u32_field_def(22,     GENLA_F_MANDATORY,      rr_conflict, DRBD_RR_CONFLICT_DEF)
+       __u32_field_def(23,     GENLA_F_MANDATORY,      on_congestion, DRBD_ON_CONGESTION_DEF)
+       __u32_field_def(24,     GENLA_F_MANDATORY,      cong_fill, DRBD_CONG_FILL_DEF)
+       __u32_field_def(25,     GENLA_F_MANDATORY,      cong_extents, DRBD_CONG_EXTENTS_DEF)
+       __flg_field_def(26, GENLA_F_MANDATORY,  two_primaries, 0)
        __flg_field(27, GENLA_F_MANDATORY | GENLA_F_INVARIANT,  want_lose)
-       __flg_field(28, GENLA_F_MANDATORY,      no_cork)
-       __flg_field(29, GENLA_F_MANDATORY,      always_asbp)
+       __flg_field_def(28, GENLA_F_MANDATORY,  no_cork, 0)
+       __flg_field_def(29, GENLA_F_MANDATORY,  always_asbp, 0)
        __flg_field(30, GENLA_F_MANDATORY | GENLA_F_INVARIANT,  dry_run)
-       __flg_field(31, GENLA_F_MANDATORY,      use_rle)
+       __flg_field_def(31,     GENLA_F_MANDATORY,      use_rle, 0)
 )
 
 GENL_struct(DRBD_NLA_SET_ROLE_PARMS, 6, set_role_parms,
index e458282..e908f1c 100644 (file)
@@ -427,6 +427,32 @@ static inline int s_name ## _to_unpriv_skb(struct sk_buff *skb,            \
 
 #include GENL_MAGIC_INCLUDE_FILE
 
+
+/* Functions for initializing structs to default values.  */
+
+#undef __field
+#define __field(attr_nr, attr_flag, name, nla_type, type, __get, __put)
+#undef __array
+#define __array(attr_nr, attr_flag, name, nla_type, type, maxlen, __get, __put)
+#undef __u32_field_def
+#define __u32_field_def(attr_nr, attr_flag, name, default)             \
+       x->name = default;
+#undef __flg_field_def
+#define __flg_field_def(attr_nr, attr_flag, name, default)             \
+       x->name = default;
+#undef __str_field_def
+#define __str_field_def(attr_nr, attr_flag, name, maxlen)              \
+       memset(x->name, 0, sizeof(x->name));                            \
+       x->name ## _len = 0;
+#undef GENL_struct
+#define GENL_struct(tag_name, tag_number, s_name, s_fields)            \
+static void set_ ## s_name ## _defaults(struct s_name *x) __attribute__((unused)); \
+static void set_ ## s_name ## _defaults(struct s_name *x) {    \
+s_fields                                                               \
+}
+
+#include GENL_MAGIC_INCLUDE_FILE
+
 #endif /* __KERNEL__ */
 
 /* }}}1 */
index 9a605b9..f2c7cc7 100644 (file)
@@ -107,6 +107,14 @@ enum {
        __array(attr_nr, attr_flag, name, NLA_BINARY, char, maxlen, \
                        nla_memcpy, NLA_PUT)
 
+/* fields with default values */
+#define __flg_field_def(attr_nr, attr_flag, name, default) \
+       __flg_field(attr_nr, attr_flag, name)
+#define __u32_field_def(attr_nr, attr_flag, name, default) \
+       __u32_field(attr_nr, attr_flag, name)
+#define __str_field_def(attr_nr, attr_flag, name, maxlen) \
+       __str_field(attr_nr, attr_flag, name, maxlen)
+
 #define __nla_put_flag(skb, attrtype, value)           \
        do {                                            \
                if (value)                              \