18
18
#include <keys/rxrpc-type.h>
19
19
#include "internal.h"
20
20
21
- DECLARE_RWSEM (afs_proc_cells_sem );
22
- LIST_HEAD (afs_proc_cells );
23
-
24
- static LIST_HEAD (afs_cells );
25
- static DEFINE_RWLOCK (afs_cells_lock );
26
- static DECLARE_RWSEM (afs_cells_sem ); /* add/remove serialisation */
27
- static DECLARE_WAIT_QUEUE_HEAD (afs_cells_freeable_wq );
28
- static struct afs_cell * afs_cell_root ;
29
-
30
21
/*
31
22
* allocate a cell record and fill in its name, VL server address list and
32
23
* allocate an anonymous key
33
24
*/
34
- static struct afs_cell * afs_cell_alloc (const char * name , unsigned namelen ,
25
+ static struct afs_cell * afs_cell_alloc (struct afs_net * net ,
26
+ const char * name , unsigned namelen ,
35
27
char * vllist )
36
28
{
37
29
struct afs_cell * cell ;
@@ -62,6 +54,7 @@ static struct afs_cell *afs_cell_alloc(const char *name, unsigned namelen,
62
54
63
55
atomic_set (& cell -> usage , 1 );
64
56
INIT_LIST_HEAD (& cell -> link );
57
+ cell -> net = net ;
65
58
rwlock_init (& cell -> servers_lock );
66
59
INIT_LIST_HEAD (& cell -> servers );
67
60
init_rwsem (& cell -> vl_sem );
@@ -142,36 +135,38 @@ static struct afs_cell *afs_cell_alloc(const char *name, unsigned namelen,
142
135
143
136
/*
144
137
* afs_cell_crate() - create a cell record
138
+ * @net: The network namespace
145
139
* @name: is the name of the cell.
146
140
* @namsesz: is the strlen of the cell name.
147
141
* @vllist: is a colon separated list of IP addresses in "a.b.c.d" format.
148
142
* @retref: is T to return the cell reference when the cell exists.
149
143
*/
150
- struct afs_cell * afs_cell_create (const char * name , unsigned namesz ,
144
+ struct afs_cell * afs_cell_create (struct afs_net * net ,
145
+ const char * name , unsigned namesz ,
151
146
char * vllist , bool retref )
152
147
{
153
148
struct afs_cell * cell ;
154
149
int ret ;
155
150
156
151
_enter ("%*.*s,%s" , namesz , namesz , name ?: "" , vllist );
157
152
158
- down_write (& afs_cells_sem );
159
- read_lock (& afs_cells_lock );
160
- list_for_each_entry (cell , & afs_cells , link ) {
153
+ down_write (& net -> cells_sem );
154
+ read_lock (& net -> cells_lock );
155
+ list_for_each_entry (cell , & net -> cells , link ) {
161
156
if (strncasecmp (cell -> name , name , namesz ) == 0 )
162
157
goto duplicate_name ;
163
158
}
164
- read_unlock (& afs_cells_lock );
159
+ read_unlock (& net -> cells_lock );
165
160
166
- cell = afs_cell_alloc (name , namesz , vllist );
161
+ cell = afs_cell_alloc (net , name , namesz , vllist );
167
162
if (IS_ERR (cell )) {
168
163
_leave (" = %ld" , PTR_ERR (cell ));
169
- up_write (& afs_cells_sem );
164
+ up_write (& net -> cells_sem );
170
165
return cell ;
171
166
}
172
167
173
168
/* add a proc directory for this cell */
174
- ret = afs_proc_cell_setup (cell );
169
+ ret = afs_proc_cell_setup (net , cell );
175
170
if (ret < 0 )
176
171
goto error ;
177
172
@@ -183,20 +178,20 @@ struct afs_cell *afs_cell_create(const char *name, unsigned namesz,
183
178
#endif
184
179
185
180
/* add to the cell lists */
186
- write_lock (& afs_cells_lock );
187
- list_add_tail (& cell -> link , & afs_cells );
188
- write_unlock (& afs_cells_lock );
181
+ write_lock (& net -> cells_lock );
182
+ list_add_tail (& cell -> link , & net -> cells );
183
+ write_unlock (& net -> cells_lock );
189
184
190
- down_write (& afs_proc_cells_sem );
191
- list_add_tail (& cell -> proc_link , & afs_proc_cells );
192
- up_write (& afs_proc_cells_sem );
193
- up_write (& afs_cells_sem );
185
+ down_write (& net -> proc_cells_sem );
186
+ list_add_tail (& cell -> proc_link , & net -> proc_cells );
187
+ up_write (& net -> proc_cells_sem );
188
+ up_write (& net -> cells_sem );
194
189
195
190
_leave (" = %p" , cell );
196
191
return cell ;
197
192
198
193
error :
199
- up_write (& afs_cells_sem );
194
+ up_write (& net -> cells_sem );
200
195
key_put (cell -> anonymous_key );
201
196
kfree (cell );
202
197
_leave (" = %d" , ret );
@@ -206,8 +201,8 @@ struct afs_cell *afs_cell_create(const char *name, unsigned namesz,
206
201
if (retref && !IS_ERR (cell ))
207
202
afs_get_cell (cell );
208
203
209
- read_unlock (& afs_cells_lock );
210
- up_write (& afs_cells_sem );
204
+ read_unlock (& net -> cells_lock );
205
+ up_write (& net -> cells_sem );
211
206
212
207
if (retref ) {
213
208
_leave (" = %p" , cell );
@@ -223,7 +218,7 @@ struct afs_cell *afs_cell_create(const char *name, unsigned namesz,
223
218
* - can be called with a module parameter string
224
219
* - can be called from a write to /proc/fs/afs/rootcell
225
220
*/
226
- int afs_cell_init (char * rootcell )
221
+ int afs_cell_init (struct afs_net * net , char * rootcell )
227
222
{
228
223
struct afs_cell * old_root , * new_root ;
229
224
char * cp ;
@@ -245,17 +240,17 @@ int afs_cell_init(char *rootcell)
245
240
* cp ++ = 0 ;
246
241
247
242
/* allocate a cell record for the root cell */
248
- new_root = afs_cell_create (rootcell , strlen (rootcell ), cp , false);
243
+ new_root = afs_cell_create (net , rootcell , strlen (rootcell ), cp , false);
249
244
if (IS_ERR (new_root )) {
250
245
_leave (" = %ld" , PTR_ERR (new_root ));
251
246
return PTR_ERR (new_root );
252
247
}
253
248
254
249
/* install the new cell */
255
- write_lock (& afs_cells_lock );
256
- old_root = afs_cell_root ;
257
- afs_cell_root = new_root ;
258
- write_unlock (& afs_cells_lock );
250
+ write_lock (& net -> cells_lock );
251
+ old_root = net -> ws_cell ;
252
+ net -> ws_cell = new_root ;
253
+ write_unlock (& net -> cells_lock );
259
254
afs_put_cell (old_root );
260
255
261
256
_leave (" = 0" );
@@ -265,19 +260,20 @@ int afs_cell_init(char *rootcell)
265
260
/*
266
261
* lookup a cell record
267
262
*/
268
- struct afs_cell * afs_cell_lookup (const char * name , unsigned namesz ,
263
+ struct afs_cell * afs_cell_lookup (struct afs_net * net ,
264
+ const char * name , unsigned namesz ,
269
265
bool dns_cell )
270
266
{
271
267
struct afs_cell * cell ;
272
268
273
269
_enter ("\"%*.*s\"," , namesz , namesz , name ?: "" );
274
270
275
- down_read (& afs_cells_sem );
276
- read_lock (& afs_cells_lock );
271
+ down_read (& net -> cells_sem );
272
+ read_lock (& net -> cells_lock );
277
273
278
274
if (name ) {
279
275
/* if the cell was named, look for it in the cell record list */
280
- list_for_each_entry (cell , & afs_cells , link ) {
276
+ list_for_each_entry (cell , & net -> cells , link ) {
281
277
if (strncmp (cell -> name , name , namesz ) == 0 ) {
282
278
afs_get_cell (cell );
283
279
goto found ;
@@ -289,7 +285,7 @@ struct afs_cell *afs_cell_lookup(const char *name, unsigned namesz,
289
285
found :
290
286
;
291
287
} else {
292
- cell = afs_cell_root ;
288
+ cell = net -> ws_cell ;
293
289
if (!cell ) {
294
290
/* this should not happen unless user tries to mount
295
291
* when root cell is not set. Return an impossibly
@@ -304,16 +300,16 @@ struct afs_cell *afs_cell_lookup(const char *name, unsigned namesz,
304
300
305
301
}
306
302
307
- read_unlock (& afs_cells_lock );
308
- up_read (& afs_cells_sem );
303
+ read_unlock (& net -> cells_lock );
304
+ up_read (& net -> cells_sem );
309
305
_leave (" = %p" , cell );
310
306
return cell ;
311
307
312
308
create_cell :
313
- read_unlock (& afs_cells_lock );
314
- up_read (& afs_cells_sem );
309
+ read_unlock (& net -> cells_lock );
310
+ up_read (& net -> cells_sem );
315
311
316
- cell = afs_cell_create (name , namesz , NULL , true);
312
+ cell = afs_cell_create (net , name , namesz , NULL , true);
317
313
318
314
_leave (" = %p" , cell );
319
315
return cell ;
@@ -325,14 +321,14 @@ struct afs_cell *afs_cell_lookup(const char *name, unsigned namesz,
325
321
*/
326
322
struct afs_cell * afs_get_cell_maybe (struct afs_cell * cell )
327
323
{
328
- write_lock (& afs_cells_lock );
324
+ write_lock (& net -> cells_lock );
329
325
330
326
if (cell && !list_empty (& cell -> link ))
331
327
afs_get_cell (cell );
332
328
else
333
329
cell = NULL ;
334
330
335
- write_unlock (& afs_cells_lock );
331
+ write_unlock (& net -> cells_lock );
336
332
return cell ;
337
333
}
338
334
#endif /* 0 */
@@ -351,30 +347,30 @@ void afs_put_cell(struct afs_cell *cell)
351
347
352
348
/* to prevent a race, the decrement and the dequeue must be effectively
353
349
* atomic */
354
- write_lock (& afs_cells_lock );
350
+ write_lock (& cell -> net -> cells_lock );
355
351
356
352
if (likely (!atomic_dec_and_test (& cell -> usage ))) {
357
- write_unlock (& afs_cells_lock );
353
+ write_unlock (& cell -> net -> cells_lock );
358
354
_leave ("" );
359
355
return ;
360
356
}
361
357
362
358
ASSERT (list_empty (& cell -> servers ));
363
359
ASSERT (list_empty (& cell -> vl_list ));
364
360
365
- write_unlock ( & afs_cells_lock );
361
+ wake_up ( & cell -> net -> cells_freeable_wq );
366
362
367
- wake_up ( & afs_cells_freeable_wq );
363
+ write_unlock ( & cell -> net -> cells_lock );
368
364
369
365
_leave (" [unused]" );
370
366
}
371
367
372
368
/*
373
369
* destroy a cell record
374
- * - must be called with the afs_cells_sem write-locked
370
+ * - must be called with the net->cells_sem write-locked
375
371
* - cell->link should have been broken by the caller
376
372
*/
377
- static void afs_cell_destroy (struct afs_cell * cell )
373
+ static void afs_cell_destroy (struct afs_net * net , struct afs_cell * cell )
378
374
{
379
375
_enter ("%p{%d,%s}" , cell , atomic_read (& cell -> usage ), cell -> name );
380
376
@@ -387,14 +383,14 @@ static void afs_cell_destroy(struct afs_cell *cell)
387
383
388
384
_debug ("wait for cell %s" , cell -> name );
389
385
set_current_state (TASK_UNINTERRUPTIBLE );
390
- add_wait_queue (& afs_cells_freeable_wq , & myself );
386
+ add_wait_queue (& net -> cells_freeable_wq , & myself );
391
387
392
388
while (atomic_read (& cell -> usage ) > 0 ) {
393
389
schedule ();
394
390
set_current_state (TASK_UNINTERRUPTIBLE );
395
391
}
396
392
397
- remove_wait_queue (& afs_cells_freeable_wq , & myself );
393
+ remove_wait_queue (& net -> cells_freeable_wq , & myself );
398
394
set_current_state (TASK_RUNNING );
399
395
}
400
396
@@ -403,11 +399,11 @@ static void afs_cell_destroy(struct afs_cell *cell)
403
399
ASSERT (list_empty (& cell -> servers ));
404
400
ASSERT (list_empty (& cell -> vl_list ));
405
401
406
- afs_proc_cell_remove (cell );
402
+ afs_proc_cell_remove (net , cell );
407
403
408
- down_write (& afs_proc_cells_sem );
404
+ down_write (& net -> proc_cells_sem );
409
405
list_del_init (& cell -> proc_link );
410
- up_write (& afs_proc_cells_sem );
406
+ up_write (& net -> proc_cells_sem );
411
407
412
408
#ifdef CONFIG_AFS_FSCACHE
413
409
fscache_relinquish_cookie (cell -> cache , 0 );
@@ -422,39 +418,39 @@ static void afs_cell_destroy(struct afs_cell *cell)
422
418
* purge in-memory cell database on module unload or afs_init() failure
423
419
* - the timeout daemon is stopped before calling this
424
420
*/
425
- void afs_cell_purge (void )
421
+ void afs_cell_purge (struct afs_net * net )
426
422
{
427
423
struct afs_cell * cell ;
428
424
429
425
_enter ("" );
430
426
431
- afs_put_cell (afs_cell_root );
427
+ afs_put_cell (net -> ws_cell );
432
428
433
- down_write (& afs_cells_sem );
429
+ down_write (& net -> cells_sem );
434
430
435
- while (!list_empty (& afs_cells )) {
431
+ while (!list_empty (& net -> cells )) {
436
432
cell = NULL ;
437
433
438
434
/* remove the next cell from the front of the list */
439
- write_lock (& afs_cells_lock );
435
+ write_lock (& net -> cells_lock );
440
436
441
- if (!list_empty (& afs_cells )) {
442
- cell = list_entry (afs_cells .next ,
437
+ if (!list_empty (& net -> cells )) {
438
+ cell = list_entry (net -> cells .next ,
443
439
struct afs_cell , link );
444
440
list_del_init (& cell -> link );
445
441
}
446
442
447
- write_unlock (& afs_cells_lock );
443
+ write_unlock (& net -> cells_lock );
448
444
449
445
if (cell ) {
450
446
_debug ("PURGING CELL %s (%d)" ,
451
447
cell -> name , atomic_read (& cell -> usage ));
452
448
453
449
/* now the cell should be left with no references */
454
- afs_cell_destroy (cell );
450
+ afs_cell_destroy (net , cell );
455
451
}
456
452
}
457
453
458
- up_write (& afs_cells_sem );
454
+ up_write (& net -> cells_sem );
459
455
_leave ("" );
460
456
}
0 commit comments