diff options
author | Johannes Berg <johannes.berg@intel.com> | 2013-11-15 08:19:08 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-11-15 20:50:23 -0500 |
commit | 568508aa0724cc39bcf7d3d8001bd27a45609800 (patch) | |
tree | 11e9648ccbd27021e18307f5639684b5c563c19c | |
parent | 052e31281575b2894aad09672bd9ac435488ff04 (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.h | 28 | ||||
-rw-r--r-- | net/netlink/genetlink.c | 53 |
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 | ||
134 | int __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 | */ | ||
137 | static inline int genl_register_family_with_ops(struct genl_family *family, | 155 | static 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 | ||
144 | int genl_unregister_family(struct genl_family *family); | 164 | int 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 | ||
286 | static int genl_validate_add_ops(struct genl_family *family, | 286 | static 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 | */ |
318 | int __genl_register_family(struct genl_family *family) | 327 | int __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: | |||
373 | EXPORT_SYMBOL(__genl_register_family); | 386 | EXPORT_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 | */ | ||
396 | int __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 | } | ||
407 | EXPORT_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 | * |