diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2014-08-07 08:00:52 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2014-08-07 14:40:08 -0400 |
commit | 1629d0eb3ead0e0c49e4402049ec7b5b31b81cd7 (patch) | |
tree | f080a4025e9c9b6d2bea11da4c8aa49b3ea54869 /kernel | |
parent | 215748e67d893169de9e62c3416e9e035e9e9c5f (diff) |
start carving bsd_acct_struct up
pull generic parts into struct fs_pin. Eventually we want those
to replace mnt_pin()/mnt_unpin() mess; that stuff will move to
fs/*.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/acct.c | 42 |
1 files changed, 23 insertions, 19 deletions
diff --git a/kernel/acct.c b/kernel/acct.c index 2d9e04d98998..afeaaa6f49bf 100644 --- a/kernel/acct.c +++ b/kernel/acct.c | |||
@@ -78,7 +78,7 @@ int acct_parm[3] = {4, 2, 30}; | |||
78 | */ | 78 | */ |
79 | static void do_acct_process(struct bsd_acct_struct *acct); | 79 | static void do_acct_process(struct bsd_acct_struct *acct); |
80 | 80 | ||
81 | struct bsd_acct_struct { | 81 | struct fs_pin { |
82 | atomic_long_t count; | 82 | atomic_long_t count; |
83 | union { | 83 | union { |
84 | struct { | 84 | struct { |
@@ -87,6 +87,10 @@ struct bsd_acct_struct { | |||
87 | }; | 87 | }; |
88 | struct rcu_head rcu; | 88 | struct rcu_head rcu; |
89 | }; | 89 | }; |
90 | }; | ||
91 | |||
92 | struct bsd_acct_struct { | ||
93 | struct fs_pin pin; | ||
90 | struct mutex lock; | 94 | struct mutex lock; |
91 | int active; | 95 | int active; |
92 | unsigned long needcheck; | 96 | unsigned long needcheck; |
@@ -96,9 +100,9 @@ struct bsd_acct_struct { | |||
96 | struct completion done; | 100 | struct completion done; |
97 | }; | 101 | }; |
98 | 102 | ||
99 | static void acct_free_rcu(struct rcu_head *head) | 103 | static void pin_free_rcu(struct rcu_head *head) |
100 | { | 104 | { |
101 | kfree(container_of(head, struct bsd_acct_struct, rcu)); | 105 | kfree(container_of(head, struct fs_pin, rcu)); |
102 | } | 106 | } |
103 | 107 | ||
104 | static DEFINE_SPINLOCK(acct_lock); | 108 | static DEFINE_SPINLOCK(acct_lock); |
@@ -138,15 +142,15 @@ out: | |||
138 | return acct->active; | 142 | return acct->active; |
139 | } | 143 | } |
140 | 144 | ||
141 | static void acct_put(struct bsd_acct_struct *p) | 145 | static void pin_put(struct fs_pin *p) |
142 | { | 146 | { |
143 | if (atomic_long_dec_and_test(&p->count)) | 147 | if (atomic_long_dec_and_test(&p->count)) |
144 | call_rcu(&p->rcu, acct_free_rcu); | 148 | call_rcu(&p->rcu, pin_free_rcu); |
145 | } | 149 | } |
146 | 150 | ||
147 | static struct bsd_acct_struct *__acct_get(struct bsd_acct_struct *res) | 151 | static struct bsd_acct_struct *__acct_get(struct bsd_acct_struct *res) |
148 | { | 152 | { |
149 | if (!atomic_long_inc_not_zero(&res->count)) { | 153 | if (!atomic_long_inc_not_zero(&res->pin.count)) { |
150 | rcu_read_unlock(); | 154 | rcu_read_unlock(); |
151 | cpu_relax(); | 155 | cpu_relax(); |
152 | return NULL; | 156 | return NULL; |
@@ -155,7 +159,7 @@ static struct bsd_acct_struct *__acct_get(struct bsd_acct_struct *res) | |||
155 | mutex_lock(&res->lock); | 159 | mutex_lock(&res->lock); |
156 | if (!res->ns) { | 160 | if (!res->ns) { |
157 | mutex_unlock(&res->lock); | 161 | mutex_unlock(&res->lock); |
158 | acct_put(res); | 162 | pin_put(&res->pin); |
159 | return NULL; | 163 | return NULL; |
160 | } | 164 | } |
161 | return res; | 165 | return res; |
@@ -200,22 +204,22 @@ static void acct_kill(struct bsd_acct_struct *acct, | |||
200 | schedule_work(&acct->work); | 204 | schedule_work(&acct->work); |
201 | wait_for_completion(&acct->done); | 205 | wait_for_completion(&acct->done); |
202 | spin_lock(&acct_lock); | 206 | spin_lock(&acct_lock); |
203 | hlist_del(&acct->m_list); | 207 | hlist_del(&acct->pin.m_list); |
204 | hlist_del(&acct->s_list); | 208 | hlist_del(&acct->pin.s_list); |
205 | spin_unlock(&acct_lock); | 209 | spin_unlock(&acct_lock); |
206 | ns->bacct = new; | 210 | ns->bacct = new; |
207 | if (new) { | 211 | if (new) { |
208 | struct vfsmount *m = new->file->f_path.mnt; | 212 | struct vfsmount *m = new->file->f_path.mnt; |
209 | spin_lock(&acct_lock); | 213 | spin_lock(&acct_lock); |
210 | hlist_add_head(&new->s_list, &m->mnt_sb->s_pins); | 214 | hlist_add_head(&new->pin.s_list, &m->mnt_sb->s_pins); |
211 | hlist_add_head(&new->m_list, &real_mount(m)->mnt_pins); | 215 | hlist_add_head(&new->pin.m_list, &real_mount(m)->mnt_pins); |
212 | spin_unlock(&acct_lock); | 216 | spin_unlock(&acct_lock); |
213 | mutex_unlock(&new->lock); | 217 | mutex_unlock(&new->lock); |
214 | } | 218 | } |
215 | acct->ns = NULL; | 219 | acct->ns = NULL; |
216 | atomic_long_dec(&acct->count); | 220 | atomic_long_dec(&acct->pin.count); |
217 | mutex_unlock(&acct->lock); | 221 | mutex_unlock(&acct->lock); |
218 | acct_put(acct); | 222 | pin_put(&acct->pin); |
219 | } | 223 | } |
220 | } | 224 | } |
221 | 225 | ||
@@ -249,7 +253,7 @@ static int acct_on(struct filename *pathname) | |||
249 | return -EIO; | 253 | return -EIO; |
250 | } | 254 | } |
251 | 255 | ||
252 | atomic_long_set(&acct->count, 1); | 256 | atomic_long_set(&acct->pin.count, 1); |
253 | acct->file = file; | 257 | acct->file = file; |
254 | acct->needcheck = jiffies; | 258 | acct->needcheck = jiffies; |
255 | acct->ns = ns; | 259 | acct->ns = ns; |
@@ -264,8 +268,8 @@ static int acct_on(struct filename *pathname) | |||
264 | } else { | 268 | } else { |
265 | ns->bacct = acct; | 269 | ns->bacct = acct; |
266 | spin_lock(&acct_lock); | 270 | spin_lock(&acct_lock); |
267 | hlist_add_head(&acct->s_list, &mnt->mnt_sb->s_pins); | 271 | hlist_add_head(&acct->pin.s_list, &mnt->mnt_sb->s_pins); |
268 | hlist_add_head(&acct->m_list, &real_mount(mnt)->mnt_pins); | 272 | hlist_add_head(&acct->pin.m_list, &real_mount(mnt)->mnt_pins); |
269 | spin_unlock(&acct_lock); | 273 | spin_unlock(&acct_lock); |
270 | mutex_unlock(&acct->lock); | 274 | mutex_unlock(&acct->lock); |
271 | } | 275 | } |
@@ -317,7 +321,7 @@ void acct_auto_close_mnt(struct hlist_head *list) | |||
317 | break; | 321 | break; |
318 | acct_kill(__acct_get(hlist_entry(p, | 322 | acct_kill(__acct_get(hlist_entry(p, |
319 | struct bsd_acct_struct, | 323 | struct bsd_acct_struct, |
320 | m_list)), NULL); | 324 | pin.m_list)), NULL); |
321 | rcu_read_lock(); | 325 | rcu_read_lock(); |
322 | } | 326 | } |
323 | rcu_read_unlock(); | 327 | rcu_read_unlock(); |
@@ -332,7 +336,7 @@ void acct_auto_close(struct hlist_head *list) | |||
332 | break; | 336 | break; |
333 | acct_kill(__acct_get(hlist_entry(p, | 337 | acct_kill(__acct_get(hlist_entry(p, |
334 | struct bsd_acct_struct, | 338 | struct bsd_acct_struct, |
335 | s_list)), NULL); | 339 | pin.s_list)), NULL); |
336 | rcu_read_lock(); | 340 | rcu_read_lock(); |
337 | } | 341 | } |
338 | rcu_read_unlock(); | 342 | rcu_read_unlock(); |
@@ -613,7 +617,7 @@ static void slow_acct_process(struct pid_namespace *ns) | |||
613 | if (acct) { | 617 | if (acct) { |
614 | do_acct_process(acct); | 618 | do_acct_process(acct); |
615 | mutex_unlock(&acct->lock); | 619 | mutex_unlock(&acct->lock); |
616 | acct_put(acct); | 620 | pin_put(&acct->pin); |
617 | } | 621 | } |
618 | } | 622 | } |
619 | } | 623 | } |