aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2013-11-15 08:19:08 -0500
committerDavid S. Miller <davem@davemloft.net>2013-11-15 20:50:23 -0500
commit568508aa0724cc39bcf7d3d8001bd27a45609800 (patch)
tree11e9648ccbd27021e18307f5639684b5c563c19c
parent052e31281575b2894aad09672bd9ac435488ff04 (diff)
genetlink: unify registration functions
Now that the ops assignment is just two variables rather than a long list iteration etc., there's no reason to separately export __genl_register_family() and __genl_register_family_with_ops(). Unify the two functions into __genl_register_family() and make genl_register_family_with_ops() call it after assigning the ops. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--include/net/genetlink.h28
-rw-r--r--net/netlink/genetlink.c53
2 files changed, 40 insertions, 41 deletions
diff --git a/include/net/genetlink.h b/include/net/genetlink.h
index 0b6a144468c6..e96385d46b48 100644
--- a/include/net/genetlink.h
+++ b/include/net/genetlink.h
@@ -131,14 +131,34 @@ static inline int genl_register_family(struct genl_family *family)
131 return __genl_register_family(family); 131 return __genl_register_family(family);
132} 132}
133 133
134int __genl_register_family_with_ops(struct genl_family *family, 134/**
135 const struct genl_ops *ops, size_t n_ops); 135 * genl_register_family_with_ops - register a generic netlink family with ops
136 136 * @family: generic netlink family
137 * @ops: operations to be registered
138 * @n_ops: number of elements to register
139 *
140 * Registers the specified family and operations from the specified table.
141 * Only one family may be registered with the same family name or identifier.
142 *
143 * The family id may equal GENL_ID_GENERATE causing an unique id to
144 * be automatically generated and assigned.
145 *
146 * Either a doit or dumpit callback must be specified for every registered
147 * operation or the function will fail. Only one operation structure per
148 * command identifier may be registered.
149 *
150 * See include/net/genetlink.h for more documenation on the operations
151 * structure.
152 *
153 * Return 0 on success or a negative error code.
154 */
137static inline int genl_register_family_with_ops(struct genl_family *family, 155static inline int genl_register_family_with_ops(struct genl_family *family,
138 const struct genl_ops *ops, size_t n_ops) 156 const struct genl_ops *ops, size_t n_ops)
139{ 157{
140 family->module = THIS_MODULE; 158 family->module = THIS_MODULE;
141 return __genl_register_family_with_ops(family, ops, n_ops); 159 family->ops = ops;
160 family->n_ops = n_ops;
161 return __genl_register_family(family);
142} 162}
143 163
144int genl_unregister_family(struct genl_family *family); 164int genl_unregister_family(struct genl_family *family);
diff --git a/net/netlink/genetlink.c b/net/netlink/genetlink.c
index a7c62d3d05a1..f07eb568a1db 100644
--- a/net/netlink/genetlink.c
+++ b/net/netlink/genetlink.c
@@ -283,12 +283,18 @@ static void genl_unregister_mc_groups(struct genl_family *family)
283 __genl_unregister_mc_group(family, grp); 283 __genl_unregister_mc_group(family, grp);
284} 284}
285 285
286static int genl_validate_add_ops(struct genl_family *family, 286static int genl_validate_ops(struct genl_family *family)
287 const struct genl_ops *ops,
288 unsigned int n_ops)
289{ 287{
288 const struct genl_ops *ops = family->ops;
289 unsigned int n_ops = family->n_ops;
290 int i, j; 290 int i, j;
291 291
292 if (WARN_ON(n_ops && !ops))
293 return -EINVAL;
294
295 if (!n_ops)
296 return 0;
297
292 for (i = 0; i < n_ops; i++) { 298 for (i = 0; i < n_ops; i++) {
293 if (ops[i].dumpit == NULL && ops[i].doit == NULL) 299 if (ops[i].dumpit == NULL && ops[i].doit == NULL)
294 return -EINVAL; 300 return -EINVAL;
@@ -313,6 +319,9 @@ static int genl_validate_add_ops(struct genl_family *family,
313 * The family id may equal GENL_ID_GENERATE causing an unique id to 319 * The family id may equal GENL_ID_GENERATE causing an unique id to
314 * be automatically generated and assigned. 320 * be automatically generated and assigned.
315 * 321 *
322 * The family's ops array must already be assigned, you can use the
323 * genl_register_family_with_ops() helper function.
324 *
316 * Return 0 on success or a negative error code. 325 * Return 0 on success or a negative error code.
317 */ 326 */
318int __genl_register_family(struct genl_family *family) 327int __genl_register_family(struct genl_family *family)
@@ -325,6 +334,10 @@ int __genl_register_family(struct genl_family *family)
325 if (family->id > GENL_MAX_ID) 334 if (family->id > GENL_MAX_ID)
326 goto errout; 335 goto errout;
327 336
337 err = genl_validate_ops(family);
338 if (err)
339 return err;
340
328 INIT_LIST_HEAD(&family->mcast_groups); 341 INIT_LIST_HEAD(&family->mcast_groups);
329 342
330 genl_lock_all(); 343 genl_lock_all();
@@ -373,40 +386,6 @@ errout:
373EXPORT_SYMBOL(__genl_register_family); 386EXPORT_SYMBOL(__genl_register_family);
374 387
375/** 388/**
376 * __genl_register_family_with_ops - register a generic netlink family
377 * @family: generic netlink family
378 * @ops: operations to be registered
379 * @n_ops: number of elements to register
380 *
381 * Registers the specified family and operations from the specified table.
382 * Only one family may be registered with the same family name or identifier.
383 *
384 * The family id may equal GENL_ID_GENERATE causing an unique id to
385 * be automatically generated and assigned.
386 *
387 * Either a doit or dumpit callback must be specified for every registered
388 * operation or the function will fail. Only one operation structure per
389 * command identifier may be registered.
390 *
391 * See include/net/genetlink.h for more documenation on the operations
392 * structure.
393 *
394 * Return 0 on success or a negative error code.
395 */
396int __genl_register_family_with_ops(struct genl_family *family,
397 const struct genl_ops *ops, size_t n_ops)
398{
399 int err;
400
401 err = genl_validate_add_ops(family, ops, n_ops);
402 if (err)
403 return err;
404
405 return __genl_register_family(family);
406}
407EXPORT_SYMBOL(__genl_register_family_with_ops);
408
409/**
410 * genl_unregister_family - unregister generic netlink family 389 * genl_unregister_family - unregister generic netlink family
411 * @family: generic netlink family 390 * @family: generic netlink family
412 * 391 *