Lines Matching refs:fc

23 bool afs_begin_vnode_operation(struct afs_fs_cursor *fc, struct afs_vnode *vnode,  in afs_begin_vnode_operation()  argument
26 memset(fc, 0, sizeof(*fc)); in afs_begin_vnode_operation()
27 fc->vnode = vnode; in afs_begin_vnode_operation()
28 fc->key = key; in afs_begin_vnode_operation()
29 fc->ac.error = SHRT_MAX; in afs_begin_vnode_operation()
30 fc->error = -EDESTADDRREQ; in afs_begin_vnode_operation()
33 fc->flags |= AFS_FS_CURSOR_INTR; in afs_begin_vnode_operation()
35 fc->error = -EINTR; in afs_begin_vnode_operation()
36 fc->flags |= AFS_FS_CURSOR_STOP; in afs_begin_vnode_operation()
44 fc->flags |= AFS_FS_CURSOR_CUR_ONLY; in afs_begin_vnode_operation()
52 static bool afs_start_fs_iteration(struct afs_fs_cursor *fc, in afs_start_fs_iteration() argument
59 fc->server_list = afs_get_serverlist(vnode->volume->servers); in afs_start_fs_iteration()
62 fc->untried = (1UL << fc->server_list->nr_servers) - 1; in afs_start_fs_iteration()
63 fc->index = READ_ONCE(fc->server_list->preferred); in afs_start_fs_iteration()
69 for (i = 0; i < fc->server_list->nr_servers; i++) { in afs_start_fs_iteration()
70 if (fc->server_list->servers[i].cb_interest == cbi) { in afs_start_fs_iteration()
71 fc->index = i; in afs_start_fs_iteration()
80 if (fc->flags & AFS_FS_CURSOR_CUR_ONLY) { in afs_start_fs_iteration()
81 fc->error = -ESTALE; in afs_start_fs_iteration()
121 static bool afs_sleep_and_retry(struct afs_fs_cursor *fc) in afs_sleep_and_retry() argument
123 if (fc->flags & AFS_FS_CURSOR_INTR) { in afs_sleep_and_retry()
126 fc->error = -ERESTARTSYS; in afs_sleep_and_retry()
140 bool afs_select_fileserver(struct afs_fs_cursor *fc) in afs_select_fileserver() argument
144 struct afs_vnode *vnode = fc->vnode; in afs_select_fileserver()
147 int error = fc->ac.error, i; in afs_select_fileserver()
150 fc->untried, fc->index, in afs_select_fileserver()
151 fc->ac.tried, fc->ac.index, in afs_select_fileserver()
152 error, fc->ac.abort_code); in afs_select_fileserver()
154 if (fc->flags & AFS_FS_CURSOR_STOP) { in afs_select_fileserver()
159 fc->nr_iterations++; in afs_select_fileserver()
169 fc->error = error; in afs_select_fileserver()
170 fc->flags |= AFS_FS_CURSOR_STOP; in afs_select_fileserver()
178 switch (fc->ac.abort_code) { in afs_select_fileserver()
185 if (fc->flags & AFS_FS_CURSOR_VNOVOL) { in afs_select_fileserver()
186 fc->error = -EREMOTEIO; in afs_select_fileserver()
191 fc->server_list->vnovol_mask |= 1 << fc->index; in afs_select_fileserver()
195 error = afs_check_volume_status(vnode->volume, fc->key); in afs_select_fileserver()
200 fc->error = -ENOMEDIUM; in afs_select_fileserver()
207 if (vnode->volume->servers == fc->server_list) { in afs_select_fileserver()
208 fc->error = -EREMOTEIO; in afs_select_fileserver()
213 fc->flags |= AFS_FS_CURSOR_VNOVOL; in afs_select_fileserver()
223 fc->error = afs_abort_to_error(fc->ac.abort_code); in afs_select_fileserver()
228 afs_busy(vnode->volume, fc->ac.abort_code); in afs_select_fileserver()
231 if (fc->flags & AFS_FS_CURSOR_NO_VSLEEP) { in afs_select_fileserver()
232 fc->error = -EADV; in afs_select_fileserver()
235 if (fc->flags & AFS_FS_CURSOR_CUR_ONLY) { in afs_select_fileserver()
236 fc->error = -ESTALE; in afs_select_fileserver()
247 if (fc->flags & AFS_FS_CURSOR_NO_VSLEEP) { in afs_select_fileserver()
248 fc->error = -EBUSY; in afs_select_fileserver()
252 afs_busy(vnode->volume, fc->ac.abort_code); in afs_select_fileserver()
256 if (fc->flags & AFS_FS_CURSOR_CUR_ONLY) { in afs_select_fileserver()
257 if (!afs_sleep_and_retry(fc)) in afs_select_fileserver()
265 fc->flags |= AFS_FS_CURSOR_VBUSY; in afs_select_fileserver()
276 if (fc->flags & AFS_FS_CURSOR_VMOVED) { in afs_select_fileserver()
277 fc->error = -EREMOTEIO; in afs_select_fileserver()
280 fc->flags |= AFS_FS_CURSOR_VMOVED; in afs_select_fileserver()
284 error = afs_check_volume_status(vnode->volume, fc->key); in afs_select_fileserver()
297 if (vnode->volume->servers == fc->server_list) { in afs_select_fileserver()
298 fc->error = -ENOMEDIUM; in afs_select_fileserver()
307 fc->error = afs_abort_to_error(fc->ac.abort_code); in afs_select_fileserver()
313 if (fc->error != -EDESTADDRREQ) in afs_select_fileserver()
323 fc->error = error; in afs_select_fileserver()
328 fc->error = error; in afs_select_fileserver()
334 afs_end_cursor(&fc->ac); in afs_select_fileserver()
335 afs_put_cb_interest(afs_v2net(vnode), fc->cbi); in afs_select_fileserver()
336 fc->cbi = NULL; in afs_select_fileserver()
337 afs_put_serverlist(afs_v2net(vnode), fc->server_list); in afs_select_fileserver()
338 fc->server_list = NULL; in afs_select_fileserver()
344 error = afs_check_volume_status(vnode->volume, fc->key); in afs_select_fileserver()
348 if (!afs_start_fs_iteration(fc, vnode)) in afs_select_fileserver()
352 error = afs_probe_fileservers(afs_v2net(vnode), fc->key, fc->server_list); in afs_select_fileserver()
357 _debug("pick [%lx]", fc->untried); in afs_select_fileserver()
359 error = afs_wait_for_fs_probes(fc->server_list, fc->untried); in afs_select_fileserver()
366 if (fc->cbi) { in afs_select_fileserver()
367 _debug("cbi %u", fc->index); in afs_select_fileserver()
368 if (test_bit(fc->index, &fc->untried)) in afs_select_fileserver()
370 afs_put_cb_interest(afs_v2net(vnode), fc->cbi); in afs_select_fileserver()
371 fc->cbi = NULL; in afs_select_fileserver()
375 fc->index = -1; in afs_select_fileserver()
377 for (i = 0; i < fc->server_list->nr_servers; i++) { in afs_select_fileserver()
378 struct afs_server *s = fc->server_list->servers[i].server; in afs_select_fileserver()
380 if (!test_bit(i, &fc->untried) || !s->probe.responded) in afs_select_fileserver()
383 fc->index = i; in afs_select_fileserver()
388 if (fc->index == -1) in afs_select_fileserver()
392 _debug("use %d", fc->index); in afs_select_fileserver()
393 __clear_bit(fc->index, &fc->untried); in afs_select_fileserver()
399 ASSERTCMP(fc->ac.alist, ==, NULL); in afs_select_fileserver()
400 server = fc->server_list->servers[fc->index].server; in afs_select_fileserver()
402 if (!afs_check_server_record(fc, server)) in afs_select_fileserver()
412 error = afs_register_server_cb_interest(vnode, fc->server_list, in afs_select_fileserver()
413 fc->index); in afs_select_fileserver()
417 fc->cbi = afs_get_cb_interest( in afs_select_fileserver()
427 memset(&fc->ac, 0, sizeof(fc->ac)); in afs_select_fileserver()
429 if (!fc->ac.alist) in afs_select_fileserver()
430 fc->ac.alist = alist; in afs_select_fileserver()
434 fc->ac.index = -1; in afs_select_fileserver()
437 ASSERT(fc->ac.alist); in afs_select_fileserver()
441 if (!afs_iterate_addresses(&fc->ac)) in afs_select_fileserver()
444 _debug("address [%u] %u/%u", fc->index, fc->ac.index, fc->ac.alist->nr_addrs); in afs_select_fileserver()
451 afs_end_cursor(&fc->ac); in afs_select_fileserver()
458 if (fc->flags & AFS_FS_CURSOR_VBUSY) in afs_select_fileserver()
463 for (i = 0; i < fc->server_list->nr_servers; i++) { in afs_select_fileserver()
464 struct afs_server *s = fc->server_list->servers[i].server; in afs_select_fileserver()
473 fc->error = error; in afs_select_fileserver()
475 fc->flags |= AFS_FS_CURSOR_STOP; in afs_select_fileserver()
476 afs_end_cursor(&fc->ac); in afs_select_fileserver()
477 _leave(" = f [failed %d]", fc->error); in afs_select_fileserver()
486 bool afs_select_current_fileserver(struct afs_fs_cursor *fc) in afs_select_current_fileserver() argument
488 struct afs_vnode *vnode = fc->vnode; in afs_select_current_fileserver()
491 int error = fc->ac.error; in afs_select_current_fileserver()
501 fc->error = -ESTALE; in afs_select_current_fileserver()
502 fc->flags |= AFS_FS_CURSOR_STOP; in afs_select_current_fileserver()
506 fc->cbi = afs_get_cb_interest(cbi); in afs_select_current_fileserver()
514 fc->error = -ESTALE; in afs_select_current_fileserver()
515 fc->flags |= AFS_FS_CURSOR_STOP; in afs_select_current_fileserver()
519 memset(&fc->ac, 0, sizeof(fc->ac)); in afs_select_current_fileserver()
520 fc->ac.alist = alist; in afs_select_current_fileserver()
521 fc->ac.index = -1; in afs_select_current_fileserver()
527 fc->error = error; in afs_select_current_fileserver()
528 fc->flags |= AFS_FS_CURSOR_STOP; in afs_select_current_fileserver()
533 fc->error = afs_abort_to_error(fc->ac.abort_code); in afs_select_current_fileserver()
534 fc->flags |= AFS_FS_CURSOR_STOP; in afs_select_current_fileserver()
547 fc->error = error; in afs_select_current_fileserver()
555 if (afs_iterate_addresses(&fc->ac)) { in afs_select_current_fileserver()
560 afs_end_cursor(&fc->ac); in afs_select_current_fileserver()
567 static void afs_dump_edestaddrreq(const struct afs_fs_cursor *fc) in afs_dump_edestaddrreq() argument
580 fc->cb_break, fc->cb_break_2, fc->flags, fc->error); in afs_dump_edestaddrreq()
582 fc->untried, fc->index, fc->nr_iterations); in afs_dump_edestaddrreq()
584 if (fc->server_list) { in afs_dump_edestaddrreq()
585 const struct afs_server_list *sl = fc->server_list; in afs_dump_edestaddrreq()
601 if (a == fc->ac.alist) in afs_dump_edestaddrreq()
608 fc->ac.tried, fc->ac.index, fc->ac.abort_code, fc->ac.error, in afs_dump_edestaddrreq()
609 fc->ac.responded, fc->ac.nr_iterations); in afs_dump_edestaddrreq()
616 int afs_end_vnode_operation(struct afs_fs_cursor *fc) in afs_end_vnode_operation() argument
618 struct afs_net *net = afs_v2net(fc->vnode); in afs_end_vnode_operation()
620 if (fc->error == -EDESTADDRREQ || in afs_end_vnode_operation()
621 fc->error == -EADDRNOTAVAIL || in afs_end_vnode_operation()
622 fc->error == -ENETUNREACH || in afs_end_vnode_operation()
623 fc->error == -EHOSTUNREACH) in afs_end_vnode_operation()
624 afs_dump_edestaddrreq(fc); in afs_end_vnode_operation()
626 mutex_unlock(&fc->vnode->io_lock); in afs_end_vnode_operation()
628 afs_end_cursor(&fc->ac); in afs_end_vnode_operation()
629 afs_put_cb_interest(net, fc->cbi); in afs_end_vnode_operation()
630 afs_put_serverlist(net, fc->server_list); in afs_end_vnode_operation()
632 if (fc->error == -ECONNABORTED) in afs_end_vnode_operation()
633 fc->error = afs_abort_to_error(fc->ac.abort_code); in afs_end_vnode_operation()
635 return fc->error; in afs_end_vnode_operation()