fold security_file_free() into file_free()
authorAl Viro <viro@zeniv.linux.org.uk>
Mon, 9 Jul 2018 15:24:21 +0000 (11:24 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Wed, 11 Jul 2018 03:29:03 +0000 (23:29 -0400)
.. and the call of file_free() in case of security_file_alloc() failure
in get_empty_filp() should be simply file_free_rcu() - no point in
rcu-delays there, anyway.

Acked-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/file_table.c

index 7ec0b3e..eee7cf6 100644 (file)
@@ -51,6 +51,7 @@ static void file_free_rcu(struct rcu_head *head)
 
 static inline void file_free(struct file *f)
 {
+       security_file_free(f);
        percpu_counter_dec(&nr_files);
        call_rcu(&f->f_u.fu_rcuhead, file_free_rcu);
 }
@@ -123,11 +124,10 @@ struct file *get_empty_filp(void)
        if (unlikely(!f))
                return ERR_PTR(-ENOMEM);
 
-       percpu_counter_inc(&nr_files);
        f->f_cred = get_cred(cred);
        error = security_file_alloc(f);
        if (unlikely(error)) {
-               file_free(f);
+               file_free_rcu(&f->f_u.fu_rcuhead);
                return ERR_PTR(error);
        }
 
@@ -137,6 +137,7 @@ struct file *get_empty_filp(void)
        mutex_init(&f->f_pos_lock);
        eventpoll_init_file(f);
        /* f->f_version: 0 */
+       percpu_counter_inc(&nr_files);
        return f;
 
 over:
@@ -207,7 +208,6 @@ static void __fput(struct file *file)
        }
        if (file->f_op->release)
                file->f_op->release(inode, file);
-       security_file_free(file);
        if (unlikely(S_ISCHR(inode->i_mode) && inode->i_cdev != NULL &&
                     !(file->f_mode & FMODE_PATH))) {
                cdev_put(inode->i_cdev);
@@ -302,10 +302,8 @@ EXPORT_SYMBOL(fput);
 
 void put_filp(struct file *file)
 {
-       if (atomic_long_dec_and_test(&file->f_count)) {
-               security_file_free(file);
+       if (atomic_long_dec_and_test(&file->f_count))
                file_free(file);
-       }
 }
 
 void __init files_init(void)