summaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorLars Ellenberg <lars.ellenberg@linbit.com>2011-03-23 14:31:09 +0100
committerPhilipp Reisner <philipp.reisner@linbit.com>2012-11-08 16:44:20 +0100
commitf399002e68e626e7bc443e6fcab1772704cc197f (patch)
tree0d6abf88f3ebf5c619994c929d5baf728a3f579c /include
parent6b75dced005c7f06b81934167e36bcfc690cc3a7 (diff)
downloadlinux-f399002e68e626e7bc443e6fcab1772704cc197f.tar.gz
linux-f399002e68e626e7bc443e6fcab1772704cc197f.tar.bz2
linux-f399002e68e626e7bc443e6fcab1772704cc197f.zip
drbd: distribute former syncer_conf settings to disk, connection, and resource level
This commit breaks the API again. Move per-volume former syncer options into disk_conf. Move per-connection former syncer options into net_conf. Renamed the remainign sync_conf to res_opts Syncer settings have been changeable at runtime, so we need to prepare for these settings to be runtime-changeable in their new home as well. Introduce new configuration operations, and share the netlink attribute between "attach" (create new disk) and "disk-opts" (change options). Same for "connect" and "net-opts". Some fields cannot be changed at runtime, however. Introduce a new flag GENLA_F_INVARIANT to be able to trigger on that in the generated validation and assignment functions. Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Diffstat (limited to 'include')
-rw-r--r--include/linux/drbd_genl.h133
-rw-r--r--include/linux/drbd_limits.h2
-rw-r--r--include/linux/genl_magic_func.h49
-rw-r--r--include/linux/genl_magic_struct.h18
4 files changed, 123 insertions, 79 deletions
diff --git a/include/linux/drbd_genl.h b/include/linux/drbd_genl.h
index a07d69279b1a..938e8560a833 100644
--- a/include/linux/drbd_genl.h
+++ b/include/linux/drbd_genl.h
@@ -102,66 +102,73 @@ GENL_struct(DRBD_NLA_CFG_CONTEXT, 2, drbd_cfg_context,
)
GENL_struct(DRBD_NLA_DISK_CONF, 3, disk_conf,
- __u64_field(1, GENLA_F_MANDATORY, disk_size)
- __str_field(2, GENLA_F_REQUIRED, backing_dev, 128)
- __str_field(3, GENLA_F_REQUIRED, meta_dev, 128)
- __u32_field(4, GENLA_F_REQUIRED, meta_dev_idx)
- __u32_field(5, GENLA_F_MANDATORY, max_bio_bvecs)
+ __str_field(1, GENLA_F_REQUIRED | GENLA_F_INVARIANT, backing_dev, 128)
+ __str_field(2, GENLA_F_REQUIRED | GENLA_F_INVARIANT, meta_dev, 128)
+ __u32_field(3, GENLA_F_REQUIRED | GENLA_F_INVARIANT, meta_dev_idx)
+
+ /* use the resize command to try and change the disk_size */
+ __u64_field(4, GENLA_F_MANDATORY | GENLA_F_INVARIANT, disk_size)
+ /* we could change the max_bio_bvecs,
+ * 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)
- __flg_field(8, GENLA_F_MANDATORY, no_disk_barrier)
- __flg_field(9, GENLA_F_MANDATORY, no_disk_flush)
- __flg_field(10, GENLA_F_MANDATORY, no_disk_drain)
- __flg_field(11, GENLA_F_MANDATORY, no_md_flush)
- __flg_field(12, GENLA_F_MANDATORY, use_bmbv)
+
+ __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)
+
)
-GENL_struct(DRBD_NLA_SYNCER_CONF, 4, syncer_conf,
- __u32_field(1, GENLA_F_MANDATORY, rate)
- __u32_field(2, GENLA_F_MANDATORY, after)
- __u32_field(3, GENLA_F_MANDATORY, al_extents)
- __str_field(4, GENLA_F_MANDATORY, cpu_mask, 32)
- __str_field(5, GENLA_F_MANDATORY, verify_alg, SHARED_SECRET_MAX)
- __str_field(6, GENLA_F_MANDATORY, csums_alg, SHARED_SECRET_MAX)
- __flg_field(7, GENLA_F_MANDATORY, use_rle)
- __u32_field(8, GENLA_F_MANDATORY, on_no_data)
- __u32_field(9, GENLA_F_MANDATORY, c_plan_ahead)
- __u32_field(10, GENLA_F_MANDATORY, c_delay_target)
- __u32_field(11, GENLA_F_MANDATORY, c_fill_target)
- __u32_field(12, GENLA_F_MANDATORY, c_max_rate)
- __u32_field(13, GENLA_F_MANDATORY, c_min_rate)
+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)
)
GENL_struct(DRBD_NLA_NET_CONF, 5, net_conf,
- __str_field(1, GENLA_F_MANDATORY | GENLA_F_SENSITIVE,
+ __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,
shared_secret, SHARED_SECRET_MAX)
- __str_field(2, GENLA_F_MANDATORY, cram_hmac_alg, SHARED_SECRET_MAX)
- __str_field(3, GENLA_F_MANDATORY, integrity_alg, SHARED_SECRET_MAX)
- __str_field(4, GENLA_F_REQUIRED, my_addr, 128)
- __str_field(5, GENLA_F_REQUIRED, peer_addr, 128)
- __u32_field(6, GENLA_F_REQUIRED, wire_protocol)
- __u32_field(7, GENLA_F_MANDATORY, try_connect_int)
- __u32_field(8, GENLA_F_MANDATORY, timeout)
- __u32_field(9, GENLA_F_MANDATORY, ping_int)
- __u32_field(10, GENLA_F_MANDATORY, ping_timeo)
- __u32_field(11, GENLA_F_MANDATORY, sndbuf_size)
- __u32_field(12, GENLA_F_MANDATORY, rcvbuf_size)
- __u32_field(13, GENLA_F_MANDATORY, ko_count)
- __u32_field(14, GENLA_F_MANDATORY, max_buffers)
- __u32_field(15, GENLA_F_MANDATORY, max_epoch_size)
- __u32_field(16, GENLA_F_MANDATORY, unplug_watermark)
- __u32_field(17, GENLA_F_MANDATORY, after_sb_0p)
- __u32_field(18, GENLA_F_MANDATORY, after_sb_1p)
- __u32_field(19, GENLA_F_MANDATORY, after_sb_2p)
- __u32_field(20, GENLA_F_MANDATORY, rr_conflict)
- __u32_field(21, GENLA_F_MANDATORY, on_congestion)
- __u32_field(22, GENLA_F_MANDATORY, cong_fill)
- __u32_field(23, GENLA_F_MANDATORY, cong_extents)
- __flg_field(24, GENLA_F_MANDATORY, two_primaries)
- __flg_field(25, GENLA_F_MANDATORY, want_lose)
- __flg_field(26, GENLA_F_MANDATORY, no_cork)
- __flg_field(27, GENLA_F_MANDATORY, always_asbp)
- __flg_field(28, GENLA_F_MANDATORY, dry_run)
+ __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)
+ __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(30, GENLA_F_MANDATORY | GENLA_F_INVARIANT, dry_run)
+ __flg_field(31, GENLA_F_MANDATORY, use_rle)
)
GENL_struct(DRBD_NLA_SET_ROLE_PARMS, 6, set_role_parms,
@@ -270,11 +277,10 @@ GENL_op(DRBD_ADM_ADD_LINK, 7, GENL_doit(drbd_adm_create_connection),
GENL_op(DRBD_ADM_DEL_LINK, 8, GENL_doit(drbd_adm_delete_connection),
GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED))
- /* operates on replication links */
-GENL_op(DRBD_ADM_SYNCER, 9,
- GENL_doit(drbd_adm_syncer),
+GENL_op(DRBD_ADM_RESOURCE_OPTS, 9,
+ GENL_doit(drbd_adm_resource_opts),
GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED)
- GENL_tla_expected(DRBD_NLA_SYNCER_CONF, GENLA_F_MANDATORY)
+ GENL_tla_expected(DRBD_NLA_RESOURCE_OPTS, GENLA_F_MANDATORY)
)
GENL_op(
@@ -284,16 +290,28 @@ GENL_op(
GENL_tla_expected(DRBD_NLA_NET_CONF, GENLA_F_REQUIRED)
)
+GENL_op(
+ DRBD_ADM_CHG_NET_OPTS, 29,
+ GENL_doit(drbd_adm_net_opts),
+ GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED)
+ GENL_tla_expected(DRBD_NLA_NET_CONF, GENLA_F_REQUIRED)
+)
+
GENL_op(DRBD_ADM_DISCONNECT, 11, GENL_doit(drbd_adm_disconnect),
GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED))
- /* operates on minors */
GENL_op(DRBD_ADM_ATTACH, 12,
GENL_doit(drbd_adm_attach),
GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED)
GENL_tla_expected(DRBD_NLA_DISK_CONF, GENLA_F_REQUIRED)
)
+GENL_op(DRBD_ADM_CHG_DISK_OPTS, 28,
+ GENL_doit(drbd_adm_disk_opts),
+ GENL_tla_expected(DRBD_NLA_CFG_CONTEXT, GENLA_F_REQUIRED)
+ GENL_tla_expected(DRBD_NLA_DISK_OPTS, GENLA_F_REQUIRED)
+)
+
GENL_op(
DRBD_ADM_RESIZE, 13,
GENL_doit(drbd_adm_resize),
@@ -301,7 +319,6 @@ GENL_op(
GENL_tla_expected(DRBD_NLA_RESIZE_PARMS, GENLA_F_MANDATORY)
)
- /* operates on all volumes within a resource */
GENL_op(
DRBD_ADM_PRIMARY, 14,
GENL_doit(drbd_adm_set_role),
diff --git a/include/linux/drbd_limits.h b/include/linux/drbd_limits.h
index 22920a8af4e2..659a8eb38830 100644
--- a/include/linux/drbd_limits.h
+++ b/include/linux/drbd_limits.h
@@ -166,5 +166,7 @@
#define DRBD_CONG_EXTENTS_MAX DRBD_AL_EXTENTS_MAX
#define DRBD_CONG_EXTENTS_DEF DRBD_AL_EXTENTS_DEF
+#define DRBD_PROTOCOL_DEF DRBD_PROT_C
+
#undef RANGE
#endif
diff --git a/include/linux/genl_magic_func.h b/include/linux/genl_magic_func.h
index c8c67239f616..e458282a3728 100644
--- a/include/linux/genl_magic_func.h
+++ b/include/linux/genl_magic_func.h
@@ -190,11 +190,12 @@ static struct nlattr *nested_attr_tb[128];
#undef GENL_struct
#define GENL_struct(tag_name, tag_number, s_name, s_fields) \
- /* static, potentially unused */ \
-int s_name ## _from_attrs(struct s_name *s, struct nlattr *tb[]) \
+/* *_from_attrs functions are static, but potentially unused */ \
+static int __ ## s_name ## _from_attrs(struct s_name *s, \
+ struct genl_info *info, bool exclude_invariants) \
{ \
const int maxtype = ARRAY_SIZE(s_name ## _nl_policy)-1; \
- struct nlattr *tla = tb[tag_number]; \
+ struct nlattr *tla = info->attrs[tag_number]; \
struct nlattr **ntb = nested_attr_tb; \
struct nlattr *nla; \
int err; \
@@ -211,33 +212,49 @@ int s_name ## _from_attrs(struct s_name *s, struct nlattr *tb[]) \
\
s_fields \
return 0; \
-}
+} __attribute__((unused)) \
+static int s_name ## _from_attrs(struct s_name *s, \
+ struct genl_info *info) \
+{ \
+ return __ ## s_name ## _from_attrs(s, info, false); \
+} __attribute__((unused)) \
+static int s_name ## _from_attrs_for_change(struct s_name *s, \
+ struct genl_info *info) \
+{ \
+ return __ ## s_name ## _from_attrs(s, info, true); \
+} __attribute__((unused)) \
-#undef __field
-#define __field(attr_nr, attr_flag, name, nla_type, type, __get, __put) \
+#define __assign(attr_nr, attr_flag, name, nla_type, type, assignment...) \
nla = ntb[__nla_type(attr_nr)]; \
if (nla) { \
- if (s) \
- s->name = __get(nla); \
- DPRINT_FIELD("<<", nla_type, name, s, nla); \
+ if (exclude_invariants && ((attr_flag) & GENLA_F_INVARIANT)) { \
+ pr_info("<< must not change invariant attr: %s\n", #name); \
+ return -EEXIST; \
+ } \
+ assignment; \
+ } else if (exclude_invariants && ((attr_flag) & GENLA_F_INVARIANT)) { \
+ /* attribute missing from payload, */ \
+ /* which was expected */ \
} else if ((attr_flag) & GENLA_F_REQUIRED) { \
pr_info("<< missing attr: %s\n", #name); \
return -ENOMSG; \
}
+#undef __field
+#define __field(attr_nr, attr_flag, name, nla_type, type, __get, __put) \
+ __assign(attr_nr, attr_flag, name, nla_type, type, \
+ if (s) \
+ s->name = __get(nla); \
+ DPRINT_FIELD("<<", nla_type, name, s, nla))
+
/* validate_nla() already checked nla_len <= maxlen appropriately. */
#undef __array
#define __array(attr_nr, attr_flag, name, nla_type, type, maxlen, __get, __put) \
- nla = ntb[__nla_type(attr_nr)]; \
- if (nla) { \
+ __assign(attr_nr, attr_flag, name, nla_type, type, \
if (s) \
s->name ## _len = \
__get(s->name, nla, maxlen); \
- DPRINT_ARRAY("<<", nla_type, name, s, nla); \
- } else if ((attr_flag) & GENLA_F_REQUIRED) { \
- pr_info("<< missing attr: %s\n", #name); \
- return -ENOMSG; \
- } \
+ DPRINT_ARRAY("<<", nla_type, name, s, nla))
#include GENL_MAGIC_INCLUDE_FILE
diff --git a/include/linux/genl_magic_struct.h b/include/linux/genl_magic_struct.h
index 745ebfd6c7e5..9a605b9ee834 100644
--- a/include/linux/genl_magic_struct.h
+++ b/include/linux/genl_magic_struct.h
@@ -59,12 +59,20 @@ enum {
GENLA_F_MANDATORY = 1 << 14,
GENLA_F_REQUIRED = 1 << 15,
- /* This will not be present in the __u16 .nla_type, but can be
- * triggered on in <struct>_to_skb, to exclude "sensitive"
- * information from broadcasts, or on unpriviledged get requests.
- * This is useful because genetlink multicast groups can be listened in
- * on by anyone. */
+ /* Below will not be present in the __u16 .nla_type, but can be
+ * triggered on in <struct>_to_skb resp. <struct>_from_attrs */
+
+ /* To exclude "sensitive" information from broadcasts, or on
+ * unpriviledged get requests. This is useful because genetlink
+ * multicast groups can be listened in on by anyone. */
GENLA_F_SENSITIVE = 1 << 16,
+
+ /* INVARIAN options cannot be changed at runtime.
+ * Useful to share an attribute policy and struct definition,
+ * between some "create" and "change" commands,
+ * but disallow certain fields to be changed online.
+ */
+ GENLA_F_INVARIANT = 1 << 17,
};
#define __nla_type(x) ((__u16)((__u16)(x) & (__u16)NLA_TYPE_MASK))