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