diff options
author | Evgeniy Polyakov <zbr@ioremap.net> | 2009-08-28 09:57:58 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-09-15 15:02:30 -0400 |
commit | 2d7cf8ef75abbe0d33d9115872d4545e9cefced2 (patch) | |
tree | 3446950a70190ec909b6a447e9a0e714004956d5 /drivers/staging/pohmelfs/config.c | |
parent | 252a1b9162b6dbac7324854eb4137404932b574d (diff) |
Staging: pohmelfs: sync with the development tree
* cache coherency protocol fix
* proper timeout handling
* implement dump/del all config group command
(Signed-off-by: Pierpaolo Giacomin <yrz@anche.no>)
Signed-off-by: Evgeniy Polyakov <zbr@ioremap.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/staging/pohmelfs/config.c')
-rw-r--r-- | drivers/staging/pohmelfs/config.c | 98 |
1 files changed, 93 insertions, 5 deletions
diff --git a/drivers/staging/pohmelfs/config.c b/drivers/staging/pohmelfs/config.c index 99ae1d9649a..90f962ee5fd 100644 --- a/drivers/staging/pohmelfs/config.c +++ b/drivers/staging/pohmelfs/config.c | |||
@@ -284,9 +284,91 @@ static int pohmelfs_cn_disp(struct cn_msg *msg) | |||
284 | i += 1; | 284 | i += 1; |
285 | } | 285 | } |
286 | 286 | ||
287 | out_unlock: | ||
288 | mutex_unlock(&pohmelfs_config_lock); | ||
289 | return err; | ||
290 | } | ||
291 | |||
292 | static int pohmelfs_cn_dump(struct cn_msg *msg) | ||
293 | { | ||
294 | struct pohmelfs_config_group *g; | ||
295 | struct pohmelfs_config *c, *tmp; | ||
296 | int err = 0, i = 1; | ||
297 | int total_msg = 0; | ||
298 | |||
299 | if (msg->len != sizeof(struct pohmelfs_ctl)) | ||
300 | return -EBADMSG; | ||
301 | |||
302 | mutex_lock(&pohmelfs_config_lock); | ||
303 | |||
304 | list_for_each_entry(g, &pohmelfs_config_list, group_entry) { | ||
305 | if (g) | ||
306 | total_msg += g->num_entry; | ||
307 | } | ||
308 | if (total_msg == 0) { | ||
309 | if (pohmelfs_send_reply(err, 0, POHMELFS_NOINFO_ACK, msg, NULL)) | ||
310 | err = -ENOMEM; | ||
311 | goto out_unlock; | ||
312 | } | ||
313 | |||
314 | list_for_each_entry(g, &pohmelfs_config_list, group_entry) { | ||
315 | if (g) { | ||
316 | list_for_each_entry_safe(c, tmp, &g->config_list, config_entry) { | ||
317 | struct pohmelfs_ctl *sc = &c->state.ctl; | ||
318 | if (pohmelfs_send_reply(err, total_msg - i, POHMELFS_CTLINFO_ACK, msg, sc)) { | ||
319 | err = -ENOMEM; | ||
320 | goto out_unlock; | ||
321 | } | ||
322 | i += 1; | ||
323 | } | ||
324 | } | ||
325 | } | ||
326 | |||
287 | out_unlock: | 327 | out_unlock: |
288 | mutex_unlock(&pohmelfs_config_lock); | 328 | mutex_unlock(&pohmelfs_config_lock); |
289 | return err; | 329 | return err; |
330 | } | ||
331 | |||
332 | static int pohmelfs_cn_flush(struct cn_msg *msg) | ||
333 | { | ||
334 | struct pohmelfs_config_group *g; | ||
335 | struct pohmelfs_ctl *ctl = (struct pohmelfs_ctl *)msg->data; | ||
336 | struct pohmelfs_config *c, *tmp; | ||
337 | int err = 0; | ||
338 | |||
339 | if (msg->len != sizeof(struct pohmelfs_ctl)) | ||
340 | return -EBADMSG; | ||
341 | |||
342 | mutex_lock(&pohmelfs_config_lock); | ||
343 | |||
344 | if (ctl->idx != POHMELFS_NULL_IDX) { | ||
345 | g = pohmelfs_find_config_group(ctl->idx); | ||
346 | |||
347 | if (!g) | ||
348 | goto out_unlock; | ||
349 | |||
350 | list_for_each_entry_safe(c, tmp, &g->config_list, config_entry) { | ||
351 | list_del(&c->config_entry); | ||
352 | g->num_entry--; | ||
353 | kfree(c); | ||
354 | } | ||
355 | } else { | ||
356 | list_for_each_entry(g, &pohmelfs_config_list, group_entry) { | ||
357 | if (g) { | ||
358 | list_for_each_entry_safe(c, tmp, &g->config_list, config_entry) { | ||
359 | list_del(&c->config_entry); | ||
360 | g->num_entry--; | ||
361 | kfree(c); | ||
362 | } | ||
363 | } | ||
364 | } | ||
365 | } | ||
366 | |||
367 | out_unlock: | ||
368 | mutex_unlock(&pohmelfs_config_lock); | ||
369 | pohmelfs_cn_dump(msg); | ||
370 | |||
371 | return err; | ||
290 | } | 372 | } |
291 | 373 | ||
292 | static int pohmelfs_modify_config(struct pohmelfs_ctl *old, struct pohmelfs_ctl *new) | 374 | static int pohmelfs_modify_config(struct pohmelfs_ctl *old, struct pohmelfs_ctl *new) |
@@ -350,7 +432,7 @@ static int pohmelfs_cn_ctl(struct cn_msg *msg, int action) | |||
350 | 432 | ||
351 | list_add_tail(&c->config_entry, &g->config_list); | 433 | list_add_tail(&c->config_entry, &g->config_list); |
352 | 434 | ||
353 | out_unlock: | 435 | out_unlock: |
354 | mutex_unlock(&pohmelfs_config_lock); | 436 | mutex_unlock(&pohmelfs_config_lock); |
355 | if (pohmelfs_send_reply(err, 0, POHMELFS_NOINFO_ACK, msg, NULL)) | 437 | if (pohmelfs_send_reply(err, 0, POHMELFS_NOINFO_ACK, msg, NULL)) |
356 | err = -ENOMEM; | 438 | err = -ENOMEM; |
@@ -408,7 +490,6 @@ static int pohmelfs_crypto_cipher_init(struct pohmelfs_config_group *g, struct p | |||
408 | return 0; | 490 | return 0; |
409 | } | 491 | } |
410 | 492 | ||
411 | |||
412 | static int pohmelfs_cn_crypto(struct cn_msg *msg) | 493 | static int pohmelfs_cn_crypto(struct cn_msg *msg) |
413 | { | 494 | { |
414 | struct pohmelfs_crypto *crypto = (struct pohmelfs_crypto *)msg->data; | 495 | struct pohmelfs_crypto *crypto = (struct pohmelfs_crypto *)msg->data; |
@@ -456,9 +537,15 @@ static void pohmelfs_cn_callback(struct cn_msg *msg) | |||
456 | case POHMELFS_FLAGS_MODIFY: | 537 | case POHMELFS_FLAGS_MODIFY: |
457 | err = pohmelfs_cn_ctl(msg, msg->flags); | 538 | err = pohmelfs_cn_ctl(msg, msg->flags); |
458 | break; | 539 | break; |
540 | case POHMELFS_FLAGS_FLUSH: | ||
541 | err = pohmelfs_cn_flush(msg); | ||
542 | break; | ||
459 | case POHMELFS_FLAGS_SHOW: | 543 | case POHMELFS_FLAGS_SHOW: |
460 | err = pohmelfs_cn_disp(msg); | 544 | err = pohmelfs_cn_disp(msg); |
461 | break; | 545 | break; |
546 | case POHMELFS_FLAGS_DUMP: | ||
547 | err = pohmelfs_cn_dump(msg); | ||
548 | break; | ||
462 | case POHMELFS_FLAGS_CRYPTO: | 549 | case POHMELFS_FLAGS_CRYPTO: |
463 | err = pohmelfs_cn_crypto(msg); | 550 | err = pohmelfs_cn_crypto(msg); |
464 | break; | 551 | break; |
@@ -497,7 +584,8 @@ int pohmelfs_config_check(struct pohmelfs_config *config, int idx) | |||
497 | 584 | ||
498 | int __init pohmelfs_config_init(void) | 585 | int __init pohmelfs_config_init(void) |
499 | { | 586 | { |
500 | return cn_add_callback(&pohmelfs_cn_id, "pohmelfs", pohmelfs_cn_callback); | 587 | /* XXX remove (void *) cast when vanilla connector got synced */ |
588 | return cn_add_callback(&pohmelfs_cn_id, "pohmelfs", (void *)pohmelfs_cn_callback); | ||
501 | } | 589 | } |
502 | 590 | ||
503 | void pohmelfs_config_exit(void) | 591 | void pohmelfs_config_exit(void) |