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