seq_file: allocate seq_file from kmem_cache
PATCH 1/2 seq_file: allocate seq_file from kmem_cache
For fine-grained debugging and usercopy protection.
Signed-off-by Alexey Dobriyan <[email protected]>
---
fs/seq_file.c | 12 ++++++++++-- include/linux/seq_file.h | 1 + init/main.c | 1 + 3 files changed, 12 insertions(+), 2 deletions(-)
fs/seq_file.c +10 -2
@@ -6,6 +6,7 @@* initial implementation -- AV, Oct 2001. */ +#include <linux/cache.h> #include <linux/fs.h> #include <linux/export.h> #include <linux/seq_file.h>
@@ -19,6 +20,8 @@#include <linux/uaccess.h> #include <asm/page.h> +static struct kmem_cache *seq_file_cache__ro_after_init ; +static void seq_set_overflow (struct seq_file *m) { m->count = m->size;
@@ -51,7 +54,7 @@ int seq_open(struct file *file, const struct seq_operations *op)WARN_ON (file->private_data); - p =kzalloc (sizeof (*p),GFP_KERNEL ); + p =kmem_cache_zalloc (seq_file_cache,GFP_KERNEL );if (!p)return -ENOMEM ;
@@ -366,7 +369,7 @@ int seq_release(struct inode *inode, struct file *file) {struct seq_file *m = file->private_data;kvfree (m->buf); -kfree (m); +kmem_cache_free (seq_file_cache, m);return 0 ; }EXPORT_SYMBOL (seq_release);
@@ -1106,3 +1109,8 @@ seq_hlist_next_percpu(void *v, struct hlist_head __percpu *head,return NULL ; }EXPORT_SYMBOL (seq_hlist_next_percpu); + +void __init seq_file_init (void ) +{ + seq_file_cache =KMEM_CACHE (seq_file,SLAB_PANIC ); +}
include/linux/seq_file.h +1 -0
@@ -240,4 +240,5 @@ extern struct hlist_node *seq_hlist_start_percpu(struct hlist_head __percpu *heaextern struct hlist_node *seq_hlist_next_percpu (void *v,struct hlist_head __percpu *head,int *cpu,loff_t *pos); +void seq_file_init (void );#endif
init/main.c +1 -0
@@ -696,6 +696,7 @@ asmlinkage __visible void __init start_kernel(void)vfs_caches_init ();pagecache_init ();signals_init (); +seq_file_init ();proc_root_init ();nsfs_init ();cpuset_init ();