1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* AFS server record management 3 * 4 * Copyright (C) 2002, 2007 Red Hat, Inc. All Rights Reserved. 5 * Written by David Howells ([email protected]) 6 */ 7 8 #include <linux/sched.h> 9 #include <linux/slab.h> 10 #include "afs_fs.h" 11 #include "internal.h" 12 #include "protocol_yfs.h" 13 14 static unsigned afs_server_gc_delay = 10; /* Server record timeout in seconds */ 15 static atomic_t afs_server_debug_id; 16 17 static struct afs_server *afs_maybe_use_server(struct afs_server *, 18 enum afs_server_trace); 19 static void __afs_put_server(struct afs_net *, struct afs_server *); 20 21 /* 22 * Find a server by one of its addresses. 23 */ 24 struct afs_server *afs_find_server(const struct rxrpc_peer *peer) 25 { 26 struct afs_server *server = (struct afs_server *)rxrpc_kernel_get_peer_data(peer); 27 28 if (!server) 29 return NULL; 30 return afs_maybe_use_server(server, afs_server_trace_use_cm_call); 31 } 32 33 /* 34 * Look up a server by its UUID and mark it active. 35 */ 36 struct afs_server *afs_find_server_by_uuid(struct afs_net *net, const uuid_t *uuid) 37 { 38 struct afs_server *server = NULL; 39 struct rb_node *p; 40 int diff, seq = 1; 41 42 _enter("%pU", uuid); 43 44 do { 45 /* Unfortunately, rbtree walking doesn't give reliable results 46 * under just the RCU read lock, so we have to check for 47 * changes. 48 */ 49 if (server) 50 afs_unuse_server(net, server, afs_server_trace_unuse_uuid_rsq); 51 server = NULL; 52 seq++; /* 2 on the 1st/lockless path, otherwise odd */ 53 read_seqbegin_or_lock(&net->fs_lock, &seq); 54 55 p = net->fs_servers.rb_node; 56 while (p) { 57 server = rb_entry(p, struct afs_server, uuid_rb); 58 59 diff = memcmp(uuid, &server->uuid, sizeof(*uuid)); 60 if (diff < 0) { 61 p = p->rb_left; 62 } else if (diff > 0) { 63 p = p->rb_right; 64 } else { 65 afs_use_server(server, afs_server_trace_use_by_uuid); 66 break; 67 } 68 69 server = NULL; 70 } 71 } while (need_seqretry(&net->fs_lock, seq)); 72 73 done_seqretry(&net->fs_lock, seq); 74 75 _leave(" = %p", server); 76 return server; 77 } 78 79 /* 80 * Install a server record in the namespace tree. If there's a clash, we stick 81 * it into a list anchored on whichever afs_server struct is actually in the 82 * tree. 83 */ 84 static struct afs_server *afs_install_server(struct afs_cell *cell, 85 struct afs_server *candidate) 86 { 87 const struct afs_endpoint_state *estate; 88 const struct afs_addr_list *alist; 89 struct afs_server *server, *next; 90 struct afs_net *net = cell->net; 91 struct rb_node **pp, *p; 92 int diff; 93 94 _enter("%p", candidate); 95 96 write_seqlock(&net->fs_lock); 97 98 /* Firstly install the server in the UUID lookup tree */ 99 pp = &net->fs_servers.rb_node; 100 p = NULL; 101 while (*pp) { 102 p = *pp; 103 _debug("- consider %p", p); 104 server = rb_entry(p, struct afs_server, uuid_rb); 105 diff = memcmp(&candidate->uuid, &server->uuid, sizeof(uuid_t)); 106 if (diff < 0) { 107 pp = &(*pp)->rb_left; 108 } else if (diff > 0) { 109 pp = &(*pp)->rb_right; 110 } else { 111 if (server->cell == cell) 112 goto exists; 113 114 /* We have the same UUID representing servers in 115 * different cells. Append the new server to the list. 116 */ 117 for (;;) { 118 next = rcu_dereference_protected( 119 server->uuid_next, 120 lockdep_is_held(&net->fs_lock.lock)); 121 if (!next) 122 break; 123 server = next; 124 } 125 rcu_assign_pointer(server->uuid_next, candidate); 126 candidate->uuid_prev = server; 127 server = candidate; 128 goto added_dup; 129 } 130 } 131 132 server = candidate; 133 rb_link_node(&server->uuid_rb, p, pp); 134 rb_insert_color(&server->uuid_rb, &net->fs_servers); 135 hlist_add_head_rcu(&server->proc_link, &net->fs_proc); 136 137 afs_get_cell(cell, afs_cell_trace_get_server); 138 139 added_dup: 140 write_seqlock(&net->fs_addr_lock); 141 estate = rcu_dereference_protected(server->endpoint_state, 142 lockdep_is_held(&net->fs_addr_lock.lock)); 143 alist = estate->addresses; 144 145 /* Secondly, if the server has any IPv4 and/or IPv6 addresses, install 146 * it in the IPv4 and/or IPv6 reverse-map lists. 147 * 148 * TODO: For speed we want to use something other than a flat list 149 * here; even sorting the list in terms of lowest address would help a 150 * bit, but anything we might want to do gets messy and memory 151 * intensive. 152 */ 153 if (alist->nr_addrs > 0) 154 hlist_add_head_rcu(&server->addr_link, &net->fs_addresses); 155 156 write_sequnlock(&net->fs_addr_lock); 157 158 exists: 159 afs_get_server(server, afs_server_trace_get_install); 160 write_sequnlock(&net->fs_lock); 161 return server; 162 } 163 164 /* 165 * Allocate a new server record and mark it active. 166 */ 167 static struct afs_server *afs_alloc_server(struct afs_cell *cell, 168 const uuid_t *uuid, 169 struct afs_addr_list *alist) 170 { 171 struct afs_endpoint_state *estate; 172 struct afs_server *server; 173 struct afs_net *net = cell->net; 174 175 _enter(""); 176 177 server = kzalloc(sizeof(struct afs_server), GFP_KERNEL); 178 if (!server) 179 goto enomem; 180 181 estate = kzalloc(sizeof(struct afs_endpoint_state), GFP_KERNEL); 182 if (!estate) 183 goto enomem_server; 184 185 refcount_set(&server->ref, 1); 186 atomic_set(&server->active, 1); 187 server->debug_id = atomic_inc_return(&afs_server_debug_id); 188 server->addr_version = alist->version; 189 server->uuid = *uuid; 190 rwlock_init(&server->fs_lock); 191 INIT_LIST_HEAD(&server->volumes); 192 init_waitqueue_head(&server->probe_wq); 193 INIT_LIST_HEAD(&server->probe_link); 194 spin_lock_init(&server->probe_lock); 195 server->cell = cell; 196 server->rtt = UINT_MAX; 197 server->service_id = FS_SERVICE; 198 199 server->probe_counter = 1; 200 server->probed_at = jiffies - LONG_MAX / 2; 201 refcount_set(&estate->ref, 1); 202 estate->addresses = alist; 203 estate->server_id = server->debug_id; 204 estate->probe_seq = 1; 205 rcu_assign_pointer(server->endpoint_state, estate); 206 207 afs_inc_servers_outstanding(net); 208 trace_afs_server(server->debug_id, 1, 1, afs_server_trace_alloc); 209 trace_afs_estate(estate->server_id, estate->probe_seq, refcount_read(&estate->ref), 210 afs_estate_trace_alloc_server); 211 _leave(" = %p", server); 212 return server; 213 214 enomem_server: 215 kfree(server); 216 enomem: 217 _leave(" = NULL [nomem]"); 218 return NULL; 219 } 220 221 /* 222 * Look up an address record for a server 223 */ 224 static struct afs_addr_list *afs_vl_lookup_addrs(struct afs_cell *cell, 225 struct key *key, const uuid_t *uuid) 226 { 227 struct afs_vl_cursor vc; 228 struct afs_addr_list *alist = NULL; 229 int ret; 230 231 ret = -ERESTARTSYS; 232 if (afs_begin_vlserver_operation(&vc, cell, key)) { 233 while (afs_select_vlserver(&vc)) { 234 if (test_bit(AFS_VLSERVER_FL_IS_YFS, &vc.server->flags)) 235 alist = afs_yfsvl_get_endpoints(&vc, uuid); 236 else 237 alist = afs_vl_get_addrs_u(&vc, uuid); 238 } 239 240 ret = afs_end_vlserver_operation(&vc); 241 } 242 243 return ret < 0 ? ERR_PTR(ret) : alist; 244 } 245 246 /* 247 * Get or create a fileserver record and return it with an active-use count on 248 * it. 249 */ 250 struct afs_server *afs_lookup_server(struct afs_cell *cell, struct key *key, 251 const uuid_t *uuid, u32 addr_version) 252 { 253 struct afs_addr_list *alist; 254 struct afs_server *server, *candidate; 255 256 _enter("%p,%pU", cell->net, uuid); 257 258 server = afs_find_server_by_uuid(cell->net, uuid); 259 if (server) { 260 if (server->addr_version != addr_version) 261 set_bit(AFS_SERVER_FL_NEEDS_UPDATE, &server->flags); 262 return server; 263 } 264 265 alist = afs_vl_lookup_addrs(cell, key, uuid); 266 if (IS_ERR(alist)) 267 return ERR_CAST(alist); 268 269 candidate = afs_alloc_server(cell, uuid, alist); 270 if (!candidate) { 271 afs_put_addrlist(alist, afs_alist_trace_put_server_oom); 272 return ERR_PTR(-ENOMEM); 273 } 274 275 server = afs_install_server(cell, candidate); 276 if (server != candidate) { 277 afs_put_addrlist(alist, afs_alist_trace_put_server_dup); 278 kfree(candidate); 279 } else { 280 /* Immediately dispatch an asynchronous probe to each interface 281 * on the fileserver. This will make sure the repeat-probing 282 * service is started. 283 */ 284 afs_fs_probe_fileserver(cell->net, server, alist, key); 285 } 286 287 return server; 288 } 289 290 /* 291 * Set the server timer to fire after a given delay, assuming it's not already 292 * set for an earlier time. 293 */ 294 static void afs_set_server_timer(struct afs_net *net, time64_t delay) 295 { 296 if (net->live) { 297 afs_inc_servers_outstanding(net); 298 if (timer_reduce(&net->fs_timer, jiffies + delay * HZ)) 299 afs_dec_servers_outstanding(net); 300 } 301 } 302 303 /* 304 * Server management timer. We have an increment on fs_outstanding that we 305 * need to pass along to the work item. 306 */ 307 void afs_servers_timer(struct timer_list *timer) 308 { 309 struct afs_net *net = container_of(timer, struct afs_net, fs_timer); 310 311 _enter(""); 312 if (!queue_work(afs_wq, &net->fs_manager)) 313 afs_dec_servers_outstanding(net); 314 } 315 316 /* 317 * Get a reference on a server object. 318 */ 319 struct afs_server *afs_get_server(struct afs_server *server, 320 enum afs_server_trace reason) 321 { 322 unsigned int a; 323 int r; 324 325 __refcount_inc(&server->ref, &r); 326 a = atomic_read(&server->active); 327 trace_afs_server(server->debug_id, r + 1, a, reason); 328 return server; 329 } 330 331 /* 332 * Try to get a reference on a server object. 333 */ 334 static struct afs_server *afs_maybe_use_server(struct afs_server *server, 335 enum afs_server_trace reason) 336 { 337 unsigned int a; 338 int r; 339 340 if (!__refcount_inc_not_zero(&server->ref, &r)) 341 return NULL; 342 343 a = atomic_inc_return(&server->active); 344 trace_afs_server(server->debug_id, r + 1, a, reason); 345 return server; 346 } 347 348 /* 349 * Get an active count on a server object. 350 */ 351 struct afs_server *afs_use_server(struct afs_server *server, enum afs_server_trace reason) 352 { 353 unsigned int a; 354 int r; 355 356 __refcount_inc(&server->ref, &r); 357 a = atomic_inc_return(&server->active); 358 359 trace_afs_server(server->debug_id, r + 1, a, reason); 360 return server; 361 } 362 363 /* 364 * Release a reference on a server record. 365 */ 366 void afs_put_server(struct afs_net *net, struct afs_server *server, 367 enum afs_server_trace reason) 368 { 369 unsigned int a, debug_id = server->debug_id; 370 bool zero; 371 int r; 372 373 if (!server) 374 return; 375 376 a = atomic_read(&server->active); 377 zero = __refcount_dec_and_test(&server->ref, &r); 378 trace_afs_server(debug_id, r - 1, a, reason); 379 if (unlikely(zero)) 380 __afs_put_server(net, server); 381 } 382 383 /* 384 * Drop an active count on a server object without updating the last-unused 385 * time. 386 */ 387 void afs_unuse_server_notime(struct afs_net *net, struct afs_server *server, 388 enum afs_server_trace reason) 389 { 390 if (server) { 391 unsigned int active = atomic_dec_return(&server->active); 392 393 if (active == 0) 394 afs_set_server_timer(net, afs_server_gc_delay); 395 afs_put_server(net, server, reason); 396 } 397 } 398 399 /* 400 * Drop an active count on a server object. 401 */ 402 void afs_unuse_server(struct afs_net *net, struct afs_server *server, 403 enum afs_server_trace reason) 404 { 405 if (server) { 406 server->unuse_time = ktime_get_real_seconds(); 407 afs_unuse_server_notime(net, server, reason); 408 } 409 } 410 411 static void afs_server_rcu(struct rcu_head *rcu) 412 { 413 struct afs_server *server = container_of(rcu, struct afs_server, rcu); 414 415 trace_afs_server(server->debug_id, refcount_read(&server->ref), 416 atomic_read(&server->active), afs_server_trace_free); 417 afs_put_endpoint_state(rcu_access_pointer(server->endpoint_state), 418 afs_estate_trace_put_server); 419 afs_put_cell(server->cell, afs_cell_trace_put_server); 420 kfree(server); 421 } 422 423 static void __afs_put_server(struct afs_net *net, struct afs_server *server) 424 { 425 call_rcu(&server->rcu, afs_server_rcu); 426 afs_dec_servers_outstanding(net); 427 } 428 429 static void afs_give_up_callbacks(struct afs_net *net, struct afs_server *server) 430 { 431 struct afs_endpoint_state *estate = rcu_access_pointer(server->endpoint_state); 432 struct afs_addr_list *alist = estate->addresses; 433 434 afs_fs_give_up_all_callbacks(net, server, &alist->addrs[alist->preferred], NULL); 435 } 436 437 /* 438 * destroy a dead server 439 */ 440 static void afs_destroy_server(struct afs_net *net, struct afs_server *server) 441 { 442 struct afs_endpoint_state *estate; 443 444 if (test_bit(AFS_SERVER_FL_MAY_HAVE_CB, &server->flags)) 445 afs_give_up_callbacks(net, server); 446 447 /* Unbind the rxrpc_peer records from the server. */ 448 estate = rcu_access_pointer(server->endpoint_state); 449 if (estate) 450 afs_set_peer_appdata(server, estate->addresses, NULL); 451 452 afs_put_server(net, server, afs_server_trace_destroy); 453 } 454 455 /* 456 * Garbage collect any expired servers. 457 */ 458 static void afs_gc_servers(struct afs_net *net, struct afs_server *gc_list) 459 { 460 struct afs_server *server, *next, *prev; 461 int active; 462 463 while ((server = gc_list)) { 464 gc_list = server->gc_next; 465 466 write_seqlock(&net->fs_lock); 467 468 active = atomic_read(&server->active); 469 if (active == 0) { 470 trace_afs_server(server->debug_id, refcount_read(&server->ref), 471 active, afs_server_trace_gc); 472 next = rcu_dereference_protected( 473 server->uuid_next, lockdep_is_held(&net->fs_lock.lock)); 474 prev = server->uuid_prev; 475 if (!prev) { 476 /* The one at the front is in the tree */ 477 if (!next) { 478 rb_erase(&server->uuid_rb, &net->fs_servers); 479 } else { 480 rb_replace_node_rcu(&server->uuid_rb, 481 &next->uuid_rb, 482 &net->fs_servers); 483 next->uuid_prev = NULL; 484 } 485 } else { 486 /* This server is not at the front */ 487 rcu_assign_pointer(prev->uuid_next, next); 488 if (next) 489 next->uuid_prev = prev; 490 } 491 492 list_del(&server->probe_link); 493 hlist_del_rcu(&server->proc_link); 494 if (!hlist_unhashed(&server->addr_link)) 495 hlist_del_rcu(&server->addr_link); 496 } 497 write_sequnlock(&net->fs_lock); 498 499 if (active == 0) 500 afs_destroy_server(net, server); 501 } 502 } 503 504 /* 505 * Manage the records of servers known to be within a network namespace. This 506 * includes garbage collecting unused servers. 507 * 508 * Note also that we were given an increment on net->servers_outstanding by 509 * whoever queued us that we need to deal with before returning. 510 */ 511 void afs_manage_servers(struct work_struct *work) 512 { 513 struct afs_net *net = container_of(work, struct afs_net, fs_manager); 514 struct afs_server *gc_list = NULL; 515 struct rb_node *cursor; 516 time64_t now = ktime_get_real_seconds(), next_manage = TIME64_MAX; 517 bool purging = !net->live; 518 519 _enter(""); 520 521 /* Trawl the server list looking for servers that have expired from 522 * lack of use. 523 */ 524 read_seqlock_excl(&net->fs_lock); 525 526 for (cursor = rb_first(&net->fs_servers); cursor; cursor = rb_next(cursor)) { 527 struct afs_server *server = 528 rb_entry(cursor, struct afs_server, uuid_rb); 529 int active = atomic_read(&server->active); 530 531 _debug("manage %pU %u", &server->uuid, active); 532 533 if (purging) { 534 trace_afs_server(server->debug_id, refcount_read(&server->ref), 535 active, afs_server_trace_purging); 536 if (active != 0) 537 pr_notice("Can't purge s=%08x\n", server->debug_id); 538 } 539 540 if (active == 0) { 541 time64_t expire_at = server->unuse_time; 542 543 if (!test_bit(AFS_SERVER_FL_VL_FAIL, &server->flags) && 544 !test_bit(AFS_SERVER_FL_NOT_FOUND, &server->flags)) 545 expire_at += afs_server_gc_delay; 546 if (purging || expire_at <= now) { 547 server->gc_next = gc_list; 548 gc_list = server; 549 } else if (expire_at < next_manage) { 550 next_manage = expire_at; 551 } 552 } 553 } 554 555 read_sequnlock_excl(&net->fs_lock); 556 557 /* Update the timer on the way out. We have to pass an increment on 558 * servers_outstanding in the namespace that we are in to the timer or 559 * the work scheduler. 560 */ 561 if (!purging && next_manage < TIME64_MAX) { 562 now = ktime_get_real_seconds(); 563 564 if (next_manage - now <= 0) { 565 if (queue_work(afs_wq, &net->fs_manager)) 566 afs_inc_servers_outstanding(net); 567 } else { 568 afs_set_server_timer(net, next_manage - now); 569 } 570 } 571 572 afs_gc_servers(net, gc_list); 573 574 afs_dec_servers_outstanding(net); 575 _leave(" [%d]", atomic_read(&net->servers_outstanding)); 576 } 577 578 static void afs_queue_server_manager(struct afs_net *net) 579 { 580 afs_inc_servers_outstanding(net); 581 if (!queue_work(afs_wq, &net->fs_manager)) 582 afs_dec_servers_outstanding(net); 583 } 584 585 /* 586 * Purge list of servers. 587 */ 588 void afs_purge_servers(struct afs_net *net) 589 { 590 _enter(""); 591 592 if (del_timer_sync(&net->fs_timer)) 593 afs_dec_servers_outstanding(net); 594 595 afs_queue_server_manager(net); 596 597 _debug("wait"); 598 atomic_dec(&net->servers_outstanding); 599 wait_var_event(&net->servers_outstanding, 600 !atomic_read(&net->servers_outstanding)); 601 _leave(""); 602 } 603 604 /* 605 * Get an update for a server's address list. 606 */ 607 static noinline bool afs_update_server_record(struct afs_operation *op, 608 struct afs_server *server, 609 struct key *key) 610 { 611 struct afs_endpoint_state *estate; 612 struct afs_addr_list *alist; 613 bool has_addrs; 614 615 _enter(""); 616 617 trace_afs_server(server->debug_id, refcount_read(&server->ref), 618 atomic_read(&server->active), 619 afs_server_trace_update); 620 621 alist = afs_vl_lookup_addrs(op->volume->cell, op->key, &server->uuid); 622 if (IS_ERR(alist)) { 623 rcu_read_lock(); 624 estate = rcu_dereference(server->endpoint_state); 625 has_addrs = estate->addresses; 626 rcu_read_unlock(); 627 628 if ((PTR_ERR(alist) == -ERESTARTSYS || 629 PTR_ERR(alist) == -EINTR) && 630 (op->flags & AFS_OPERATION_UNINTR) && 631 has_addrs) { 632 _leave(" = t [intr]"); 633 return true; 634 } 635 afs_op_set_error(op, PTR_ERR(alist)); 636 _leave(" = f [%d]", afs_op_error(op)); 637 return false; 638 } 639 640 if (server->addr_version != alist->version) 641 afs_fs_probe_fileserver(op->net, server, alist, key); 642 643 afs_put_addrlist(alist, afs_alist_trace_put_server_update); 644 _leave(" = t"); 645 return true; 646 } 647 648 /* 649 * See if a server's address list needs updating. 650 */ 651 bool afs_check_server_record(struct afs_operation *op, struct afs_server *server, 652 struct key *key) 653 { 654 bool success; 655 int ret, retries = 0; 656 657 _enter(""); 658 659 ASSERT(server); 660 661 retry: 662 if (test_bit(AFS_SERVER_FL_UPDATING, &server->flags)) 663 goto wait; 664 if (test_bit(AFS_SERVER_FL_NEEDS_UPDATE, &server->flags)) 665 goto update; 666 _leave(" = t [good]"); 667 return true; 668 669 update: 670 if (!test_and_set_bit_lock(AFS_SERVER_FL_UPDATING, &server->flags)) { 671 clear_bit(AFS_SERVER_FL_NEEDS_UPDATE, &server->flags); 672 success = afs_update_server_record(op, server, key); 673 clear_bit_unlock(AFS_SERVER_FL_UPDATING, &server->flags); 674 wake_up_bit(&server->flags, AFS_SERVER_FL_UPDATING); 675 _leave(" = %d", success); 676 return success; 677 } 678 679 wait: 680 ret = wait_on_bit(&server->flags, AFS_SERVER_FL_UPDATING, 681 (op->flags & AFS_OPERATION_UNINTR) ? 682 TASK_UNINTERRUPTIBLE : TASK_INTERRUPTIBLE); 683 if (ret == -ERESTARTSYS) { 684 afs_op_set_error(op, ret); 685 _leave(" = f [intr]"); 686 return false; 687 } 688 689 retries++; 690 if (retries == 4) { 691 _leave(" = f [stale]"); 692 ret = -ESTALE; 693 return false; 694 } 695 goto retry; 696 } 697