59
59
#include <asm/div64.h>
60
60
#include <linux/blkdev.h> /* sector_div */
61
61
#include <linux/pid_namespace.h>
62
- #include <../fs/mount .h> /* will go away when we refactor */
62
+ #include <linux/fs_pin .h>
63
63
64
64
/*
65
65
* These constants control the amount of freespace that suspend and
@@ -78,17 +78,6 @@ int acct_parm[3] = {4, 2, 30};
78
78
*/
79
79
static void do_acct_process (struct bsd_acct_struct * acct );
80
80
81
- struct fs_pin {
82
- atomic_long_t count ;
83
- union {
84
- struct {
85
- struct hlist_node s_list ;
86
- struct hlist_node m_list ;
87
- };
88
- struct rcu_head rcu ;
89
- };
90
- };
91
-
92
81
struct bsd_acct_struct {
93
82
struct fs_pin pin ;
94
83
struct mutex lock ;
@@ -100,13 +89,6 @@ struct bsd_acct_struct {
100
89
struct completion done ;
101
90
};
102
91
103
- static void pin_free_rcu (struct rcu_head * head )
104
- {
105
- kfree (container_of (head , struct fs_pin , rcu ));
106
- }
107
-
108
- static DEFINE_SPINLOCK (acct_lock );
109
-
110
92
/*
111
93
* Check the amount of free space and suspend/resume accordingly.
112
94
*/
@@ -142,29 +124,6 @@ static int check_free_space(struct bsd_acct_struct *acct)
142
124
return acct -> active ;
143
125
}
144
126
145
- static void pin_put (struct fs_pin * p )
146
- {
147
- if (atomic_long_dec_and_test (& p -> count ))
148
- call_rcu (& p -> rcu , pin_free_rcu );
149
- }
150
-
151
- static struct bsd_acct_struct * __acct_get (struct bsd_acct_struct * res )
152
- {
153
- if (!atomic_long_inc_not_zero (& res -> pin .count )) {
154
- rcu_read_unlock ();
155
- cpu_relax ();
156
- return NULL ;
157
- }
158
- rcu_read_unlock ();
159
- mutex_lock (& res -> lock );
160
- if (!res -> ns ) {
161
- mutex_unlock (& res -> lock );
162
- pin_put (& res -> pin );
163
- return NULL ;
164
- }
165
- return res ;
166
- }
167
-
168
127
static struct bsd_acct_struct * acct_get (struct pid_namespace * ns )
169
128
{
170
129
struct bsd_acct_struct * res ;
@@ -176,9 +135,18 @@ static struct bsd_acct_struct *acct_get(struct pid_namespace *ns)
176
135
rcu_read_unlock ();
177
136
return NULL ;
178
137
}
179
- res = __acct_get (res );
180
- if (!res )
138
+ if (!atomic_long_inc_not_zero (& res -> pin .count )) {
139
+ rcu_read_unlock ();
140
+ cpu_relax ();
181
141
goto again ;
142
+ }
143
+ rcu_read_unlock ();
144
+ mutex_lock (& res -> lock );
145
+ if (!res -> ns ) {
146
+ mutex_unlock (& res -> lock );
147
+ pin_put (& res -> pin );
148
+ goto again ;
149
+ }
182
150
return res ;
183
151
}
184
152
@@ -203,26 +171,28 @@ static void acct_kill(struct bsd_acct_struct *acct,
203
171
init_completion (& acct -> done );
204
172
schedule_work (& acct -> work );
205
173
wait_for_completion (& acct -> done );
206
- spin_lock (& acct_lock );
207
- hlist_del (& acct -> pin .m_list );
208
- hlist_del (& acct -> pin .s_list );
209
- spin_unlock (& acct_lock );
174
+ pin_remove (& acct -> pin );
210
175
ns -> bacct = new ;
211
- if (new ) {
212
- struct vfsmount * m = new -> file -> f_path .mnt ;
213
- spin_lock (& acct_lock );
214
- hlist_add_head (& new -> pin .s_list , & m -> mnt_sb -> s_pins );
215
- hlist_add_head (& new -> pin .m_list , & real_mount (m )-> mnt_pins );
216
- spin_unlock (& acct_lock );
217
- mutex_unlock (& new -> lock );
218
- }
219
176
acct -> ns = NULL ;
220
177
atomic_long_dec (& acct -> pin .count );
221
178
mutex_unlock (& acct -> lock );
222
179
pin_put (& acct -> pin );
223
180
}
224
181
}
225
182
183
+ static void acct_pin_kill (struct fs_pin * pin )
184
+ {
185
+ struct bsd_acct_struct * acct ;
186
+ acct = container_of (pin , struct bsd_acct_struct , pin );
187
+ mutex_lock (& acct -> lock );
188
+ if (!acct -> ns ) {
189
+ mutex_unlock (& acct -> lock );
190
+ pin_put (pin );
191
+ acct = NULL ;
192
+ }
193
+ acct_kill (acct , NULL );
194
+ }
195
+
226
196
static int acct_on (struct filename * pathname )
227
197
{
228
198
struct file * file ;
@@ -254,25 +224,22 @@ static int acct_on(struct filename *pathname)
254
224
}
255
225
256
226
atomic_long_set (& acct -> pin .count , 1 );
227
+ acct -> pin .kill = acct_pin_kill ;
257
228
acct -> file = file ;
258
229
acct -> needcheck = jiffies ;
259
230
acct -> ns = ns ;
260
231
mutex_init (& acct -> lock );
261
232
mnt = file -> f_path .mnt ;
262
233
mnt_pin (mnt );
234
+ mutex_lock_nested (& acct -> lock , 1 ); /* nobody has seen it yet */
235
+ pin_insert (& acct -> pin , mnt );
263
236
264
237
old = acct_get (ns );
265
- mutex_lock_nested (& acct -> lock , 1 ); /* nobody has seen it yet */
266
- if (old ) {
238
+ if (old )
267
239
acct_kill (old , acct );
268
- } else {
240
+ else
269
241
ns -> bacct = acct ;
270
- spin_lock (& acct_lock );
271
- hlist_add_head (& acct -> pin .s_list , & mnt -> mnt_sb -> s_pins );
272
- hlist_add_head (& acct -> pin .m_list , & real_mount (mnt )-> mnt_pins );
273
- spin_unlock (& acct_lock );
274
- mutex_unlock (& acct -> lock );
275
- }
242
+ mutex_unlock (& acct -> lock );
276
243
mntput (mnt ); /* it's pinned, now give up active reference */
277
244
return 0 ;
278
245
}
@@ -312,36 +279,6 @@ SYSCALL_DEFINE1(acct, const char __user *, name)
312
279
return error ;
313
280
}
314
281
315
- void acct_auto_close_mnt (struct hlist_head * list )
316
- {
317
- rcu_read_lock ();
318
- while (1 ) {
319
- struct hlist_node * p = ACCESS_ONCE (list -> first );
320
- if (!p )
321
- break ;
322
- acct_kill (__acct_get (hlist_entry (p ,
323
- struct bsd_acct_struct ,
324
- pin .m_list )), NULL );
325
- rcu_read_lock ();
326
- }
327
- rcu_read_unlock ();
328
- }
329
-
330
- void acct_auto_close (struct hlist_head * list )
331
- {
332
- rcu_read_lock ();
333
- while (1 ) {
334
- struct hlist_node * p = ACCESS_ONCE (list -> first );
335
- if (!p )
336
- break ;
337
- acct_kill (__acct_get (hlist_entry (p ,
338
- struct bsd_acct_struct ,
339
- pin .s_list )), NULL );
340
- rcu_read_lock ();
341
- }
342
- rcu_read_unlock ();
343
- }
344
-
345
282
void acct_exit_ns (struct pid_namespace * ns )
346
283
{
347
284
acct_kill (acct_get (ns ), NULL );
0 commit comments