Lines Matching refs:fc

24 static void afs_init_fs_cursor(struct afs_fs_cursor *fc, struct afs_vnode *vnode)  in afs_init_fs_cursor()  argument
26 memset(fc, 0, sizeof(*fc)); in afs_init_fs_cursor()
35 bool afs_begin_vnode_operation(struct afs_fs_cursor *fc, struct afs_vnode *vnode, in afs_begin_vnode_operation() argument
38 afs_init_fs_cursor(fc, vnode); in afs_begin_vnode_operation()
39 fc->vnode = vnode; in afs_begin_vnode_operation()
40 fc->key = key; in afs_begin_vnode_operation()
41 fc->ac.error = SHRT_MAX; in afs_begin_vnode_operation()
44 fc->ac.error = -EINTR; in afs_begin_vnode_operation()
45 fc->flags |= AFS_FS_CURSOR_STOP; in afs_begin_vnode_operation()
50 fc->flags |= AFS_FS_CURSOR_CUR_ONLY; in afs_begin_vnode_operation()
58 static bool afs_start_fs_iteration(struct afs_fs_cursor *fc, in afs_start_fs_iteration() argument
65 fc->server_list = afs_get_serverlist(vnode->volume->servers); in afs_start_fs_iteration()
71 for (i = 0; i < fc->server_list->nr_servers; i++) { in afs_start_fs_iteration()
72 if (fc->server_list->servers[i].cb_interest == cbi) { in afs_start_fs_iteration()
73 fc->start = i; in afs_start_fs_iteration()
82 if (fc->flags & AFS_FS_CURSOR_CUR_ONLY) { in afs_start_fs_iteration()
83 fc->ac.error = -ESTALE; in afs_start_fs_iteration()
98 fc->start = READ_ONCE(fc->server_list->index); in afs_start_fs_iteration()
102 fc->index = fc->start; in afs_start_fs_iteration()
126 static bool afs_sleep_and_retry(struct afs_fs_cursor *fc) in afs_sleep_and_retry() argument
130 fc->ac.error = -ERESTARTSYS; in afs_sleep_and_retry()
141 bool afs_select_fileserver(struct afs_fs_cursor *fc) in afs_select_fileserver() argument
145 struct afs_vnode *vnode = fc->vnode; in afs_select_fileserver()
148 fc->index, fc->start, in afs_select_fileserver()
149 fc->ac.index, fc->ac.start, in afs_select_fileserver()
150 fc->ac.error, fc->ac.abort_code); in afs_select_fileserver()
152 if (fc->flags & AFS_FS_CURSOR_STOP) { in afs_select_fileserver()
158 switch (fc->ac.error) { in afs_select_fileserver()
165 fc->flags |= AFS_FS_CURSOR_STOP; in afs_select_fileserver()
166 _leave(" = f [okay/local %d]", fc->ac.error); in afs_select_fileserver()
173 switch (fc->ac.abort_code) { in afs_select_fileserver()
180 if (fc->flags & AFS_FS_CURSOR_VNOVOL) { in afs_select_fileserver()
181 fc->ac.error = -EREMOTEIO; in afs_select_fileserver()
186 fc->server_list->vnovol_mask |= 1 << fc->index; in afs_select_fileserver()
190 fc->ac.error = afs_check_volume_status(vnode->volume, fc->key); in afs_select_fileserver()
191 if (fc->ac.error < 0) in afs_select_fileserver()
195 fc->ac.error = -ENOMEDIUM; in afs_select_fileserver()
202 if (vnode->volume->servers == fc->server_list) { in afs_select_fileserver()
203 fc->ac.error = -EREMOTEIO; in afs_select_fileserver()
208 fc->flags |= AFS_FS_CURSOR_VNOVOL; in afs_select_fileserver()
218 fc->ac.error = afs_abort_to_error(fc->ac.abort_code); in afs_select_fileserver()
223 afs_busy(vnode->volume, fc->ac.abort_code); in afs_select_fileserver()
226 if (fc->flags & AFS_FS_CURSOR_NO_VSLEEP) { in afs_select_fileserver()
227 fc->ac.error = -EADV; in afs_select_fileserver()
230 if (fc->flags & AFS_FS_CURSOR_CUR_ONLY) { in afs_select_fileserver()
231 fc->ac.error = -ESTALE; in afs_select_fileserver()
242 if (fc->flags & AFS_FS_CURSOR_NO_VSLEEP) { in afs_select_fileserver()
243 fc->ac.error = -EBUSY; in afs_select_fileserver()
247 afs_busy(vnode->volume, fc->ac.abort_code); in afs_select_fileserver()
251 if (fc->flags & AFS_FS_CURSOR_CUR_ONLY) { in afs_select_fileserver()
252 if (!afs_sleep_and_retry(fc)) in afs_select_fileserver()
260 fc->flags |= AFS_FS_CURSOR_VBUSY; in afs_select_fileserver()
271 if (fc->flags & AFS_FS_CURSOR_VMOVED) { in afs_select_fileserver()
272 fc->ac.error = -EREMOTEIO; in afs_select_fileserver()
275 fc->flags |= AFS_FS_CURSOR_VMOVED; in afs_select_fileserver()
279 fc->ac.error = afs_check_volume_status(vnode->volume, fc->key); in afs_select_fileserver()
280 if (fc->ac.error < 0) in afs_select_fileserver()
292 if (vnode->volume->servers == fc->server_list) { in afs_select_fileserver()
293 fc->ac.error = -ENOMEDIUM; in afs_select_fileserver()
302 fc->ac.error = afs_abort_to_error(fc->ac.abort_code); in afs_select_fileserver()
321 afs_end_cursor(&fc->ac); in afs_select_fileserver()
322 afs_put_cb_interest(afs_v2net(vnode), fc->cbi); in afs_select_fileserver()
323 fc->cbi = NULL; in afs_select_fileserver()
324 afs_put_serverlist(afs_v2net(vnode), fc->server_list); in afs_select_fileserver()
325 fc->server_list = NULL; in afs_select_fileserver()
331 fc->ac.error = afs_check_volume_status(vnode->volume, fc->key); in afs_select_fileserver()
332 if (fc->ac.error < 0) in afs_select_fileserver()
335 if (!afs_start_fs_iteration(fc, vnode)) in afs_select_fileserver()
344 ASSERTCMP(fc->ac.alist, ==, NULL); in afs_select_fileserver()
345 server = fc->server_list->servers[fc->index].server; in afs_select_fileserver()
347 if (!afs_check_server_record(fc, server)) in afs_select_fileserver()
357 fc->ac.error = afs_register_server_cb_interest(vnode, fc->server_list, in afs_select_fileserver()
358 fc->index); in afs_select_fileserver()
359 if (fc->ac.error < 0) in afs_select_fileserver()
362 fc->cbi = afs_get_cb_interest(vnode->cb_interest); in afs_select_fileserver()
370 memset(&fc->ac, 0, sizeof(fc->ac)); in afs_select_fileserver()
374 fc->ac.alist = afs_get_addrlist(alist); in afs_select_fileserver()
376 if (!afs_probe_fileserver(fc)) { in afs_select_fileserver()
377 switch (fc->ac.error) { in afs_select_fileserver()
388 if (!fc->ac.alist) in afs_select_fileserver()
389 fc->ac.alist = alist; in afs_select_fileserver()
393 fc->ac.start = READ_ONCE(alist->index); in afs_select_fileserver()
394 fc->ac.index = fc->ac.start; in afs_select_fileserver()
397 ASSERT(fc->ac.alist); in afs_select_fileserver()
398 _debug("iterate %d/%d", fc->ac.index, fc->ac.alist->nr_addrs); in afs_select_fileserver()
402 if (!afs_iterate_addresses(&fc->ac)) in afs_select_fileserver()
410 afs_end_cursor(&fc->ac); in afs_select_fileserver()
411 afs_put_cb_interest(afs_v2net(vnode), fc->cbi); in afs_select_fileserver()
412 fc->cbi = NULL; in afs_select_fileserver()
413 fc->index++; in afs_select_fileserver()
414 if (fc->index >= fc->server_list->nr_servers) in afs_select_fileserver()
415 fc->index = 0; in afs_select_fileserver()
416 if (fc->index != fc->start) in afs_select_fileserver()
422 if (fc->flags & AFS_FS_CURSOR_VBUSY) in afs_select_fileserver()
425 fc->ac.error = -EDESTADDRREQ; in afs_select_fileserver()
429 fc->flags |= AFS_FS_CURSOR_STOP; in afs_select_fileserver()
430 afs_end_cursor(&fc->ac); in afs_select_fileserver()
431 _leave(" = f [failed %d]", fc->ac.error); in afs_select_fileserver()
440 bool afs_select_current_fileserver(struct afs_fs_cursor *fc) in afs_select_current_fileserver() argument
442 struct afs_vnode *vnode = fc->vnode; in afs_select_current_fileserver()
448 switch (fc->ac.error) { in afs_select_current_fileserver()
451 fc->ac.error = -ESTALE; in afs_select_current_fileserver()
452 fc->flags |= AFS_FS_CURSOR_STOP; in afs_select_current_fileserver()
456 fc->cbi = afs_get_cb_interest(vnode->cb_interest); in afs_select_current_fileserver()
464 fc->ac.error = -ESTALE; in afs_select_current_fileserver()
465 fc->flags |= AFS_FS_CURSOR_STOP; in afs_select_current_fileserver()
469 memset(&fc->ac, 0, sizeof(fc->ac)); in afs_select_current_fileserver()
470 fc->ac.alist = alist; in afs_select_current_fileserver()
471 fc->ac.start = READ_ONCE(alist->index); in afs_select_current_fileserver()
472 fc->ac.index = fc->ac.start; in afs_select_current_fileserver()
478 fc->flags |= AFS_FS_CURSOR_STOP; in afs_select_current_fileserver()
479 _leave(" = f [okay/local %d]", fc->ac.error); in afs_select_current_fileserver()
483 fc->flags |= AFS_FS_CURSOR_STOP; in afs_select_current_fileserver()
500 if (afs_iterate_addresses(&fc->ac)) { in afs_select_current_fileserver()
505 afs_end_cursor(&fc->ac); in afs_select_current_fileserver()
512 int afs_end_vnode_operation(struct afs_fs_cursor *fc) in afs_end_vnode_operation() argument
514 struct afs_net *net = afs_v2net(fc->vnode); in afs_end_vnode_operation()
517 mutex_unlock(&fc->vnode->io_lock); in afs_end_vnode_operation()
519 afs_end_cursor(&fc->ac); in afs_end_vnode_operation()
520 afs_put_cb_interest(net, fc->cbi); in afs_end_vnode_operation()
521 afs_put_serverlist(net, fc->server_list); in afs_end_vnode_operation()
523 ret = fc->ac.error; in afs_end_vnode_operation()
525 afs_abort_to_error(fc->ac.abort_code); in afs_end_vnode_operation()
527 return fc->ac.error; in afs_end_vnode_operation()