struct file: use anonymous union member for rcuhead and llist
authorAl Viro <viro@zeniv.linux.org.uk>
Sun, 22 May 2022 13:28:12 +0000 (09:28 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Fri, 10 Jun 2022 20:04:38 +0000 (16:04 -0400)
Once upon a time we couldn't afford anon unions; these days minimal
gcc version had been raised enough to take care of that.

Reviewed-by: Jan Kara <jack@suse.cz>
Reviewed-by: Christian Brauner (Microsoft) <brauner@kernel.org>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/file_table.c
include/linux/fs.h

index 5424e3a8df5fa20ecbbaa38f35e80b113aaadbc2..b989e33aacda4c3d2b139b8333813afbe875369f 100644 (file)
@@ -45,7 +45,7 @@ static struct percpu_counter nr_files __cacheline_aligned_in_smp;
 
 static void file_free_rcu(struct rcu_head *head)
 {
-       struct file *f = container_of(head, struct file, f_u.fu_rcuhead);
+       struct file *f = container_of(head, struct file, f_rcuhead);
 
        put_cred(f->f_cred);
        kmem_cache_free(filp_cachep, f);
@@ -56,7 +56,7 @@ static inline void file_free(struct file *f)
        security_file_free(f);
        if (!(f->f_mode & FMODE_NOACCOUNT))
                percpu_counter_dec(&nr_files);
-       call_rcu(&f->f_u.fu_rcuhead, file_free_rcu);
+       call_rcu(&f->f_rcuhead, file_free_rcu);
 }
 
 /*
@@ -142,7 +142,7 @@ static struct file *__alloc_file(int flags, const struct cred *cred)
        f->f_cred = get_cred(cred);
        error = security_file_alloc(f);
        if (unlikely(error)) {
-               file_free_rcu(&f->f_u.fu_rcuhead);
+               file_free_rcu(&f->f_rcuhead);
                return ERR_PTR(error);
        }
 
@@ -341,13 +341,13 @@ static void delayed_fput(struct work_struct *unused)
        struct llist_node *node = llist_del_all(&delayed_fput_list);
        struct file *f, *t;
 
-       llist_for_each_entry_safe(f, t, node, f_u.fu_llist)
+       llist_for_each_entry_safe(f, t, node, f_llist)
                __fput(f);
 }
 
 static void ____fput(struct callback_head *work)
 {
-       __fput(container_of(work, struct file, f_u.fu_rcuhead));
+       __fput(container_of(work, struct file, f_rcuhead));
 }
 
 /*
@@ -374,8 +374,8 @@ void fput(struct file *file)
                struct task_struct *task = current;
 
                if (likely(!in_interrupt() && !(task->flags & PF_KTHREAD))) {
-                       init_task_work(&file->f_u.fu_rcuhead, ____fput);
-                       if (!task_work_add(task, &file->f_u.fu_rcuhead, TWA_RESUME))
+                       init_task_work(&file->f_rcuhead, ____fput);
+                       if (!task_work_add(task, &file->f_rcuhead, TWA_RESUME))
                                return;
                        /*
                         * After this task has run exit_task_work(),
@@ -384,7 +384,7 @@ void fput(struct file *file)
                         */
                }
 
-               if (llist_add(&file->f_u.fu_llist, &delayed_fput_list))
+               if (llist_add(&file->f_llist, &delayed_fput_list))
                        schedule_delayed_work(&delayed_fput_work, 1);
        }
 }
index 9ad5e3520fae577c2a216859aba20f8d26241172..6a2a4906041fda0885a7b7d179517a8e4ff5fe13 100644 (file)
@@ -924,9 +924,9 @@ static inline int ra_has_index(struct file_ra_state *ra, pgoff_t index)
 
 struct file {
        union {
-               struct llist_node       fu_llist;
-               struct rcu_head         fu_rcuhead;
-       } f_u;
+               struct llist_node       f_llist;
+               struct rcu_head         f_rcuhead;
+       };
        struct path             f_path;
        struct inode            *f_inode;       /* cached value */
        const struct file_operations    *f_op;