Lines Matching refs:vc
17 bool afs_begin_vlserver_operation(struct afs_vl_cursor *vc, struct afs_cell *cell, in afs_begin_vlserver_operation() argument
20 memset(vc, 0, sizeof(*vc)); in afs_begin_vlserver_operation()
21 vc->cell = cell; in afs_begin_vlserver_operation()
22 vc->key = key; in afs_begin_vlserver_operation()
23 vc->error = -EDESTADDRREQ; in afs_begin_vlserver_operation()
24 vc->ac.error = SHRT_MAX; in afs_begin_vlserver_operation()
27 vc->error = -EINTR; in afs_begin_vlserver_operation()
28 vc->flags |= AFS_VL_CURSOR_STOP; in afs_begin_vlserver_operation()
39 static bool afs_start_vl_iteration(struct afs_vl_cursor *vc) in afs_start_vl_iteration() argument
41 struct afs_cell *cell = vc->cell; in afs_start_vl_iteration()
55 vc->error = -ERESTARTSYS; in afs_start_vl_iteration()
63 vc->error = -ENOENT; in afs_start_vl_iteration()
68 vc->error = -EDESTADDRREQ; in afs_start_vl_iteration()
74 vc->server_list = afs_get_vlserverlist( in afs_start_vl_iteration()
78 if (!vc->server_list->nr_servers) in afs_start_vl_iteration()
81 vc->untried = (1UL << vc->server_list->nr_servers) - 1; in afs_start_vl_iteration()
82 vc->index = -1; in afs_start_vl_iteration()
90 bool afs_select_vlserver(struct afs_vl_cursor *vc) in afs_select_vlserver() argument
96 int error = vc->ac.error, i; in afs_select_vlserver()
99 vc->untried, vc->index, in afs_select_vlserver()
100 vc->ac.tried, vc->ac.index, in afs_select_vlserver()
101 error, vc->ac.abort_code); in afs_select_vlserver()
103 if (vc->flags & AFS_VL_CURSOR_STOP) { in afs_select_vlserver()
108 vc->nr_iterations++; in afs_select_vlserver()
118 vc->error = error; in afs_select_vlserver()
119 vc->flags |= AFS_VL_CURSOR_STOP; in afs_select_vlserver()
120 _leave(" = f [okay/local %d]", vc->ac.error); in afs_select_vlserver()
127 switch (vc->ac.abort_code) { in afs_select_vlserver()
132 vc->error = -EREMOTEIO; in afs_select_vlserver()
139 vc->error = afs_abort_to_error(vc->ac.abort_code); in afs_select_vlserver()
152 vc->error = error; in afs_select_vlserver()
157 vc->error = error; in afs_select_vlserver()
158 vc->flags |= AFS_VL_CURSOR_RETRY; in afs_select_vlserver()
168 afs_end_cursor(&vc->ac); in afs_select_vlserver()
169 afs_put_vlserverlist(vc->cell->net, vc->server_list); in afs_select_vlserver()
170 vc->server_list = NULL; in afs_select_vlserver()
171 if (vc->flags & AFS_VL_CURSOR_RETRIED) in afs_select_vlserver()
173 vc->flags |= AFS_VL_CURSOR_RETRIED; in afs_select_vlserver()
177 if (!afs_start_vl_iteration(vc)) in afs_select_vlserver()
180 error = afs_send_vl_probes(vc->cell->net, vc->key, vc->server_list); in afs_select_vlserver()
185 _debug("pick [%lx]", vc->untried); in afs_select_vlserver()
187 error = afs_wait_for_vl_probes(vc->server_list, vc->untried); in afs_select_vlserver()
192 vc->index = vc->server_list->preferred; in afs_select_vlserver()
193 if (test_bit(vc->index, &vc->untried)) in afs_select_vlserver()
196 vc->index = -1; in afs_select_vlserver()
198 for (i = 0; i < vc->server_list->nr_servers; i++) { in afs_select_vlserver()
199 struct afs_vlserver *s = vc->server_list->servers[i].server; in afs_select_vlserver()
201 if (!test_bit(i, &vc->untried) || in afs_select_vlserver()
205 vc->index = i; in afs_select_vlserver()
210 if (vc->index == -1) in afs_select_vlserver()
214 _debug("use %d", vc->index); in afs_select_vlserver()
215 __clear_bit(vc->index, &vc->untried); in afs_select_vlserver()
221 ASSERTCMP(vc->ac.alist, ==, NULL); in afs_select_vlserver()
222 vlserver = vc->server_list->servers[vc->index].server; in afs_select_vlserver()
223 vc->server = vlserver; in afs_select_vlserver()
233 memset(&vc->ac, 0, sizeof(vc->ac)); in afs_select_vlserver()
235 if (!vc->ac.alist) in afs_select_vlserver()
236 vc->ac.alist = alist; in afs_select_vlserver()
240 vc->ac.index = -1; in afs_select_vlserver()
243 ASSERT(vc->ac.alist); in afs_select_vlserver()
247 if (!afs_iterate_addresses(&vc->ac)) in afs_select_vlserver()
250 _debug("VL address %d/%d", vc->ac.index, vc->ac.alist->nr_addrs); in afs_select_vlserver()
252 _leave(" = t %pISpc", &vc->ac.alist->addrs[vc->ac.index].transport); in afs_select_vlserver()
257 afs_end_cursor(&vc->ac); in afs_select_vlserver()
264 if (vc->flags & AFS_VL_CURSOR_RETRY) in afs_select_vlserver()
269 for (i = 0; i < vc->server_list->nr_servers; i++) { in afs_select_vlserver()
270 struct afs_vlserver *s = vc->server_list->servers[i].server; in afs_select_vlserver()
281 vc->error = error; in afs_select_vlserver()
283 vc->flags |= AFS_VL_CURSOR_STOP; in afs_select_vlserver()
284 afs_end_cursor(&vc->ac); in afs_select_vlserver()
285 _leave(" = f [failed %d]", vc->error); in afs_select_vlserver()
292 static void afs_vl_dump_edestaddrreq(const struct afs_vl_cursor *vc) in afs_vl_dump_edestaddrreq() argument
294 struct afs_cell *cell = vc->cell; in afs_vl_dump_edestaddrreq()
308 vc->untried, vc->index, vc->nr_iterations, vc->flags, vc->error); in afs_vl_dump_edestaddrreq()
310 if (vc->server_list) { in afs_vl_dump_edestaddrreq()
311 const struct afs_vlserver_list *sl = vc->server_list; in afs_vl_dump_edestaddrreq()
326 if (a == vc->ac.alist) in afs_vl_dump_edestaddrreq()
333 vc->ac.tried, vc->ac.index, vc->ac.abort_code, vc->ac.error, in afs_vl_dump_edestaddrreq()
334 vc->ac.responded, vc->ac.nr_iterations); in afs_vl_dump_edestaddrreq()
341 int afs_end_vlserver_operation(struct afs_vl_cursor *vc) in afs_end_vlserver_operation() argument
343 struct afs_net *net = vc->cell->net; in afs_end_vlserver_operation()
345 if (vc->error == -EDESTADDRREQ || in afs_end_vlserver_operation()
346 vc->error == -EADDRNOTAVAIL || in afs_end_vlserver_operation()
347 vc->error == -ENETUNREACH || in afs_end_vlserver_operation()
348 vc->error == -EHOSTUNREACH) in afs_end_vlserver_operation()
349 afs_vl_dump_edestaddrreq(vc); in afs_end_vlserver_operation()
351 afs_end_cursor(&vc->ac); in afs_end_vlserver_operation()
352 afs_put_vlserverlist(net, vc->server_list); in afs_end_vlserver_operation()
354 if (vc->error == -ECONNABORTED) in afs_end_vlserver_operation()
355 vc->error = afs_abort_to_error(vc->ac.abort_code); in afs_end_vlserver_operation()
357 return vc->error; in afs_end_vlserver_operation()