OSDN Git Service

afs: Fix characters allowed into cell names
[tomoyo/tomoyo-test1.git] / fs / afs / cell.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* AFS cell and server record management
3  *
4  * Copyright (C) 2002, 2017 Red Hat, Inc. All Rights Reserved.
5  * Written by David Howells (dhowells@redhat.com)
6  */
7
8 #include <linux/slab.h>
9 #include <linux/key.h>
10 #include <linux/ctype.h>
11 #include <linux/dns_resolver.h>
12 #include <linux/sched.h>
13 #include <linux/inet.h>
14 #include <linux/namei.h>
15 #include <keys/rxrpc-type.h>
16 #include "internal.h"
17
18 static unsigned __read_mostly afs_cell_gc_delay = 10;
19 static unsigned __read_mostly afs_cell_min_ttl = 10 * 60;
20 static unsigned __read_mostly afs_cell_max_ttl = 24 * 60 * 60;
21
22 static void afs_manage_cell(struct work_struct *);
23
24 static void afs_dec_cells_outstanding(struct afs_net *net)
25 {
26         if (atomic_dec_and_test(&net->cells_outstanding))
27                 wake_up_var(&net->cells_outstanding);
28 }
29
30 /*
31  * Set the cell timer to fire after a given delay, assuming it's not already
32  * set for an earlier time.
33  */
34 static void afs_set_cell_timer(struct afs_net *net, time64_t delay)
35 {
36         if (net->live) {
37                 atomic_inc(&net->cells_outstanding);
38                 if (timer_reduce(&net->cells_timer, jiffies + delay * HZ))
39                         afs_dec_cells_outstanding(net);
40         }
41 }
42
43 /*
44  * Look up and get an activation reference on a cell record under RCU
45  * conditions.  The caller must hold the RCU read lock.
46  */
47 struct afs_cell *afs_lookup_cell_rcu(struct afs_net *net,
48                                      const char *name, unsigned int namesz)
49 {
50         struct afs_cell *cell = NULL;
51         struct rb_node *p;
52         int n, seq = 0, ret = 0;
53
54         _enter("%*.*s", namesz, namesz, name);
55
56         if (name && namesz == 0)
57                 return ERR_PTR(-EINVAL);
58         if (namesz > AFS_MAXCELLNAME)
59                 return ERR_PTR(-ENAMETOOLONG);
60
61         do {
62                 /* Unfortunately, rbtree walking doesn't give reliable results
63                  * under just the RCU read lock, so we have to check for
64                  * changes.
65                  */
66                 if (cell)
67                         afs_put_cell(net, cell);
68                 cell = NULL;
69                 ret = -ENOENT;
70
71                 read_seqbegin_or_lock(&net->cells_lock, &seq);
72
73                 if (!name) {
74                         cell = rcu_dereference_raw(net->ws_cell);
75                         if (cell) {
76                                 afs_get_cell(cell);
77                                 ret = 0;
78                                 break;
79                         }
80                         ret = -EDESTADDRREQ;
81                         continue;
82                 }
83
84                 p = rcu_dereference_raw(net->cells.rb_node);
85                 while (p) {
86                         cell = rb_entry(p, struct afs_cell, net_node);
87
88                         n = strncasecmp(cell->name, name,
89                                         min_t(size_t, cell->name_len, namesz));
90                         if (n == 0)
91                                 n = cell->name_len - namesz;
92                         if (n < 0) {
93                                 p = rcu_dereference_raw(p->rb_left);
94                         } else if (n > 0) {
95                                 p = rcu_dereference_raw(p->rb_right);
96                         } else {
97                                 if (atomic_inc_not_zero(&cell->usage)) {
98                                         ret = 0;
99                                         break;
100                                 }
101                                 /* We want to repeat the search, this time with
102                                  * the lock properly locked.
103                                  */
104                         }
105                         cell = NULL;
106                 }
107
108         } while (need_seqretry(&net->cells_lock, seq));
109
110         done_seqretry(&net->cells_lock, seq);
111
112         if (ret != 0 && cell)
113                 afs_put_cell(net, cell);
114
115         return ret == 0 ? cell : ERR_PTR(ret);
116 }
117
118 /*
119  * Set up a cell record and fill in its name, VL server address list and
120  * allocate an anonymous key
121  */
122 static struct afs_cell *afs_alloc_cell(struct afs_net *net,
123                                        const char *name, unsigned int namelen,
124                                        const char *addresses)
125 {
126         struct afs_vlserver_list *vllist;
127         struct afs_cell *cell;
128         int i, ret;
129
130         ASSERT(name);
131         if (namelen == 0)
132                 return ERR_PTR(-EINVAL);
133         if (namelen > AFS_MAXCELLNAME) {
134                 _leave(" = -ENAMETOOLONG");
135                 return ERR_PTR(-ENAMETOOLONG);
136         }
137
138         /* Prohibit cell names that contain unprintable chars, '/' and '@' or
139          * that begin with a dot.  This also precludes "@cell".
140          */
141         if (name[0] == '.')
142                 return ERR_PTR(-EINVAL);
143         for (i = 0; i < namelen; i++) {
144                 char ch = name[i];
145                 if (!isprint(ch) || ch == '/' || ch == '@')
146                         return ERR_PTR(-EINVAL);
147         }
148
149         _enter("%*.*s,%s", namelen, namelen, name, addresses);
150
151         cell = kzalloc(sizeof(struct afs_cell), GFP_KERNEL);
152         if (!cell) {
153                 _leave(" = -ENOMEM");
154                 return ERR_PTR(-ENOMEM);
155         }
156
157         cell->net = net;
158         cell->name_len = namelen;
159         for (i = 0; i < namelen; i++)
160                 cell->name[i] = tolower(name[i]);
161
162         atomic_set(&cell->usage, 2);
163         INIT_WORK(&cell->manager, afs_manage_cell);
164         INIT_LIST_HEAD(&cell->proc_volumes);
165         rwlock_init(&cell->proc_lock);
166         rwlock_init(&cell->vl_servers_lock);
167
168         /* Provide a VL server list, filling it in if we were given a list of
169          * addresses to use.
170          */
171         if (addresses) {
172                 vllist = afs_parse_text_addrs(net,
173                                               addresses, strlen(addresses), ':',
174                                               VL_SERVICE, AFS_VL_PORT);
175                 if (IS_ERR(vllist)) {
176                         ret = PTR_ERR(vllist);
177                         goto parse_failed;
178                 }
179
180                 vllist->source = DNS_RECORD_FROM_CONFIG;
181                 vllist->status = DNS_LOOKUP_NOT_DONE;
182                 cell->dns_expiry = TIME64_MAX;
183         } else {
184                 ret = -ENOMEM;
185                 vllist = afs_alloc_vlserver_list(0);
186                 if (!vllist)
187                         goto error;
188                 vllist->source = DNS_RECORD_UNAVAILABLE;
189                 vllist->status = DNS_LOOKUP_NOT_DONE;
190                 cell->dns_expiry = ktime_get_real_seconds();
191         }
192
193         rcu_assign_pointer(cell->vl_servers, vllist);
194
195         cell->dns_source = vllist->source;
196         cell->dns_status = vllist->status;
197         smp_store_release(&cell->dns_lookup_count, 1); /* vs source/status */
198
199         _leave(" = %p", cell);
200         return cell;
201
202 parse_failed:
203         if (ret == -EINVAL)
204                 printk(KERN_ERR "kAFS: bad VL server IP address\n");
205 error:
206         kfree(cell);
207         _leave(" = %d", ret);
208         return ERR_PTR(ret);
209 }
210
211 /*
212  * afs_lookup_cell - Look up or create a cell record.
213  * @net:        The network namespace
214  * @name:       The name of the cell.
215  * @namesz:     The strlen of the cell name.
216  * @vllist:     A colon/comma separated list of numeric IP addresses or NULL.
217  * @excl:       T if an error should be given if the cell name already exists.
218  *
219  * Look up a cell record by name and query the DNS for VL server addresses if
220  * needed.  Note that that actual DNS query is punted off to the manager thread
221  * so that this function can return immediately if interrupted whilst allowing
222  * cell records to be shared even if not yet fully constructed.
223  */
224 struct afs_cell *afs_lookup_cell(struct afs_net *net,
225                                  const char *name, unsigned int namesz,
226                                  const char *vllist, bool excl)
227 {
228         struct afs_cell *cell, *candidate, *cursor;
229         struct rb_node *parent, **pp;
230         enum afs_cell_state state;
231         int ret, n;
232
233         _enter("%s,%s", name, vllist);
234
235         if (!excl) {
236                 rcu_read_lock();
237                 cell = afs_lookup_cell_rcu(net, name, namesz);
238                 rcu_read_unlock();
239                 if (!IS_ERR(cell))
240                         goto wait_for_cell;
241         }
242
243         /* Assume we're probably going to create a cell and preallocate and
244          * mostly set up a candidate record.  We can then use this to stash the
245          * name, the net namespace and VL server addresses.
246          *
247          * We also want to do this before we hold any locks as it may involve
248          * upcalling to userspace to make DNS queries.
249          */
250         candidate = afs_alloc_cell(net, name, namesz, vllist);
251         if (IS_ERR(candidate)) {
252                 _leave(" = %ld", PTR_ERR(candidate));
253                 return candidate;
254         }
255
256         /* Find the insertion point and check to see if someone else added a
257          * cell whilst we were allocating.
258          */
259         write_seqlock(&net->cells_lock);
260
261         pp = &net->cells.rb_node;
262         parent = NULL;
263         while (*pp) {
264                 parent = *pp;
265                 cursor = rb_entry(parent, struct afs_cell, net_node);
266
267                 n = strncasecmp(cursor->name, name,
268                                 min_t(size_t, cursor->name_len, namesz));
269                 if (n == 0)
270                         n = cursor->name_len - namesz;
271                 if (n < 0)
272                         pp = &(*pp)->rb_left;
273                 else if (n > 0)
274                         pp = &(*pp)->rb_right;
275                 else
276                         goto cell_already_exists;
277         }
278
279         cell = candidate;
280         candidate = NULL;
281         rb_link_node_rcu(&cell->net_node, parent, pp);
282         rb_insert_color(&cell->net_node, &net->cells);
283         atomic_inc(&net->cells_outstanding);
284         write_sequnlock(&net->cells_lock);
285
286         queue_work(afs_wq, &cell->manager);
287
288 wait_for_cell:
289         _debug("wait_for_cell");
290         wait_var_event(&cell->state,
291                        ({
292                                state = smp_load_acquire(&cell->state); /* vs error */
293                                state == AFS_CELL_ACTIVE || state == AFS_CELL_FAILED;
294                        }));
295
296         /* Check the state obtained from the wait check. */
297         if (state == AFS_CELL_FAILED) {
298                 ret = cell->error;
299                 goto error;
300         }
301
302         _leave(" = %p [cell]", cell);
303         return cell;
304
305 cell_already_exists:
306         _debug("cell exists");
307         cell = cursor;
308         if (excl) {
309                 ret = -EEXIST;
310         } else {
311                 afs_get_cell(cursor);
312                 ret = 0;
313         }
314         write_sequnlock(&net->cells_lock);
315         kfree(candidate);
316         if (ret == 0)
317                 goto wait_for_cell;
318         goto error_noput;
319 error:
320         afs_put_cell(net, cell);
321 error_noput:
322         _leave(" = %d [error]", ret);
323         return ERR_PTR(ret);
324 }
325
326 /*
327  * set the root cell information
328  * - can be called with a module parameter string
329  * - can be called from a write to /proc/fs/afs/rootcell
330  */
331 int afs_cell_init(struct afs_net *net, const char *rootcell)
332 {
333         struct afs_cell *old_root, *new_root;
334         const char *cp, *vllist;
335         size_t len;
336
337         _enter("");
338
339         if (!rootcell) {
340                 /* module is loaded with no parameters, or built statically.
341                  * - in the future we might initialize cell DB here.
342                  */
343                 _leave(" = 0 [no root]");
344                 return 0;
345         }
346
347         cp = strchr(rootcell, ':');
348         if (!cp) {
349                 _debug("kAFS: no VL server IP addresses specified");
350                 vllist = NULL;
351                 len = strlen(rootcell);
352         } else {
353                 vllist = cp + 1;
354                 len = cp - rootcell;
355         }
356
357         /* allocate a cell record for the root cell */
358         new_root = afs_lookup_cell(net, rootcell, len, vllist, false);
359         if (IS_ERR(new_root)) {
360                 _leave(" = %ld", PTR_ERR(new_root));
361                 return PTR_ERR(new_root);
362         }
363
364         if (!test_and_set_bit(AFS_CELL_FL_NO_GC, &new_root->flags))
365                 afs_get_cell(new_root);
366
367         /* install the new cell */
368         write_seqlock(&net->cells_lock);
369         old_root = rcu_access_pointer(net->ws_cell);
370         rcu_assign_pointer(net->ws_cell, new_root);
371         write_sequnlock(&net->cells_lock);
372
373         afs_put_cell(net, old_root);
374         _leave(" = 0");
375         return 0;
376 }
377
378 /*
379  * Update a cell's VL server address list from the DNS.
380  */
381 static int afs_update_cell(struct afs_cell *cell)
382 {
383         struct afs_vlserver_list *vllist, *old = NULL, *p;
384         unsigned int min_ttl = READ_ONCE(afs_cell_min_ttl);
385         unsigned int max_ttl = READ_ONCE(afs_cell_max_ttl);
386         time64_t now, expiry = 0;
387         int ret = 0;
388
389         _enter("%s", cell->name);
390
391         vllist = afs_dns_query(cell, &expiry);
392         if (IS_ERR(vllist)) {
393                 ret = PTR_ERR(vllist);
394
395                 _debug("%s: fail %d", cell->name, ret);
396                 if (ret == -ENOMEM)
397                         goto out_wake;
398
399                 ret = -ENOMEM;
400                 vllist = afs_alloc_vlserver_list(0);
401                 if (!vllist)
402                         goto out_wake;
403
404                 switch (ret) {
405                 case -ENODATA:
406                 case -EDESTADDRREQ:
407                         vllist->status = DNS_LOOKUP_GOT_NOT_FOUND;
408                         break;
409                 case -EAGAIN:
410                 case -ECONNREFUSED:
411                         vllist->status = DNS_LOOKUP_GOT_TEMP_FAILURE;
412                         break;
413                 default:
414                         vllist->status = DNS_LOOKUP_GOT_LOCAL_FAILURE;
415                         break;
416                 }
417         }
418
419         _debug("%s: got list %d %d", cell->name, vllist->source, vllist->status);
420         cell->dns_status = vllist->status;
421
422         now = ktime_get_real_seconds();
423         if (min_ttl > max_ttl)
424                 max_ttl = min_ttl;
425         if (expiry < now + min_ttl)
426                 expiry = now + min_ttl;
427         else if (expiry > now + max_ttl)
428                 expiry = now + max_ttl;
429
430         _debug("%s: status %d", cell->name, vllist->status);
431         if (vllist->source == DNS_RECORD_UNAVAILABLE) {
432                 switch (vllist->status) {
433                 case DNS_LOOKUP_GOT_NOT_FOUND:
434                         /* The DNS said that the cell does not exist or there
435                          * weren't any addresses to be had.
436                          */
437                         cell->dns_expiry = expiry;
438                         break;
439
440                 case DNS_LOOKUP_BAD:
441                 case DNS_LOOKUP_GOT_LOCAL_FAILURE:
442                 case DNS_LOOKUP_GOT_TEMP_FAILURE:
443                 case DNS_LOOKUP_GOT_NS_FAILURE:
444                 default:
445                         cell->dns_expiry = now + 10;
446                         break;
447                 }
448         } else {
449                 cell->dns_expiry = expiry;
450         }
451
452         /* Replace the VL server list if the new record has servers or the old
453          * record doesn't.
454          */
455         write_lock(&cell->vl_servers_lock);
456         p = rcu_dereference_protected(cell->vl_servers, true);
457         if (vllist->nr_servers > 0 || p->nr_servers == 0) {
458                 rcu_assign_pointer(cell->vl_servers, vllist);
459                 cell->dns_source = vllist->source;
460                 old = p;
461         }
462         write_unlock(&cell->vl_servers_lock);
463         afs_put_vlserverlist(cell->net, old);
464
465 out_wake:
466         smp_store_release(&cell->dns_lookup_count,
467                           cell->dns_lookup_count + 1); /* vs source/status */
468         wake_up_var(&cell->dns_lookup_count);
469         _leave(" = %d", ret);
470         return ret;
471 }
472
473 /*
474  * Destroy a cell record
475  */
476 static void afs_cell_destroy(struct rcu_head *rcu)
477 {
478         struct afs_cell *cell = container_of(rcu, struct afs_cell, rcu);
479
480         _enter("%p{%s}", cell, cell->name);
481
482         ASSERTCMP(atomic_read(&cell->usage), ==, 0);
483
484         afs_put_vlserverlist(cell->net, rcu_access_pointer(cell->vl_servers));
485         key_put(cell->anonymous_key);
486         kfree(cell);
487
488         _leave(" [destroyed]");
489 }
490
491 /*
492  * Queue the cell manager.
493  */
494 static void afs_queue_cell_manager(struct afs_net *net)
495 {
496         int outstanding = atomic_inc_return(&net->cells_outstanding);
497
498         _enter("%d", outstanding);
499
500         if (!queue_work(afs_wq, &net->cells_manager))
501                 afs_dec_cells_outstanding(net);
502 }
503
504 /*
505  * Cell management timer.  We have an increment on cells_outstanding that we
506  * need to pass along to the work item.
507  */
508 void afs_cells_timer(struct timer_list *timer)
509 {
510         struct afs_net *net = container_of(timer, struct afs_net, cells_timer);
511
512         _enter("");
513         if (!queue_work(afs_wq, &net->cells_manager))
514                 afs_dec_cells_outstanding(net);
515 }
516
517 /*
518  * Get a reference on a cell record.
519  */
520 struct afs_cell *afs_get_cell(struct afs_cell *cell)
521 {
522         atomic_inc(&cell->usage);
523         return cell;
524 }
525
526 /*
527  * Drop a reference on a cell record.
528  */
529 void afs_put_cell(struct afs_net *net, struct afs_cell *cell)
530 {
531         time64_t now, expire_delay;
532
533         if (!cell)
534                 return;
535
536         _enter("%s", cell->name);
537
538         now = ktime_get_real_seconds();
539         cell->last_inactive = now;
540         expire_delay = 0;
541         if (cell->vl_servers->nr_servers)
542                 expire_delay = afs_cell_gc_delay;
543
544         if (atomic_dec_return(&cell->usage) > 1)
545                 return;
546
547         /* 'cell' may now be garbage collected. */
548         afs_set_cell_timer(net, expire_delay);
549 }
550
551 /*
552  * Allocate a key to use as a placeholder for anonymous user security.
553  */
554 static int afs_alloc_anon_key(struct afs_cell *cell)
555 {
556         struct key *key;
557         char keyname[4 + AFS_MAXCELLNAME + 1], *cp, *dp;
558
559         /* Create a key to represent an anonymous user. */
560         memcpy(keyname, "afs@", 4);
561         dp = keyname + 4;
562         cp = cell->name;
563         do {
564                 *dp++ = tolower(*cp);
565         } while (*cp++);
566
567         key = rxrpc_get_null_key(keyname);
568         if (IS_ERR(key))
569                 return PTR_ERR(key);
570
571         cell->anonymous_key = key;
572
573         _debug("anon key %p{%x}",
574                cell->anonymous_key, key_serial(cell->anonymous_key));
575         return 0;
576 }
577
578 /*
579  * Activate a cell.
580  */
581 static int afs_activate_cell(struct afs_net *net, struct afs_cell *cell)
582 {
583         struct hlist_node **p;
584         struct afs_cell *pcell;
585         int ret;
586
587         if (!cell->anonymous_key) {
588                 ret = afs_alloc_anon_key(cell);
589                 if (ret < 0)
590                         return ret;
591         }
592
593 #ifdef CONFIG_AFS_FSCACHE
594         cell->cache = fscache_acquire_cookie(afs_cache_netfs.primary_index,
595                                              &afs_cell_cache_index_def,
596                                              cell->name, strlen(cell->name),
597                                              NULL, 0,
598                                              cell, 0, true);
599 #endif
600         ret = afs_proc_cell_setup(cell);
601         if (ret < 0)
602                 return ret;
603
604         mutex_lock(&net->proc_cells_lock);
605         for (p = &net->proc_cells.first; *p; p = &(*p)->next) {
606                 pcell = hlist_entry(*p, struct afs_cell, proc_link);
607                 if (strcmp(cell->name, pcell->name) < 0)
608                         break;
609         }
610
611         cell->proc_link.pprev = p;
612         cell->proc_link.next = *p;
613         rcu_assign_pointer(*p, &cell->proc_link.next);
614         if (cell->proc_link.next)
615                 cell->proc_link.next->pprev = &cell->proc_link.next;
616
617         afs_dynroot_mkdir(net, cell);
618         mutex_unlock(&net->proc_cells_lock);
619         return 0;
620 }
621
622 /*
623  * Deactivate a cell.
624  */
625 static void afs_deactivate_cell(struct afs_net *net, struct afs_cell *cell)
626 {
627         _enter("%s", cell->name);
628
629         afs_proc_cell_remove(cell);
630
631         mutex_lock(&net->proc_cells_lock);
632         hlist_del_rcu(&cell->proc_link);
633         afs_dynroot_rmdir(net, cell);
634         mutex_unlock(&net->proc_cells_lock);
635
636 #ifdef CONFIG_AFS_FSCACHE
637         fscache_relinquish_cookie(cell->cache, NULL, false);
638         cell->cache = NULL;
639 #endif
640
641         _leave("");
642 }
643
644 /*
645  * Manage a cell record, initialising and destroying it, maintaining its DNS
646  * records.
647  */
648 static void afs_manage_cell(struct work_struct *work)
649 {
650         struct afs_cell *cell = container_of(work, struct afs_cell, manager);
651         struct afs_net *net = cell->net;
652         bool deleted;
653         int ret, usage;
654
655         _enter("%s", cell->name);
656
657 again:
658         _debug("state %u", cell->state);
659         switch (cell->state) {
660         case AFS_CELL_INACTIVE:
661         case AFS_CELL_FAILED:
662                 write_seqlock(&net->cells_lock);
663                 usage = 1;
664                 deleted = atomic_try_cmpxchg_relaxed(&cell->usage, &usage, 0);
665                 if (deleted)
666                         rb_erase(&cell->net_node, &net->cells);
667                 write_sequnlock(&net->cells_lock);
668                 if (deleted)
669                         goto final_destruction;
670                 if (cell->state == AFS_CELL_FAILED)
671                         goto done;
672                 smp_store_release(&cell->state, AFS_CELL_UNSET);
673                 wake_up_var(&cell->state);
674                 goto again;
675
676         case AFS_CELL_UNSET:
677                 smp_store_release(&cell->state, AFS_CELL_ACTIVATING);
678                 wake_up_var(&cell->state);
679                 goto again;
680
681         case AFS_CELL_ACTIVATING:
682                 ret = afs_activate_cell(net, cell);
683                 if (ret < 0)
684                         goto activation_failed;
685
686                 smp_store_release(&cell->state, AFS_CELL_ACTIVE);
687                 wake_up_var(&cell->state);
688                 goto again;
689
690         case AFS_CELL_ACTIVE:
691                 if (atomic_read(&cell->usage) > 1) {
692                         if (test_and_clear_bit(AFS_CELL_FL_DO_LOOKUP, &cell->flags)) {
693                                 ret = afs_update_cell(cell);
694                                 if (ret < 0)
695                                         cell->error = ret;
696                         }
697                         goto done;
698                 }
699                 smp_store_release(&cell->state, AFS_CELL_DEACTIVATING);
700                 wake_up_var(&cell->state);
701                 goto again;
702
703         case AFS_CELL_DEACTIVATING:
704                 if (atomic_read(&cell->usage) > 1)
705                         goto reverse_deactivation;
706                 afs_deactivate_cell(net, cell);
707                 smp_store_release(&cell->state, AFS_CELL_INACTIVE);
708                 wake_up_var(&cell->state);
709                 goto again;
710
711         default:
712                 break;
713         }
714         _debug("bad state %u", cell->state);
715         BUG(); /* Unhandled state */
716
717 activation_failed:
718         cell->error = ret;
719         afs_deactivate_cell(net, cell);
720
721         smp_store_release(&cell->state, AFS_CELL_FAILED); /* vs error */
722         wake_up_var(&cell->state);
723         goto again;
724
725 reverse_deactivation:
726         smp_store_release(&cell->state, AFS_CELL_ACTIVE);
727         wake_up_var(&cell->state);
728         _leave(" [deact->act]");
729         return;
730
731 done:
732         _leave(" [done %u]", cell->state);
733         return;
734
735 final_destruction:
736         call_rcu(&cell->rcu, afs_cell_destroy);
737         afs_dec_cells_outstanding(net);
738         _leave(" [destruct %d]", atomic_read(&net->cells_outstanding));
739 }
740
741 /*
742  * Manage the records of cells known to a network namespace.  This includes
743  * updating the DNS records and garbage collecting unused cells that were
744  * automatically added.
745  *
746  * Note that constructed cell records may only be removed from net->cells by
747  * this work item, so it is safe for this work item to stash a cursor pointing
748  * into the tree and then return to caller (provided it skips cells that are
749  * still under construction).
750  *
751  * Note also that we were given an increment on net->cells_outstanding by
752  * whoever queued us that we need to deal with before returning.
753  */
754 void afs_manage_cells(struct work_struct *work)
755 {
756         struct afs_net *net = container_of(work, struct afs_net, cells_manager);
757         struct rb_node *cursor;
758         time64_t now = ktime_get_real_seconds(), next_manage = TIME64_MAX;
759         bool purging = !net->live;
760
761         _enter("");
762
763         /* Trawl the cell database looking for cells that have expired from
764          * lack of use and cells whose DNS results have expired and dispatch
765          * their managers.
766          */
767         read_seqlock_excl(&net->cells_lock);
768
769         for (cursor = rb_first(&net->cells); cursor; cursor = rb_next(cursor)) {
770                 struct afs_cell *cell =
771                         rb_entry(cursor, struct afs_cell, net_node);
772                 unsigned usage;
773                 bool sched_cell = false;
774
775                 usage = atomic_read(&cell->usage);
776                 _debug("manage %s %u", cell->name, usage);
777
778                 ASSERTCMP(usage, >=, 1);
779
780                 if (purging) {
781                         if (test_and_clear_bit(AFS_CELL_FL_NO_GC, &cell->flags))
782                                 usage = atomic_dec_return(&cell->usage);
783                         ASSERTCMP(usage, ==, 1);
784                 }
785
786                 if (usage == 1) {
787                         struct afs_vlserver_list *vllist;
788                         time64_t expire_at = cell->last_inactive;
789
790                         read_lock(&cell->vl_servers_lock);
791                         vllist = rcu_dereference_protected(
792                                 cell->vl_servers,
793                                 lockdep_is_held(&cell->vl_servers_lock));
794                         if (vllist->nr_servers > 0)
795                                 expire_at += afs_cell_gc_delay;
796                         read_unlock(&cell->vl_servers_lock);
797                         if (purging || expire_at <= now)
798                                 sched_cell = true;
799                         else if (expire_at < next_manage)
800                                 next_manage = expire_at;
801                 }
802
803                 if (!purging) {
804                         if (test_bit(AFS_CELL_FL_DO_LOOKUP, &cell->flags))
805                                 sched_cell = true;
806                 }
807
808                 if (sched_cell)
809                         queue_work(afs_wq, &cell->manager);
810         }
811
812         read_sequnlock_excl(&net->cells_lock);
813
814         /* Update the timer on the way out.  We have to pass an increment on
815          * cells_outstanding in the namespace that we are in to the timer or
816          * the work scheduler.
817          */
818         if (!purging && next_manage < TIME64_MAX) {
819                 now = ktime_get_real_seconds();
820
821                 if (next_manage - now <= 0) {
822                         if (queue_work(afs_wq, &net->cells_manager))
823                                 atomic_inc(&net->cells_outstanding);
824                 } else {
825                         afs_set_cell_timer(net, next_manage - now);
826                 }
827         }
828
829         afs_dec_cells_outstanding(net);
830         _leave(" [%d]", atomic_read(&net->cells_outstanding));
831 }
832
833 /*
834  * Purge in-memory cell database.
835  */
836 void afs_cell_purge(struct afs_net *net)
837 {
838         struct afs_cell *ws;
839
840         _enter("");
841
842         write_seqlock(&net->cells_lock);
843         ws = rcu_access_pointer(net->ws_cell);
844         RCU_INIT_POINTER(net->ws_cell, NULL);
845         write_sequnlock(&net->cells_lock);
846         afs_put_cell(net, ws);
847
848         _debug("del timer");
849         if (del_timer_sync(&net->cells_timer))
850                 atomic_dec(&net->cells_outstanding);
851
852         _debug("kick mgr");
853         afs_queue_cell_manager(net);
854
855         _debug("wait");
856         wait_var_event(&net->cells_outstanding,
857                        !atomic_read(&net->cells_outstanding));
858         _leave("");
859 }