Commit 39699037a5c94d7cd1363dfe48a50c78c643fd9a
Committed by
David S. Miller
1 parent
59e90b2d22
Exists in
master
and in
20 other branches
[FS] seq_file: Introduce the seq_open_private()
This function allocates the zeroed chunk of memory and call seq_open(). The __seq_open_private() helper returns the allocated memory to make it possible for the caller to initialize it. Signed-off-by: Pavel Emelyanov <xemul@openvz.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Showing 2 changed files with 35 additions and 0 deletions Side-by-side Diff
fs/seq_file.c
... | ... | @@ -429,6 +429,39 @@ |
429 | 429 | } |
430 | 430 | EXPORT_SYMBOL(seq_release_private); |
431 | 431 | |
432 | +void *__seq_open_private(struct file *f, const struct seq_operations *ops, | |
433 | + int psize) | |
434 | +{ | |
435 | + int rc; | |
436 | + void *private; | |
437 | + struct seq_file *seq; | |
438 | + | |
439 | + private = kzalloc(psize, GFP_KERNEL); | |
440 | + if (private == NULL) | |
441 | + goto out; | |
442 | + | |
443 | + rc = seq_open(f, ops); | |
444 | + if (rc < 0) | |
445 | + goto out_free; | |
446 | + | |
447 | + seq = f->private_data; | |
448 | + seq->private = private; | |
449 | + return private; | |
450 | + | |
451 | +out_free: | |
452 | + kfree(private); | |
453 | +out: | |
454 | + return NULL; | |
455 | +} | |
456 | +EXPORT_SYMBOL(__seq_open_private); | |
457 | + | |
458 | +int seq_open_private(struct file *filp, const struct seq_operations *ops, | |
459 | + int psize) | |
460 | +{ | |
461 | + return __seq_open_private(filp, ops, psize) ? 0 : -ENOMEM; | |
462 | +} | |
463 | +EXPORT_SYMBOL(seq_open_private); | |
464 | + | |
432 | 465 | int seq_putc(struct seq_file *m, char c) |
433 | 466 | { |
434 | 467 | if (m->count < m->size) { |
include/linux/seq_file.h
... | ... | @@ -46,6 +46,8 @@ |
46 | 46 | |
47 | 47 | int single_open(struct file *, int (*)(struct seq_file *, void *), void *); |
48 | 48 | int single_release(struct inode *, struct file *); |
49 | +void *__seq_open_private(struct file *, const struct seq_operations *, int); | |
50 | +int seq_open_private(struct file *, const struct seq_operations *, int); | |
49 | 51 | int seq_release_private(struct inode *, struct file *); |
50 | 52 | |
51 | 53 | #define SEQ_START_TOKEN ((void *)1) |