xref: /linux-6.15/fs/afs/server.c (revision 40e8b52f)
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