Fix of bogus file max limit messages
PATCH 1/1 Fix of bogus file max limit messages
This patch fixes incorrect and bogus kernel messages that file-max limit reached when the allocation fails
Signed-off-by Kirill Korotaev <[email protected]>
Signed-off-by Denis Lunev <[email protected]>
Kirill
fs/file_table.c renamed from fs/file_table.c.filemax +29 -26
@@ -63,42 +63,45 @@ static inline void file_free(struct file*/ struct file *get_empty_filp (void ) { -static int old_max; +static int old_max;struct file * f;/* * Privileged users can go above max_files */ -if (files_stat.nr_files < files_stat.max_files || -capable (CAP_SYS_ADMIN )) { - f =kmem_cache_alloc (filp_cachep,GFP_KERNEL ); -if (f) { -memset (f,0 ,sizeof (*f)); -if (security_file_alloc (f)) { -file_free (f); - goto fail; - } -eventpoll_init_file (f); -atomic_set (&f->f_count,1 ); - f->f_uid = current->fsuid; - f->f_gid = current->fsgid; -rwlock_init (&f->f_owner.lock); -/* f->f_version: 0 */ -INIT_LIST_HEAD (&f->f_list); - f->f_maxcount =INT_MAX ; -return f; - } - } +if (files_stat.nr_files >= files_stat.max_files && + !capable (CAP_SYS_ADMIN )) + goto over; + + f =kmem_cache_alloc (filp_cachep,GFP_KERNEL ); +if (f ==NULL ) + goto fail; + +memset (f,0 ,sizeof (*f)); +if (security_file_alloc (f)) + goto fail_sec; + +eventpoll_init_file (f); +atomic_set (&f->f_count,1 ); + f->f_uid = current->fsuid; + f->f_gid = current->fsgid; +rwlock_init (&f->f_owner.lock); +/* f->f_version: 0 */ +INIT_LIST_HEAD (&f->f_list); + f->f_maxcount =INT_MAX ; +return f; +over:/* Ran out of filps - report that */ -if (files_stat.max_files >= old_max) { +if (files_stat.nr_files > old_max) {printk (KERN_INFO "VFS: file-max limit %d reached\n" , files_stat.max_files); - old_max = files_stat.max_files; - }else { -/* Big problems... */ -printk (KERN_WARNING "VFS: filp allocation failed\n" ); + old_max = files_stat.nr_files; } + goto fail; + +fail_sec: +file_free (f); fail:return NULL ; }