Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drbd: Split off netlink mandatory attribute handling into separate file

Duplicate this file in the kernel module and in user space; both sides need it.

Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>

authored by

Andreas Gruenbacher and committed by
Philipp Reisner
01b39b50 7c3063cc

+66 -56
+1
drivers/block/drbd/Makefile
··· 2 2 drbd-y += drbd_worker.o drbd_receiver.o drbd_req.o drbd_actlog.o 3 3 drbd-y += drbd_main.o drbd_strings.o drbd_nl.o 4 4 drbd-y += drbd_interval.o drbd_state.o 5 + drbd-y += drbd_nla.o 5 6 6 7 obj-$(CONFIG_BLK_DEV_DRBD) += drbd.o
-6
drivers/block/drbd/drbd_int.h
··· 1407 1407 extern void conn_try_outdate_peer_async(struct drbd_tconn *tconn); 1408 1408 extern int drbd_khelper(struct drbd_conf *mdev, char *cmd); 1409 1409 1410 - struct nla_policy; 1411 - extern int drbd_nla_check_mandatory(int maxtype, struct nlattr *nla); 1412 - extern int drbd_nla_parse_nested(struct nlattr *tb[], int maxtype, struct nlattr *nla, 1413 - const struct nla_policy *policy); 1414 - extern struct nlattr *drbd_nla_find_nested(int maxtype, struct nlattr *nla, int attrtype); 1415 - 1416 1410 /* drbd_worker.c */ 1417 1411 extern int drbd_worker(struct drbd_thread *thi); 1418 1412 enum drbd_ret_code drbd_resync_after_valid(struct drbd_conf *mdev, int o_minor);
+1 -50
drivers/block/drbd/drbd_nl.c
··· 75 75 int drbd_adm_get_status_all(struct sk_buff *skb, struct netlink_callback *cb); 76 76 77 77 #include <linux/drbd_genl_api.h> 78 + #include "drbd_nla.h" 78 79 #include <linux/genl_magic_func.h> 79 80 80 81 /* used blkdev_get_by_path, to claim our meta data device(s) */ ··· 3219 3218 dev_err(DEV, "Error %d while broadcasting event. " 3220 3219 "Event seq:%u sib_reason:%u\n", 3221 3220 err, seq, sib->sib_reason); 3222 - } 3223 - 3224 - int drbd_nla_check_mandatory(int maxtype, struct nlattr *nla) 3225 - { 3226 - struct nlattr *head = nla_data(nla); 3227 - int len = nla_len(nla); 3228 - int rem; 3229 - 3230 - /* 3231 - * validate_nla (called from nla_parse_nested) ignores attributes 3232 - * beyond maxtype, and does not understand the DRBD_GENLA_F_MANDATORY flag. 3233 - * In order to have it validate attributes with the DRBD_GENLA_F_MANDATORY 3234 - * flag set also, check and remove that flag before calling 3235 - * nla_parse_nested. 3236 - */ 3237 - 3238 - nla_for_each_attr(nla, head, len, rem) { 3239 - if (nla->nla_type & DRBD_GENLA_F_MANDATORY) { 3240 - nla->nla_type &= ~DRBD_GENLA_F_MANDATORY; 3241 - if (nla_type(nla) > maxtype) 3242 - return -EOPNOTSUPP; 3243 - } 3244 - } 3245 - return 0; 3246 - } 3247 - 3248 - int drbd_nla_parse_nested(struct nlattr *tb[], int maxtype, struct nlattr *nla, 3249 - const struct nla_policy *policy) 3250 - { 3251 - int err; 3252 - 3253 - err = drbd_nla_check_mandatory(maxtype, nla); 3254 - if (!err) 3255 - err = nla_parse_nested(tb, maxtype, nla, policy); 3256 - 3257 - return err; 3258 - } 3259 - 3260 - struct nlattr *drbd_nla_find_nested(int maxtype, struct nlattr *nla, int attrtype) 3261 - { 3262 - int err; 3263 - /* 3264 - * If any nested attribute has the DRBD_GENLA_F_MANDATORY flag set and 3265 - * we don't know about that attribute, reject all the nested 3266 - * attributes. 3267 - */ 3268 - err = drbd_nla_check_mandatory(maxtype, nla); 3269 - if (err) 3270 - return ERR_PTR(err); 3271 - return nla_find_nested(nla, attrtype); 3272 3221 }
+55
drivers/block/drbd/drbd_nla.c
··· 1 + #include "drbd_wrappers.h" 2 + #include <linux/kernel.h> 3 + #include <net/netlink.h> 4 + #include <linux/drbd_genl_api.h> 5 + #include "drbd_nla.h" 6 + 7 + static int drbd_nla_check_mandatory(int maxtype, struct nlattr *nla) 8 + { 9 + struct nlattr *head = nla_data(nla); 10 + int len = nla_len(nla); 11 + int rem; 12 + 13 + /* 14 + * validate_nla (called from nla_parse_nested) ignores attributes 15 + * beyond maxtype, and does not understand the DRBD_GENLA_F_MANDATORY flag. 16 + * In order to have it validate attributes with the DRBD_GENLA_F_MANDATORY 17 + * flag set also, check and remove that flag before calling 18 + * nla_parse_nested. 19 + */ 20 + 21 + nla_for_each_attr(nla, head, len, rem) { 22 + if (nla->nla_type & DRBD_GENLA_F_MANDATORY) { 23 + nla->nla_type &= ~DRBD_GENLA_F_MANDATORY; 24 + if (nla_type(nla) > maxtype) 25 + return -EOPNOTSUPP; 26 + } 27 + } 28 + return 0; 29 + } 30 + 31 + int drbd_nla_parse_nested(struct nlattr *tb[], int maxtype, struct nlattr *nla, 32 + const struct nla_policy *policy) 33 + { 34 + int err; 35 + 36 + err = drbd_nla_check_mandatory(maxtype, nla); 37 + if (!err) 38 + err = nla_parse_nested(tb, maxtype, nla, policy); 39 + 40 + return err; 41 + } 42 + 43 + struct nlattr *drbd_nla_find_nested(int maxtype, struct nlattr *nla, int attrtype) 44 + { 45 + int err; 46 + /* 47 + * If any nested attribute has the DRBD_GENLA_F_MANDATORY flag set and 48 + * we don't know about that attribute, reject all the nested 49 + * attributes. 50 + */ 51 + err = drbd_nla_check_mandatory(maxtype, nla); 52 + if (err) 53 + return ERR_PTR(err); 54 + return nla_find_nested(nla, attrtype); 55 + }
+8
drivers/block/drbd/drbd_nla.h
··· 1 + #ifndef __DRBD_NLA_H 2 + #define __DRBD_NLA_H 3 + 4 + extern int drbd_nla_parse_nested(struct nlattr *tb[], int maxtype, struct nlattr *nla, 5 + const struct nla_policy *policy); 6 + extern struct nlattr *drbd_nla_find_nested(int maxtype, struct nlattr *nla, int attrtype); 7 + 8 + #endif /* __DRBD_NLA_H */
+1
drivers/block/drbd/drbd_wrappers.h
··· 3 3 4 4 #include <linux/ctype.h> 5 5 #include <linux/mm.h> 6 + #include "drbd_int.h" 6 7 7 8 /* see get_sb_bdev and bd_claim */ 8 9 extern char *drbd_sec_holder;