aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/pohmelfs/config.c
diff options
context:
space:
mode:
authorEvgeniy Polyakov <zbr@ioremap.net>2009-08-28 09:57:58 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2009-09-15 15:02:30 -0400
commit2d7cf8ef75abbe0d33d9115872d4545e9cefced2 (patch)
tree3446950a70190ec909b6a447e9a0e714004956d5 /drivers/staging/pohmelfs/config.c
parent252a1b9162b6dbac7324854eb4137404932b574d (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.c98
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
292static 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
287out_unlock: 327out_unlock:
288 mutex_unlock(&pohmelfs_config_lock); 328 mutex_unlock(&pohmelfs_config_lock);
289 return err; 329 return err;
330}
331
332static 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
367out_unlock:
368 mutex_unlock(&pohmelfs_config_lock);
369 pohmelfs_cn_dump(msg);
370
371 return err;
290} 372}
291 373
292static int pohmelfs_modify_config(struct pohmelfs_ctl *old, struct pohmelfs_ctl *new) 374static 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
353out_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
412static int pohmelfs_cn_crypto(struct cn_msg *msg) 493static 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
498int __init pohmelfs_config_init(void) 585int __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
503void pohmelfs_config_exit(void) 591void pohmelfs_config_exit(void)