diff options
Diffstat (limited to 'fs/proc/generic.c')
-rw-r--r-- | fs/proc/generic.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/fs/proc/generic.c b/fs/proc/generic.c index ab6a321076b8..af644caaaf85 100644 --- a/fs/proc/generic.c +++ b/fs/proc/generic.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/spinlock.h> | 25 | #include <linux/spinlock.h> |
26 | #include <linux/completion.h> | 26 | #include <linux/completion.h> |
27 | #include <linux/uaccess.h> | 27 | #include <linux/uaccess.h> |
28 | #include <linux/seq_file.h> | ||
28 | 29 | ||
29 | #include "internal.h" | 30 | #include "internal.h" |
30 | 31 | ||
@@ -555,6 +556,35 @@ struct proc_dir_entry *proc_create(const char *name, umode_t mode, | |||
555 | } | 556 | } |
556 | EXPORT_SYMBOL(proc_create); | 557 | EXPORT_SYMBOL(proc_create); |
557 | 558 | ||
559 | static int proc_seq_open(struct inode *inode, struct file *file) | ||
560 | { | ||
561 | struct proc_dir_entry *de = PDE(inode); | ||
562 | |||
563 | return seq_open(file, de->seq_ops); | ||
564 | } | ||
565 | |||
566 | static const struct file_operations proc_seq_fops = { | ||
567 | .open = proc_seq_open, | ||
568 | .read = seq_read, | ||
569 | .llseek = seq_lseek, | ||
570 | .release = seq_release, | ||
571 | }; | ||
572 | |||
573 | struct proc_dir_entry *proc_create_seq_data(const char *name, umode_t mode, | ||
574 | struct proc_dir_entry *parent, const struct seq_operations *ops, | ||
575 | void *data) | ||
576 | { | ||
577 | struct proc_dir_entry *p; | ||
578 | |||
579 | p = proc_create_reg(name, mode, &parent, data); | ||
580 | if (!p) | ||
581 | return NULL; | ||
582 | p->proc_fops = &proc_seq_fops; | ||
583 | p->seq_ops = ops; | ||
584 | return proc_register(parent, p); | ||
585 | } | ||
586 | EXPORT_SYMBOL(proc_create_seq_data); | ||
587 | |||
558 | void proc_set_size(struct proc_dir_entry *de, loff_t size) | 588 | void proc_set_size(struct proc_dir_entry *de, loff_t size) |
559 | { | 589 | { |
560 | de->size = size; | 590 | de->size = size; |