fs: move kmem_cache_zalloc() into alloc_empty_file*() helpers
authorAmir Goldstein <amir73il@gmail.com>
Thu, 15 Jun 2023 11:22:27 +0000 (14:22 +0300)
committerChristian Brauner <brauner@kernel.org>
Mon, 19 Jun 2023 16:12:04 +0000 (18:12 +0200)
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: Christoph Hellwig <hch@lst.de>
Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Message-Id: <20230615112229.2143178-4-amir73il@gmail.com>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/file_table.c

index 372653b..4bc7138 100644 (file)
@@ -131,20 +131,15 @@ static int __init init_fs_stat_sysctls(void)
 fs_initcall(init_fs_stat_sysctls);
 #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;
 
-       f = kmem_cache_zalloc(filp_cachep, GFP_KERNEL);
-       if (unlikely(!f))
-               return ERR_PTR(-ENOMEM);
-
        f->f_cred = get_cred(cred);
        error = security_file_alloc(f);
        if (unlikely(error)) {
                file_free_rcu(&f->f_rcuhead);
-               return ERR_PTR(error);
+               return error;
        }
 
        atomic_long_set(&f->f_count, 1);
@@ -155,7 +150,7 @@ static struct file *__alloc_file(int flags, const struct cred *cred)
        f->f_mode = OPEN_FMODE(flags);
        /* f->f_version: 0 */
 
-       return f;
+       return 0;
 }
 
 /* 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)
 {
        static long old_max;
        struct file *f;
+       int error;
 
        /*
         * Privileged users can go above max_files
@@ -185,9 +181,15 @@ struct file *alloc_empty_file(int flags, const struct cred *cred)
                        goto over;
        }
 
-       f = __alloc_file(flags, cred);
-       if (!IS_ERR(f))
-               percpu_counter_inc(&nr_files);
+       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);
+
+       percpu_counter_inc(&nr_files);
 
        return f;
 
@@ -203,14 +205,23 @@ over:
 /*
  * 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 *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;
 }