Commit 8a05a8c3 authored by Amir Goldstein's avatar Amir Goldstein Committed by Christian Brauner

fs: move kmem_cache_zalloc() into alloc_empty_file*() helpers

Use a common helper init_file() instead of __alloc_file() for
alloc_empty_file*() helpers and improrve the documentation.

This is needed for a follow up patch that allocates a backing_file
container.
Suggested-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarAmir Goldstein <amir73il@gmail.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Message-Id: <20230615112229.2143178-4-amir73il@gmail.com>
Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
parent cbb0b9d4
...@@ -131,20 +131,15 @@ static int __init init_fs_stat_sysctls(void) ...@@ -131,20 +131,15 @@ static int __init init_fs_stat_sysctls(void)
fs_initcall(init_fs_stat_sysctls); fs_initcall(init_fs_stat_sysctls);
#endif #endif
static struct file *__alloc_file(int flags, const struct cred *cred) static int init_file(struct file *f, int flags, const struct cred *cred)
{ {
struct file *f;
int error; int error;
f = kmem_cache_zalloc(filp_cachep, GFP_KERNEL);
if (unlikely(!f))
return ERR_PTR(-ENOMEM);
f->f_cred = get_cred(cred); f->f_cred = get_cred(cred);
error = security_file_alloc(f); error = security_file_alloc(f);
if (unlikely(error)) { if (unlikely(error)) {
file_free_rcu(&f->f_rcuhead); file_free_rcu(&f->f_rcuhead);
return ERR_PTR(error); return error;
} }
atomic_long_set(&f->f_count, 1); atomic_long_set(&f->f_count, 1);
...@@ -155,7 +150,7 @@ static struct file *__alloc_file(int flags, const struct cred *cred) ...@@ -155,7 +150,7 @@ static struct file *__alloc_file(int flags, const struct cred *cred)
f->f_mode = OPEN_FMODE(flags); f->f_mode = OPEN_FMODE(flags);
/* f->f_version: 0 */ /* f->f_version: 0 */
return f; return 0;
} }
/* Find an unused file structure and return a pointer to it. /* Find an unused file structure and return a pointer to it.
...@@ -172,6 +167,7 @@ struct file *alloc_empty_file(int flags, const struct cred *cred) ...@@ -172,6 +167,7 @@ struct file *alloc_empty_file(int flags, const struct cred *cred)
{ {
static long old_max; static long old_max;
struct file *f; struct file *f;
int error;
/* /*
* Privileged users can go above max_files * Privileged users can go above max_files
...@@ -185,9 +181,15 @@ struct file *alloc_empty_file(int flags, const struct cred *cred) ...@@ -185,9 +181,15 @@ struct file *alloc_empty_file(int flags, const struct cred *cred)
goto over; goto over;
} }
f = __alloc_file(flags, cred); f = kmem_cache_zalloc(filp_cachep, GFP_KERNEL);
if (!IS_ERR(f)) if (unlikely(!f))
percpu_counter_inc(&nr_files); return ERR_PTR(-ENOMEM);
error = init_file(f, flags, cred);
if (unlikely(error))
return ERR_PTR(error);
percpu_counter_inc(&nr_files);
return f; return f;
...@@ -203,14 +205,23 @@ struct file *alloc_empty_file(int flags, const struct cred *cred) ...@@ -203,14 +205,23 @@ struct file *alloc_empty_file(int flags, const struct cred *cred)
/* /*
* Variant of alloc_empty_file() that doesn't check and modify nr_files. * Variant of alloc_empty_file() that doesn't check and modify nr_files.
* *
* Should not be used unless there's a very good reason to do so. * This is only for kernel internal use, and the allocate file must not be
* installed into file tables or such.
*/ */
struct file *alloc_empty_file_noaccount(int flags, const struct cred *cred) struct file *alloc_empty_file_noaccount(int flags, const struct cred *cred)
{ {
struct file *f = __alloc_file(flags, cred); struct file *f;
int error;
f = kmem_cache_zalloc(filp_cachep, GFP_KERNEL);
if (unlikely(!f))
return ERR_PTR(-ENOMEM);
error = init_file(f, flags, cred);
if (unlikely(error))
return ERR_PTR(error);
if (!IS_ERR(f)) f->f_mode |= FMODE_NOACCOUNT;
f->f_mode |= FMODE_NOACCOUNT;
return f; return f;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment