Lines Matching +full:keep +full:- +full:a +full:- +full:live
1 // SPDX-License-Identifier: GPL-2.0-or-later
26 if (!net->live) in afs_schedule_fs_probe()
29 atj = server->probed_at; in afs_schedule_fs_probe()
33 if (timer_reduce(&net->fs_probe_timer, atj)) in afs_schedule_fs_probe()
38 * Handle the completion of a set of probes.
42 bool responded = server->probe.responded; in afs_finished_fs_probe()
44 write_seqlock(&net->fs_lock); in afs_finished_fs_probe()
46 list_add_tail(&server->probe_link, &net->fs_probe_slow); in afs_finished_fs_probe()
48 server->rtt = UINT_MAX; in afs_finished_fs_probe()
49 clear_bit(AFS_SERVER_FL_RESPONDING, &server->flags); in afs_finished_fs_probe()
50 list_add_tail(&server->probe_link, &net->fs_probe_fast); in afs_finished_fs_probe()
52 write_sequnlock(&net->fs_lock); in afs_finished_fs_probe()
58 * Handle the completion of a probe.
64 if (atomic_dec_and_test(&server->probe_outstanding)) in afs_done_one_fs_probe()
67 wake_up_all(&server->probe_wq); in afs_done_one_fs_probe()
71 * Handle inability to send a probe due to ENOMEM when trying to allocate a
78 struct afs_addr_list *alist = ac->alist; in afs_fs_probe_not_done()
79 unsigned int index = ac->index; in afs_fs_probe_not_done()
83 trace_afs_io_error(0, -ENOMEM, afs_io_error_fs_probe_fail); in afs_fs_probe_not_done()
84 spin_lock(&server->probe_lock); in afs_fs_probe_not_done()
86 server->probe.local_failure = true; in afs_fs_probe_not_done()
87 if (server->probe.error == 0) in afs_fs_probe_not_done()
88 server->probe.error = -ENOMEM; in afs_fs_probe_not_done()
90 set_bit(index, &alist->failed); in afs_fs_probe_not_done()
92 spin_unlock(&server->probe_lock); in afs_fs_probe_not_done()
97 * Process the result of probing a fileserver. This is called after successful
102 struct afs_addr_list *alist = call->alist; in afs_fileserver_probe_result()
103 struct afs_server *server = call->server; in afs_fileserver_probe_result()
104 unsigned int index = call->addr_ix; in afs_fileserver_probe_result()
106 int ret = call->error; in afs_fileserver_probe_result()
108 _enter("%pU,%u", &server->uuid, index); in afs_fileserver_probe_result()
110 spin_lock(&server->probe_lock); in afs_fileserver_probe_result()
114 server->probe.error = 0; in afs_fileserver_probe_result()
116 case -ECONNABORTED: in afs_fileserver_probe_result()
117 if (!server->probe.responded) { in afs_fileserver_probe_result()
118 server->probe.abort_code = call->abort_code; in afs_fileserver_probe_result()
119 server->probe.error = ret; in afs_fileserver_probe_result()
122 case -ENOMEM: in afs_fileserver_probe_result()
123 case -ENONET: in afs_fileserver_probe_result()
124 clear_bit(index, &alist->responded); in afs_fileserver_probe_result()
125 server->probe.local_failure = true; in afs_fileserver_probe_result()
126 trace_afs_io_error(call->debug_id, ret, afs_io_error_fs_probe_fail); in afs_fileserver_probe_result()
128 case -ECONNRESET: /* Responded, but call expired. */ in afs_fileserver_probe_result()
129 case -ERFKILL: in afs_fileserver_probe_result()
130 case -EADDRNOTAVAIL: in afs_fileserver_probe_result()
131 case -ENETUNREACH: in afs_fileserver_probe_result()
132 case -EHOSTUNREACH: in afs_fileserver_probe_result()
133 case -EHOSTDOWN: in afs_fileserver_probe_result()
134 case -ECONNREFUSED: in afs_fileserver_probe_result()
135 case -ETIMEDOUT: in afs_fileserver_probe_result()
136 case -ETIME: in afs_fileserver_probe_result()
138 clear_bit(index, &alist->responded); in afs_fileserver_probe_result()
139 set_bit(index, &alist->failed); in afs_fileserver_probe_result()
140 if (!server->probe.responded && in afs_fileserver_probe_result()
141 (server->probe.error == 0 || in afs_fileserver_probe_result()
142 server->probe.error == -ETIMEDOUT || in afs_fileserver_probe_result()
143 server->probe.error == -ETIME)) in afs_fileserver_probe_result()
144 server->probe.error = ret; in afs_fileserver_probe_result()
145 trace_afs_io_error(call->debug_id, ret, afs_io_error_fs_probe_fail); in afs_fileserver_probe_result()
150 clear_bit(index, &alist->failed); in afs_fileserver_probe_result()
152 if (call->service_id == YFS_FS_SERVICE) { in afs_fileserver_probe_result()
153 server->probe.is_yfs = true; in afs_fileserver_probe_result()
154 set_bit(AFS_SERVER_FL_IS_YFS, &server->flags); in afs_fileserver_probe_result()
155 alist->addrs[index].srx_service = call->service_id; in afs_fileserver_probe_result()
157 server->probe.not_yfs = true; in afs_fileserver_probe_result()
158 if (!server->probe.is_yfs) { in afs_fileserver_probe_result()
159 clear_bit(AFS_SERVER_FL_IS_YFS, &server->flags); in afs_fileserver_probe_result()
160 alist->addrs[index].srx_service = call->service_id; in afs_fileserver_probe_result()
164 rxrpc_kernel_get_srtt(call->net->socket, call->rxcall, &rtt_us); in afs_fileserver_probe_result()
165 if (rtt_us < server->probe.rtt) { in afs_fileserver_probe_result()
166 server->probe.rtt = rtt_us; in afs_fileserver_probe_result()
167 server->rtt = rtt_us; in afs_fileserver_probe_result()
168 alist->preferred = index; in afs_fileserver_probe_result()
172 server->probe.responded = true; in afs_fileserver_probe_result()
173 set_bit(index, &alist->responded); in afs_fileserver_probe_result()
174 set_bit(AFS_SERVER_FL_RESPONDING, &server->flags); in afs_fileserver_probe_result()
176 spin_unlock(&server->probe_lock); in afs_fileserver_probe_result()
179 &server->uuid, index, &alist->addrs[index].transport, in afs_fileserver_probe_result()
182 return afs_done_one_fs_probe(call->net, server); in afs_fileserver_probe_result()
186 * Probe one or all of a fileserver's addresses to find out the best route and
196 _enter("%pU", &server->uuid); in afs_fs_probe_fileserver()
198 read_lock(&server->fs_lock); in afs_fs_probe_fileserver()
199 ac.alist = rcu_dereference_protected(server->addresses, in afs_fs_probe_fileserver()
200 lockdep_is_held(&server->fs_lock)); in afs_fs_probe_fileserver()
202 read_unlock(&server->fs_lock); in afs_fs_probe_fileserver()
204 server->probed_at = jiffies; in afs_fs_probe_fileserver()
205 atomic_set(&server->probe_outstanding, all ? ac.alist->nr_addrs : 1); in afs_fs_probe_fileserver()
206 memset(&server->probe, 0, sizeof(server->probe)); in afs_fs_probe_fileserver()
207 server->probe.rtt = UINT_MAX; in afs_fs_probe_fileserver()
209 ac.index = ac.alist->preferred; in afs_fs_probe_fileserver()
210 if (ac.index < 0 || ac.index >= ac.alist->nr_addrs) in afs_fs_probe_fileserver()
214 for (ac.index = 0; ac.index < ac.alist->nr_addrs; ac.index++) in afs_fs_probe_fileserver()
226 * Wait for the first as-yet untried fileserver to respond.
234 int pref = -1, i; in afs_wait_for_fs_probes()
236 _enter("%u,%lx", slist->nr_servers, untried); in afs_wait_for_fs_probes()
238 /* Only wait for servers that have a probe outstanding. */ in afs_wait_for_fs_probes()
239 for (i = 0; i < slist->nr_servers; i++) { in afs_wait_for_fs_probes()
241 server = slist->servers[i].server; in afs_wait_for_fs_probes()
242 if (!atomic_read(&server->probe_outstanding)) in afs_wait_for_fs_probes()
244 if (server->probe.responded) in afs_wait_for_fs_probes()
251 waits = kmalloc(array_size(slist->nr_servers, sizeof(*waits)), GFP_KERNEL); in afs_wait_for_fs_probes()
253 return -ENOMEM; in afs_wait_for_fs_probes()
255 for (i = 0; i < slist->nr_servers; i++) { in afs_wait_for_fs_probes()
257 server = slist->servers[i].server; in afs_wait_for_fs_probes()
259 add_wait_queue(&server->probe_wq, &waits[i]); in afs_wait_for_fs_probes()
267 for (i = 0; i < slist->nr_servers; i++) { in afs_wait_for_fs_probes()
269 server = slist->servers[i].server; in afs_wait_for_fs_probes()
270 if (server->probe.responded) in afs_wait_for_fs_probes()
272 if (atomic_read(&server->probe_outstanding)) in afs_wait_for_fs_probes()
285 for (i = 0; i < slist->nr_servers; i++) { in afs_wait_for_fs_probes()
287 server = slist->servers[i].server; in afs_wait_for_fs_probes()
288 rtt_s = READ_ONCE(server->rtt); in afs_wait_for_fs_probes()
289 if (test_bit(AFS_SERVER_FL_RESPONDING, &server->flags) && in afs_wait_for_fs_probes()
295 remove_wait_queue(&server->probe_wq, &waits[i]); in afs_wait_for_fs_probes()
301 if (pref == -1 && signal_pending(current)) in afs_wait_for_fs_probes()
302 return -ERESTARTSYS; in afs_wait_for_fs_probes()
305 slist->preferred = pref; in afs_wait_for_fs_probes()
317 if (!net->live || !queue_work(afs_wq, &net->fs_prober)) in afs_fs_probe_timer()
322 * Dispatch a probe to a server.
325 __releases(&net->fs_lock) in afs_dispatch_fs_probe()
329 /* We remove it from the queues here - it will be added back to in afs_dispatch_fs_probe()
332 list_del_init(&server->probe_link); in afs_dispatch_fs_probe()
335 write_sequnlock(&net->fs_lock); in afs_dispatch_fs_probe()
342 * Probe a server immediately without waiting for its due time to come
347 write_seqlock(&net->fs_lock); in afs_probe_fileserver()
348 if (!list_empty(&server->probe_link)) in afs_probe_fileserver()
350 write_sequnlock(&net->fs_lock); in afs_probe_fileserver()
354 * Probe dispatcher to regularly dispatch probes to keep NAT alive.
363 if (!net->live) { in afs_fs_probe_dispatcher()
370 if (list_empty(&net->fs_probe_fast) && list_empty(&net->fs_probe_slow)) { in afs_fs_probe_dispatcher()
377 write_seqlock(&net->fs_lock); in afs_fs_probe_dispatcher()
383 if (!list_empty(&net->fs_probe_fast)) { in afs_fs_probe_dispatcher()
384 fast = list_first_entry(&net->fs_probe_fast, struct afs_server, probe_link); in afs_fs_probe_dispatcher()
385 poll_at = fast->probed_at + afs_fs_probe_fast_poll_interval; in afs_fs_probe_dispatcher()
393 if (!list_empty(&net->fs_probe_slow)) { in afs_fs_probe_dispatcher()
394 slow = list_first_entry(&net->fs_probe_slow, struct afs_server, probe_link); in afs_fs_probe_dispatcher()
395 poll_at = slow->probed_at + afs_fs_probe_slow_poll_interval; in afs_fs_probe_dispatcher()
406 _debug("probe %pU", &server->uuid); in afs_fs_probe_dispatcher()
414 write_sequnlock(&net->fs_lock); in afs_fs_probe_dispatcher()
417 if (!queue_work(afs_wq, &net->fs_prober)) in afs_fs_probe_dispatcher()
421 if (timer_reduce(&net->fs_probe_timer, timer_at)) in afs_fs_probe_dispatcher()
431 * Wait for a probe on a particular fileserver to complete for 2s.
438 if (atomic_read(&server->probe_outstanding) == 0) in afs_wait_for_one_fs_probe()
443 prepare_to_wait_event(&server->probe_wq, &wait, in afs_wait_for_one_fs_probe()
446 server->probe.responded || in afs_wait_for_one_fs_probe()
447 atomic_read(&server->probe_outstanding) == 0 || in afs_wait_for_one_fs_probe()
453 finish_wait(&server->probe_wq, &wait); in afs_wait_for_one_fs_probe()
456 if (server->probe.responded) in afs_wait_for_one_fs_probe()
459 return -ERESTARTSYS; in afs_wait_for_one_fs_probe()
461 return -ETIME; in afs_wait_for_one_fs_probe()
462 return -EDESTADDRREQ; in afs_wait_for_one_fs_probe()
470 if (del_timer_sync(&net->fs_probe_timer)) in afs_fs_probe_cleanup()