Lines Matching refs:vc

17 bool afs_begin_vlserver_operation(struct afs_vl_cursor *vc, struct afs_cell *cell,
22 memset(vc, 0, sizeof(*vc));
23 vc->cell = cell;
24 vc->key = key;
25 vc->cumul_error.error = -EDESTADDRREQ;
26 vc->nr_iterations = -1;
29 vc->cumul_error.error = -EINTR;
30 vc->flags |= AFS_VL_CURSOR_STOP;
34 vc->debug_id = atomic_inc_return(&debug_ids);
42 static bool afs_start_vl_iteration(struct afs_vl_cursor *vc)
44 struct afs_cell *cell = vc->cell;
58 vc->cumul_error.error = -ERESTARTSYS;
66 vc->cumul_error.error = -ENOENT;
71 vc->cumul_error.error = -EDESTADDRREQ;
77 vc->server_list = afs_get_vlserverlist(
81 if (!vc->server_list->nr_servers)
84 vc->untried_servers = (1UL << vc->server_list->nr_servers) - 1;
85 vc->server_index = -1;
93 bool afs_select_vlserver(struct afs_vl_cursor *vc)
95 struct afs_addr_list *alist = vc->alist;
99 s32 abort_code = vc->call_abort_code;
100 int error = vc->call_error, i;
102 vc->nr_iterations++;
105 vc->debug_id, vc->nr_iterations, vc->server_index, vc->untried_servers,
106 vc->addr_index, vc->addr_tried,
109 if (vc->flags & AFS_VL_CURSOR_STOP) {
114 if (vc->nr_iterations == 0)
117 WRITE_ONCE(alist->addrs[vc->addr_index].last_error, error);
124 vc->cumul_error.error = error;
125 vc->flags |= AFS_VL_CURSOR_STOP;
126 _leave(" = f [okay/local %d]", vc->cumul_error.error);
138 afs_prioritise_error(&vc->cumul_error, -EREMOTEIO, abort_code);
139 //write_lock(&vc->cell->vl_servers_lock);
140 //vc->server_list->weird_mask |= 1 << vc->server_index;
141 //write_unlock(&vc->cell->vl_servers_lock);
145 afs_prioritise_error(&vc->cumul_error, error, abort_code);
158 afs_prioritise_error(&vc->cumul_error, error, 0);
163 afs_prioritise_error(&vc->cumul_error, error, 0);
164 vc->flags |= AFS_VL_CURSOR_RETRY;
174 if (vc->call_responded &&
175 vc->addr_index != vc->alist->preferred &&
176 test_bit(alist->preferred, &vc->addr_tried))
177 WRITE_ONCE(alist->preferred, vc->addr_index);
179 alist = vc->alist = NULL;
181 afs_put_vlserverlist(vc->cell->net, vc->server_list);
182 vc->server_list = NULL;
183 if (vc->flags & AFS_VL_CURSOR_RETRIED)
185 vc->flags |= AFS_VL_CURSOR_RETRIED;
190 if (!afs_start_vl_iteration(vc))
193 error = afs_send_vl_probes(vc->cell->net, vc->key, vc->server_list);
195 afs_prioritise_error(&vc->cumul_error, error, 0);
200 _debug("pick [%lx]", vc->untried_servers);
203 error = afs_wait_for_vl_probes(vc->server_list, vc->untried_servers);
205 afs_prioritise_error(&vc->cumul_error, error, 0);
210 vc->server_index = vc->server_list->preferred;
211 if (test_bit(vc->server_index, &vc->untried_servers))
214 vc->server_index = -1;
216 for (i = 0; i < vc->server_list->nr_servers; i++) {
217 struct afs_vlserver *s = vc->server_list->servers[i].server;
219 if (!test_bit(i, &vc->untried_servers) ||
223 vc->server_index = i;
228 if (vc->server_index == -1)
232 _debug("use %d", vc->server_index);
233 __clear_bit(vc->server_index, &vc->untried_servers);
239 vlserver = vc->server_list->servers[vc->server_index].server;
240 vc->server = vlserver;
247 vc->alist = afs_get_addrlist(alist, afs_alist_trace_get_vlrotate_set);
250 vc->addr_tried = 0;
251 vc->addr_index = -1;
259 vc->addr_index = READ_ONCE(alist->preferred);
261 _debug("%lx-%lx-%lx,%d", set, failed, vc->addr_tried, vc->addr_index);
263 set &= ~(failed | vc->addr_tried);
268 if (!test_bit(vc->addr_index, &set))
269 vc->addr_index = __ffs(set);
271 set_bit(vc->addr_index, &vc->addr_tried);
272 vc->alist = alist;
274 _debug("VL address %d/%d", vc->addr_index, alist->nr_addrs);
276 vc->call_responded = false;
277 _leave(" = t %pISpc", rxrpc_kernel_remote_addr(alist->addrs[vc->addr_index].peer));
283 if (vc->call_responded &&
284 vc->addr_index != alist->preferred &&
285 test_bit(alist->preferred, &vc->addr_tried))
286 WRITE_ONCE(alist->preferred, vc->addr_index);
288 alist = vc->alist = NULL;
295 if (vc->flags & AFS_VL_CURSOR_RETRY)
298 for (i = 0; i < vc->server_list->nr_servers; i++) {
299 struct afs_vlserver *s = vc->server_list->servers[i].server;
302 vc->cumul_error.responded = true;
303 afs_prioritise_error(&vc->cumul_error, READ_ONCE(s->probe.error),
309 if (vc->call_responded &&
310 vc->addr_index != alist->preferred &&
311 test_bit(alist->preferred, &vc->addr_tried))
312 WRITE_ONCE(alist->preferred, vc->addr_index);
314 alist = vc->alist = NULL;
316 vc->flags |= AFS_VL_CURSOR_STOP;
317 _leave(" = f [failed %d]", vc->cumul_error.error);
324 static void afs_vl_dump_edestaddrreq(const struct afs_vl_cursor *vc)
326 struct afs_cell *cell = vc->cell;
340 vc->untried_servers, vc->server_index, vc->nr_iterations,
341 vc->flags, vc->cumul_error.error);
343 vc->call_error, vc->call_abort_code, vc->call_responded);
345 if (vc->server_list) {
346 const struct afs_vlserver_list *sl = vc->server_list;
361 if (a == vc->alist)
367 pr_notice("AC: t=%lx ax=%u\n", vc->addr_tried, vc->addr_index);
374 int afs_end_vlserver_operation(struct afs_vl_cursor *vc)
376 struct afs_net *net = vc->cell->net;
378 _enter("VC=%x+%x", vc->debug_id, vc->nr_iterations);
380 switch (vc->cumul_error.error) {
385 afs_vl_dump_edestaddrreq(vc);
389 if (vc->alist) {
390 if (vc->call_responded &&
391 vc->addr_index != vc->alist->preferred &&
392 test_bit(vc->alist->preferred, &vc->addr_tried))
393 WRITE_ONCE(vc->alist->preferred, vc->addr_index);
394 afs_put_addrlist(vc->alist, afs_alist_trace_put_vlrotate_end);
395 vc->alist = NULL;
397 afs_put_vlserverlist(net, vc->server_list);
398 return vc->cumul_error.error;