Lines Matching refs:op
21 static bool afs_start_fs_iteration(struct afs_operation *op,
28 read_lock(&op->volume->servers_lock);
29 op->server_list = afs_get_serverlist(
30 rcu_dereference_protected(op->volume->servers,
31 lockdep_is_held(&op->volume->servers_lock)));
32 read_unlock(&op->volume->servers_lock);
34 op->untried = (1UL << op->server_list->nr_servers) - 1;
35 op->index = READ_ONCE(op->server_list->preferred);
40 for (i = 0; i < op->server_list->nr_servers; i++) {
41 server = op->server_list->servers[i].server;
43 op->index = i;
52 if (op->flags & AFS_OPERATION_CUR_ONLY) {
53 op->error = -ESTALE;
90 static bool afs_sleep_and_retry(struct afs_operation *op)
92 if (!(op->flags & AFS_OPERATION_UNINTR)) {
95 op->error = -ERESTARTSYS;
109 bool afs_select_fileserver(struct afs_operation *op)
113 struct afs_vnode *vnode = op->file[0].vnode;
116 int error = op->ac.error, i;
119 op->untried, op->index,
120 op->ac.tried, op->ac.index,
121 error, op->ac.abort_code);
123 if (op->flags & AFS_OPERATION_STOP) {
128 op->nr_iterations++;
138 op->error = error;
139 op->flags |= AFS_OPERATION_STOP;
147 switch (op->ac.abort_code) {
154 if (op->flags & AFS_OPERATION_VNOVOL) {
155 op->error = -EREMOTEIO;
159 write_lock(&op->volume->servers_lock);
160 op->server_list->vnovol_mask |= 1 << op->index;
161 write_unlock(&op->volume->servers_lock);
163 set_bit(AFS_VOLUME_NEEDS_UPDATE, &op->volume->flags);
164 error = afs_check_volume_status(op->volume, op);
168 if (test_bit(AFS_VOLUME_DELETED, &op->volume->flags)) {
169 op->error = -ENOMEDIUM;
176 if (rcu_access_pointer(op->volume->servers) == op->server_list) {
177 op->error = -EREMOTEIO;
182 op->flags |= AFS_OPERATION_VNOVOL;
192 op->error = afs_abort_to_error(op->ac.abort_code);
196 if (!test_and_set_bit(AFS_VOLUME_OFFLINE, &op->volume->flags)) {
197 afs_busy(op->volume, op->ac.abort_code);
198 clear_bit(AFS_VOLUME_BUSY, &op->volume->flags);
200 if (op->flags & AFS_OPERATION_NO_VSLEEP) {
201 op->error = -EADV;
204 if (op->flags & AFS_OPERATION_CUR_ONLY) {
205 op->error = -ESTALE;
216 if (op->flags & AFS_OPERATION_NO_VSLEEP) {
217 op->error = -EBUSY;
220 if (!test_and_set_bit(AFS_VOLUME_BUSY, &op->volume->flags)) {
221 afs_busy(op->volume, op->ac.abort_code);
222 clear_bit(AFS_VOLUME_OFFLINE, &op->volume->flags);
225 if (op->flags & AFS_OPERATION_CUR_ONLY) {
226 if (!afs_sleep_and_retry(op))
234 op->flags |= AFS_OPERATION_VBUSY;
245 if (op->flags & AFS_OPERATION_VMOVED) {
246 op->error = -EREMOTEIO;
249 op->flags |= AFS_OPERATION_VMOVED;
251 set_bit(AFS_VOLUME_WAIT, &op->volume->flags);
252 set_bit(AFS_VOLUME_NEEDS_UPDATE, &op->volume->flags);
253 error = afs_check_volume_status(op->volume, op);
266 if (rcu_access_pointer(op->volume->servers) == op->server_list) {
267 op->error = -ENOMEDIUM;
274 clear_bit(AFS_VOLUME_OFFLINE, &op->volume->flags);
275 clear_bit(AFS_VOLUME_BUSY, &op->volume->flags);
276 op->error = afs_abort_to_error(op->ac.abort_code);
282 if (op->error != -EDESTADDRREQ)
292 op->error = error;
297 op->error = error;
303 afs_end_cursor(&op->ac);
304 op->server = NULL;
305 afs_put_serverlist(op->net, op->server_list);
306 op->server_list = NULL;
312 error = afs_check_volume_status(op->volume, op);
316 if (!afs_start_fs_iteration(op, vnode))
319 _debug("__ VOL %llx __", op->volume->vid);
322 _debug("pick [%lx]", op->untried);
324 error = afs_wait_for_fs_probes(op->server_list, op->untried);
331 if (op->server) {
332 _debug("server %u", op->index);
333 if (test_bit(op->index, &op->untried))
335 op->server = NULL;
339 op->index = -1;
341 for (i = 0; i < op->server_list->nr_servers; i++) {
342 struct afs_server *s = op->server_list->servers[i].server;
344 if (!test_bit(i, &op->untried) ||
348 op->index = i;
353 if (op->index == -1)
357 _debug("use %d", op->index);
358 __clear_bit(op->index, &op->untried);
364 ASSERTCMP(op->ac.alist, ==, NULL);
365 server = op->server_list->servers[op->index].server;
367 if (!afs_check_server_record(op, server))
372 op->flags |= AFS_OPERATION_RETRY_SERVER;
373 op->server = server;
388 memset(&op->ac, 0, sizeof(op->ac));
390 if (!op->ac.alist)
391 op->ac.alist = alist;
395 op->ac.index = -1;
398 ASSERT(op->ac.alist);
402 if (!afs_iterate_addresses(&op->ac))
406 op->index, op->ac.index, op->ac.alist->nr_addrs,
407 &op->ac.alist->addrs[op->ac.index].transport);
416 afs_probe_fileserver(op->net, op->server);
417 if (op->flags & AFS_OPERATION_RETRY_SERVER) {
418 alist = op->ac.alist;
420 op->server, !(op->flags & AFS_OPERATION_UNINTR));
423 op->flags &= ~AFS_OPERATION_RETRY_SERVER;
435 afs_end_cursor(&op->ac);
442 if (op->flags & AFS_OPERATION_VBUSY)
447 for (i = 0; i < op->server_list->nr_servers; i++) {
448 struct afs_server *s = op->server_list->servers[i].server;
457 op->error = error;
459 op->flags |= AFS_OPERATION_STOP;
460 afs_end_cursor(&op->ac);
461 _leave(" = f [failed %d]", op->error);
468 void afs_dump_edestaddrreq(const struct afs_operation *op)
481 op->file[0].cb_break_before,
482 op->file[1].cb_break_before, op->flags, op->error);
484 op->untried, op->index, op->nr_iterations);
486 if (op->server_list) {
487 const struct afs_server_list *sl = op->server_list;
503 if (a == op->ac.alist)
510 op->ac.tried, op->ac.index, op->ac.abort_code, op->ac.error,
511 op->ac.responded, op->ac.nr_iterations);