Lines Matching +full:keep +full:- +full:a +full:- +full:live
1 // SPDX-License-Identifier: GPL-2.0-or-later
27 if (!net->live) in afs_schedule_fs_probe()
30 atj = server->probed_at; in afs_schedule_fs_probe()
34 if (timer_reduce(&net->fs_probe_timer, atj)) in afs_schedule_fs_probe()
39 * Handle the completion of a set of probes.
43 bool responded = server->probe.responded; in afs_finished_fs_probe()
45 write_seqlock(&net->fs_lock); in afs_finished_fs_probe()
47 list_add_tail(&server->probe_link, &net->fs_probe_slow); in afs_finished_fs_probe()
49 server->rtt = UINT_MAX; in afs_finished_fs_probe()
50 clear_bit(AFS_SERVER_FL_RESPONDING, &server->flags); in afs_finished_fs_probe()
51 list_add_tail(&server->probe_link, &net->fs_probe_fast); in afs_finished_fs_probe()
53 write_sequnlock(&net->fs_lock); in afs_finished_fs_probe()
59 * Handle the completion of a probe.
65 if (atomic_dec_and_test(&server->probe_outstanding)) in afs_done_one_fs_probe()
68 wake_up_all(&server->probe_wq); in afs_done_one_fs_probe()
72 * Handle inability to send a probe due to ENOMEM when trying to allocate a
79 struct afs_addr_list *alist = ac->alist; in afs_fs_probe_not_done()
80 unsigned int index = ac->index; in afs_fs_probe_not_done()
84 trace_afs_io_error(0, -ENOMEM, afs_io_error_fs_probe_fail); in afs_fs_probe_not_done()
85 spin_lock(&server->probe_lock); in afs_fs_probe_not_done()
87 server->probe.local_failure = true; in afs_fs_probe_not_done()
88 if (server->probe.error == 0) in afs_fs_probe_not_done()
89 server->probe.error = -ENOMEM; in afs_fs_probe_not_done()
91 set_bit(index, &alist->failed); in afs_fs_probe_not_done()
93 spin_unlock(&server->probe_lock); in afs_fs_probe_not_done()
98 * Process the result of probing a fileserver. This is called after successful
103 struct afs_addr_list *alist = call->alist; in afs_fileserver_probe_result()
104 struct afs_server *server = call->server; in afs_fileserver_probe_result()
105 unsigned int index = call->addr_ix; in afs_fileserver_probe_result()
107 int ret = call->error; in afs_fileserver_probe_result()
109 _enter("%pU,%u", &server->uuid, index); in afs_fileserver_probe_result()
111 spin_lock(&server->probe_lock); in afs_fileserver_probe_result()
115 server->probe.error = 0; in afs_fileserver_probe_result()
117 case -ECONNABORTED: in afs_fileserver_probe_result()
118 if (!server->probe.responded) { in afs_fileserver_probe_result()
119 server->probe.abort_code = call->abort_code; in afs_fileserver_probe_result()
120 server->probe.error = ret; in afs_fileserver_probe_result()
123 case -ENOMEM: in afs_fileserver_probe_result()
124 case -ENONET: in afs_fileserver_probe_result()
125 clear_bit(index, &alist->responded); in afs_fileserver_probe_result()
126 server->probe.local_failure = true; in afs_fileserver_probe_result()
127 trace_afs_io_error(call->debug_id, ret, afs_io_error_fs_probe_fail); in afs_fileserver_probe_result()
129 case -ECONNRESET: /* Responded, but call expired. */ in afs_fileserver_probe_result()
130 case -ERFKILL: in afs_fileserver_probe_result()
131 case -EADDRNOTAVAIL: in afs_fileserver_probe_result()
132 case -ENETUNREACH: in afs_fileserver_probe_result()
133 case -EHOSTUNREACH: in afs_fileserver_probe_result()
134 case -EHOSTDOWN: in afs_fileserver_probe_result()
135 case -ECONNREFUSED: in afs_fileserver_probe_result()
136 case -ETIMEDOUT: in afs_fileserver_probe_result()
137 case -ETIME: in afs_fileserver_probe_result()
139 clear_bit(index, &alist->responded); in afs_fileserver_probe_result()
140 set_bit(index, &alist->failed); in afs_fileserver_probe_result()
141 if (!server->probe.responded && in afs_fileserver_probe_result()
142 (server->probe.error == 0 || in afs_fileserver_probe_result()
143 server->probe.error == -ETIMEDOUT || in afs_fileserver_probe_result()
144 server->probe.error == -ETIME)) in afs_fileserver_probe_result()
145 server->probe.error = ret; in afs_fileserver_probe_result()
146 trace_afs_io_error(call->debug_id, ret, afs_io_error_fs_probe_fail); in afs_fileserver_probe_result()
151 clear_bit(index, &alist->failed); in afs_fileserver_probe_result()
153 if (call->service_id == YFS_FS_SERVICE) { in afs_fileserver_probe_result()
154 server->probe.is_yfs = true; in afs_fileserver_probe_result()
155 set_bit(AFS_SERVER_FL_IS_YFS, &server->flags); in afs_fileserver_probe_result()
156 alist->addrs[index].srx_service = call->service_id; in afs_fileserver_probe_result()
158 server->probe.not_yfs = true; in afs_fileserver_probe_result()
159 if (!server->probe.is_yfs) { in afs_fileserver_probe_result()
160 clear_bit(AFS_SERVER_FL_IS_YFS, &server->flags); in afs_fileserver_probe_result()
161 alist->addrs[index].srx_service = call->service_id; in afs_fileserver_probe_result()
163 cap0 = ntohl(call->tmp); in afs_fileserver_probe_result()
165 set_bit(AFS_SERVER_FL_HAS_FS64, &server->flags); in afs_fileserver_probe_result()
167 clear_bit(AFS_SERVER_FL_HAS_FS64, &server->flags); in afs_fileserver_probe_result()
170 rxrpc_kernel_get_srtt(call->net->socket, call->rxcall, &rtt_us); in afs_fileserver_probe_result()
171 if (rtt_us < server->probe.rtt) { in afs_fileserver_probe_result()
172 server->probe.rtt = rtt_us; in afs_fileserver_probe_result()
173 server->rtt = rtt_us; in afs_fileserver_probe_result()
174 alist->preferred = index; in afs_fileserver_probe_result()
178 server->probe.responded = true; in afs_fileserver_probe_result()
179 set_bit(index, &alist->responded); in afs_fileserver_probe_result()
180 set_bit(AFS_SERVER_FL_RESPONDING, &server->flags); in afs_fileserver_probe_result()
182 spin_unlock(&server->probe_lock); in afs_fileserver_probe_result()
185 &server->uuid, index, &alist->addrs[index].transport, in afs_fileserver_probe_result()
188 return afs_done_one_fs_probe(call->net, server); in afs_fileserver_probe_result()
192 * Probe one or all of a fileserver's addresses to find out the best route and
202 _enter("%pU", &server->uuid); in afs_fs_probe_fileserver()
204 read_lock(&server->fs_lock); in afs_fs_probe_fileserver()
205 ac.alist = rcu_dereference_protected(server->addresses, in afs_fs_probe_fileserver()
206 lockdep_is_held(&server->fs_lock)); in afs_fs_probe_fileserver()
208 read_unlock(&server->fs_lock); in afs_fs_probe_fileserver()
210 server->probed_at = jiffies; in afs_fs_probe_fileserver()
211 atomic_set(&server->probe_outstanding, all ? ac.alist->nr_addrs : 1); in afs_fs_probe_fileserver()
212 memset(&server->probe, 0, sizeof(server->probe)); in afs_fs_probe_fileserver()
213 server->probe.rtt = UINT_MAX; in afs_fs_probe_fileserver()
215 ac.index = ac.alist->preferred; in afs_fs_probe_fileserver()
216 if (ac.index < 0 || ac.index >= ac.alist->nr_addrs) in afs_fs_probe_fileserver()
220 for (ac.index = 0; ac.index < ac.alist->nr_addrs; ac.index++) in afs_fs_probe_fileserver()
232 * Wait for the first as-yet untried fileserver to respond.
240 int pref = -1, i; in afs_wait_for_fs_probes()
242 _enter("%u,%lx", slist->nr_servers, untried); in afs_wait_for_fs_probes()
244 /* Only wait for servers that have a probe outstanding. */ in afs_wait_for_fs_probes()
245 for (i = 0; i < slist->nr_servers; i++) { in afs_wait_for_fs_probes()
247 server = slist->servers[i].server; in afs_wait_for_fs_probes()
248 if (!atomic_read(&server->probe_outstanding)) in afs_wait_for_fs_probes()
250 if (server->probe.responded) in afs_wait_for_fs_probes()
257 waits = kmalloc(array_size(slist->nr_servers, sizeof(*waits)), GFP_KERNEL); in afs_wait_for_fs_probes()
259 return -ENOMEM; in afs_wait_for_fs_probes()
261 for (i = 0; i < slist->nr_servers; i++) { in afs_wait_for_fs_probes()
263 server = slist->servers[i].server; in afs_wait_for_fs_probes()
265 add_wait_queue(&server->probe_wq, &waits[i]); in afs_wait_for_fs_probes()
273 for (i = 0; i < slist->nr_servers; i++) { in afs_wait_for_fs_probes()
275 server = slist->servers[i].server; in afs_wait_for_fs_probes()
276 if (server->probe.responded) in afs_wait_for_fs_probes()
278 if (atomic_read(&server->probe_outstanding)) in afs_wait_for_fs_probes()
291 for (i = 0; i < slist->nr_servers; i++) { in afs_wait_for_fs_probes()
293 server = slist->servers[i].server; in afs_wait_for_fs_probes()
294 rtt_s = READ_ONCE(server->rtt); in afs_wait_for_fs_probes()
295 if (test_bit(AFS_SERVER_FL_RESPONDING, &server->flags) && in afs_wait_for_fs_probes()
301 remove_wait_queue(&server->probe_wq, &waits[i]); in afs_wait_for_fs_probes()
307 if (pref == -1 && signal_pending(current)) in afs_wait_for_fs_probes()
308 return -ERESTARTSYS; in afs_wait_for_fs_probes()
311 slist->preferred = pref; in afs_wait_for_fs_probes()
323 if (!net->live || !queue_work(afs_wq, &net->fs_prober)) in afs_fs_probe_timer()
328 * Dispatch a probe to a server.
331 __releases(&net->fs_lock) in afs_dispatch_fs_probe()
335 /* We remove it from the queues here - it will be added back to in afs_dispatch_fs_probe()
338 list_del_init(&server->probe_link); in afs_dispatch_fs_probe()
341 write_sequnlock(&net->fs_lock); in afs_dispatch_fs_probe()
348 * Probe a server immediately without waiting for its due time to come
353 write_seqlock(&net->fs_lock); in afs_probe_fileserver()
354 if (!list_empty(&server->probe_link)) in afs_probe_fileserver()
356 write_sequnlock(&net->fs_lock); in afs_probe_fileserver()
360 * Probe dispatcher to regularly dispatch probes to keep NAT alive.
369 if (!net->live) { in afs_fs_probe_dispatcher()
376 if (list_empty(&net->fs_probe_fast) && list_empty(&net->fs_probe_slow)) { in afs_fs_probe_dispatcher()
383 write_seqlock(&net->fs_lock); in afs_fs_probe_dispatcher()
389 if (!list_empty(&net->fs_probe_fast)) { in afs_fs_probe_dispatcher()
390 fast = list_first_entry(&net->fs_probe_fast, struct afs_server, probe_link); in afs_fs_probe_dispatcher()
391 poll_at = fast->probed_at + afs_fs_probe_fast_poll_interval; in afs_fs_probe_dispatcher()
399 if (!list_empty(&net->fs_probe_slow)) { in afs_fs_probe_dispatcher()
400 slow = list_first_entry(&net->fs_probe_slow, struct afs_server, probe_link); in afs_fs_probe_dispatcher()
401 poll_at = slow->probed_at + afs_fs_probe_slow_poll_interval; in afs_fs_probe_dispatcher()
412 _debug("probe %pU", &server->uuid); in afs_fs_probe_dispatcher()
420 write_sequnlock(&net->fs_lock); in afs_fs_probe_dispatcher()
423 if (!queue_work(afs_wq, &net->fs_prober)) in afs_fs_probe_dispatcher()
427 if (timer_reduce(&net->fs_probe_timer, timer_at)) in afs_fs_probe_dispatcher()
437 * Wait for a probe on a particular fileserver to complete for 2s.
444 if (atomic_read(&server->probe_outstanding) == 0) in afs_wait_for_one_fs_probe()
449 prepare_to_wait_event(&server->probe_wq, &wait, in afs_wait_for_one_fs_probe()
452 server->probe.responded || in afs_wait_for_one_fs_probe()
453 atomic_read(&server->probe_outstanding) == 0 || in afs_wait_for_one_fs_probe()
459 finish_wait(&server->probe_wq, &wait); in afs_wait_for_one_fs_probe()
462 if (server->probe.responded) in afs_wait_for_one_fs_probe()
465 return -ERESTARTSYS; in afs_wait_for_one_fs_probe()
467 return -ETIME; in afs_wait_for_one_fs_probe()
468 return -EDESTADDRREQ; in afs_wait_for_one_fs_probe()
476 if (del_timer_sync(&net->fs_probe_timer)) in afs_fs_probe_cleanup()