take count and rcu_head out of fs_pin
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 10 Jan 2015 17:47:38 +0000 (12:47 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Mon, 26 Jan 2015 04:17:27 +0000 (23:17 -0500)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
include/linux/fs_pin.h
kernel/acct.c

index 68a54b7..a2e7191 100644 (file)
@@ -1,14 +1,8 @@
 #include <linux/fs.h>
 
 struct fs_pin {
-       atomic_long_t           count;
-       union {
-               struct {
-                       struct hlist_node       s_list;
-                       struct hlist_node       m_list;
-               };
-               struct rcu_head rcu;
-       };
+       struct hlist_node       s_list;
+       struct hlist_node       m_list;
        void (*kill)(struct fs_pin *);
 };
 
index a74f3d1..b8fbefb 100644 (file)
@@ -80,6 +80,8 @@ static void do_acct_process(struct bsd_acct_struct *acct);
 
 struct bsd_acct_struct {
        struct fs_pin           pin;
+       atomic_long_t           count;
+       struct rcu_head         rcu;
        struct mutex            lock;
        int                     active;
        unsigned long           needcheck;
@@ -126,8 +128,8 @@ out:
 
 static void acct_put(struct bsd_acct_struct *p)
 {
-       if (atomic_long_dec_and_test(&p->pin.count))
-               kfree_rcu(p, pin.rcu);
+       if (atomic_long_dec_and_test(&p->count))
+               kfree_rcu(p, rcu);
 }
 
 static struct bsd_acct_struct *acct_get(struct pid_namespace *ns)
@@ -141,7 +143,7 @@ again:
                rcu_read_unlock();
                return NULL;
        }
-       if (!atomic_long_inc_not_zero(&res->pin.count)) {
+       if (!atomic_long_inc_not_zero(&res->count)) {
                rcu_read_unlock();
                cpu_relax();
                goto again;
@@ -179,7 +181,7 @@ static void acct_kill(struct bsd_acct_struct *acct,
                pin_remove(&acct->pin);
                ns->bacct = new;
                acct->ns = NULL;
-               atomic_long_dec(&acct->pin.count);
+               atomic_long_dec(&acct->count);
                mutex_unlock(&acct->lock);
                acct_put(acct);
        }
@@ -189,7 +191,7 @@ static void acct_pin_kill(struct fs_pin *pin)
 {
        struct bsd_acct_struct *acct;
        acct = container_of(pin, struct bsd_acct_struct, pin);
-       if (!atomic_long_inc_not_zero(&pin->count)) {
+       if (!atomic_long_inc_not_zero(&acct->count)) {
                rcu_read_unlock();
                cpu_relax();
                return;
@@ -250,7 +252,7 @@ static int acct_on(struct filename *pathname)
        mnt = file->f_path.mnt;
        file->f_path.mnt = internal;
 
-       atomic_long_set(&acct->pin.count, 1);
+       atomic_long_set(&acct->count, 1);
        acct->pin.kill = acct_pin_kill;
        acct->file = file;
        acct->needcheck = jiffies;