^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /* Handle fileserver selection and rotation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (C) 2017 Red Hat, Inc. All Rights Reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Written by David Howells (dhowells@redhat.com)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/sched.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/sched/signal.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include "internal.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include "afs_fs.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * Begin iteration through a server list, starting with the vnode's last used
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) * server if possible, or the last recorded good server if not.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) static bool afs_start_fs_iteration(struct afs_operation *op,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) struct afs_vnode *vnode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) struct afs_server *server;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) void *cb_server;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) read_lock(&op->volume->servers_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) op->server_list = afs_get_serverlist(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) rcu_dereference_protected(op->volume->servers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) lockdep_is_held(&op->volume->servers_lock)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) read_unlock(&op->volume->servers_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) op->untried = (1UL << op->server_list->nr_servers) - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) op->index = READ_ONCE(op->server_list->preferred);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) cb_server = vnode->cb_server;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) if (cb_server) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) /* See if the vnode's preferred record is still available */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) for (i = 0; i < op->server_list->nr_servers; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) server = op->server_list->servers[i].server;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) if (server == cb_server) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) op->index = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) goto found_interest;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) /* If we have a lock outstanding on a server that's no longer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) * serving this vnode, then we can't switch to another server
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) * and have to return an error.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) if (op->flags & AFS_OPERATION_CUR_ONLY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) op->error = -ESTALE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) /* Note that the callback promise is effectively broken */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) write_seqlock(&vnode->cb_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) ASSERTCMP(cb_server, ==, vnode->cb_server);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) vnode->cb_server = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) if (test_and_clear_bit(AFS_VNODE_CB_PROMISED, &vnode->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) vnode->cb_break++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) write_sequnlock(&vnode->cb_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) found_interest:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) * Post volume busy note.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) static void afs_busy(struct afs_volume *volume, u32 abort_code)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) const char *m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) switch (abort_code) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) case VOFFLINE: m = "offline"; break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) case VRESTARTING: m = "restarting"; break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) case VSALVAGING: m = "being salvaged"; break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) default: m = "busy"; break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) pr_notice("kAFS: Volume %llu '%s' is %s\n", volume->vid, volume->name, m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) * Sleep and retry the operation to the same fileserver.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) static bool afs_sleep_and_retry(struct afs_operation *op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) if (!(op->flags & AFS_OPERATION_UNINTR)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) msleep_interruptible(1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) if (signal_pending(current)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) op->error = -ERESTARTSYS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) msleep(1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) * Select the fileserver to use. May be called multiple times to rotate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) * through the fileservers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) bool afs_select_fileserver(struct afs_operation *op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) struct afs_addr_list *alist;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) struct afs_server *server;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) struct afs_vnode *vnode = op->file[0].vnode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) struct afs_error e;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) u32 rtt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) int error = op->ac.error, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) _enter("%lx[%d],%lx[%d],%d,%d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) op->untried, op->index,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) op->ac.tried, op->ac.index,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) error, op->ac.abort_code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) if (op->flags & AFS_OPERATION_STOP) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) _leave(" = f [stopped]");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) op->nr_iterations++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) /* Evaluate the result of the previous operation, if there was one. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) switch (error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) case SHRT_MAX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) goto start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) /* Success or local failure. Stop. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) op->error = error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) op->flags |= AFS_OPERATION_STOP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) _leave(" = f [okay/local %d]", error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) case -ECONNABORTED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) /* The far side rejected the operation on some grounds. This
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) * might involve the server being busy or the volume having been moved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) switch (op->ac.abort_code) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) case VNOVOL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) /* This fileserver doesn't know about the volume.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) * - May indicate that the VL is wrong - retry once and compare
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) * the results.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) * - May indicate that the fileserver couldn't attach to the vol.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) if (op->flags & AFS_OPERATION_VNOVOL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) op->error = -EREMOTEIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) goto next_server;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) write_lock(&op->volume->servers_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) op->server_list->vnovol_mask |= 1 << op->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) write_unlock(&op->volume->servers_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) set_bit(AFS_VOLUME_NEEDS_UPDATE, &op->volume->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) error = afs_check_volume_status(op->volume, op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) if (error < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) goto failed_set_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) if (test_bit(AFS_VOLUME_DELETED, &op->volume->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) op->error = -ENOMEDIUM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) goto failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) /* If the server list didn't change, then assume that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) * it's the fileserver having trouble.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) if (rcu_access_pointer(op->volume->servers) == op->server_list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) op->error = -EREMOTEIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) goto next_server;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) /* Try again */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) op->flags |= AFS_OPERATION_VNOVOL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) _leave(" = t [vnovol]");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) case VSALVAGE: /* TODO: Should this return an error or iterate? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) case VVOLEXISTS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) case VNOSERVICE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) case VONLINE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) case VDISKFULL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) case VOVERQUOTA:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) op->error = afs_abort_to_error(op->ac.abort_code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) goto next_server;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) case VOFFLINE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) if (!test_and_set_bit(AFS_VOLUME_OFFLINE, &op->volume->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) afs_busy(op->volume, op->ac.abort_code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) clear_bit(AFS_VOLUME_BUSY, &op->volume->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) if (op->flags & AFS_OPERATION_NO_VSLEEP) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) op->error = -EADV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) goto failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) if (op->flags & AFS_OPERATION_CUR_ONLY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) op->error = -ESTALE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) goto failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) goto busy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) case VSALVAGING:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) case VRESTARTING:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) case VBUSY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) /* Retry after going round all the servers unless we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) * have a file lock we need to maintain.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) if (op->flags & AFS_OPERATION_NO_VSLEEP) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) op->error = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) goto failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) if (!test_and_set_bit(AFS_VOLUME_BUSY, &op->volume->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) afs_busy(op->volume, op->ac.abort_code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) clear_bit(AFS_VOLUME_OFFLINE, &op->volume->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) busy:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) if (op->flags & AFS_OPERATION_CUR_ONLY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) if (!afs_sleep_and_retry(op))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) goto failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) /* Retry with same server & address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) _leave(" = t [vbusy]");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) op->flags |= AFS_OPERATION_VBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) goto next_server;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) case VMOVED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) /* The volume migrated to another server. We consider
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) * consider all locks and callbacks broken and request
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) * an update from the VLDB.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) * We also limit the number of VMOVED hops we will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) * honour, just in case someone sets up a loop.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) if (op->flags & AFS_OPERATION_VMOVED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) op->error = -EREMOTEIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) goto failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) op->flags |= AFS_OPERATION_VMOVED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) set_bit(AFS_VOLUME_WAIT, &op->volume->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) set_bit(AFS_VOLUME_NEEDS_UPDATE, &op->volume->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) error = afs_check_volume_status(op->volume, op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) if (error < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) goto failed_set_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) /* If the server list didn't change, then the VLDB is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) * out of sync with the fileservers. This is hopefully
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) * a temporary condition, however, so we don't want to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) * permanently block access to the file.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) * TODO: Try other fileservers if we can.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) * TODO: Retry a few times with sleeps.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) if (rcu_access_pointer(op->volume->servers) == op->server_list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) op->error = -ENOMEDIUM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) goto failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) goto restart_from_beginning;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) clear_bit(AFS_VOLUME_OFFLINE, &op->volume->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) clear_bit(AFS_VOLUME_BUSY, &op->volume->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) op->error = afs_abort_to_error(op->ac.abort_code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) goto failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) case -ETIMEDOUT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) case -ETIME:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) if (op->error != -EDESTADDRREQ)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) goto iterate_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) case -ERFKILL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) case -EADDRNOTAVAIL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) case -ENETUNREACH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) case -EHOSTUNREACH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) case -EHOSTDOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) case -ECONNREFUSED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) _debug("no conn");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) op->error = error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) goto iterate_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) case -ECONNRESET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) _debug("call reset");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) op->error = error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) goto failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) restart_from_beginning:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) _debug("restart");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) afs_end_cursor(&op->ac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) op->server = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) afs_put_serverlist(op->net, op->server_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) op->server_list = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) start:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) _debug("start");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) /* See if we need to do an update of the volume record. Note that the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) * volume may have moved or even have been deleted.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) error = afs_check_volume_status(op->volume, op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) if (error < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) goto failed_set_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) if (!afs_start_fs_iteration(op, vnode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) goto failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) _debug("__ VOL %llx __", op->volume->vid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) pick_server:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) _debug("pick [%lx]", op->untried);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) error = afs_wait_for_fs_probes(op->server_list, op->untried);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) if (error < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) goto failed_set_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) /* Pick the untried server with the lowest RTT. If we have outstanding
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) * callbacks, we stick with the server we're already using if we can.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) if (op->server) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) _debug("server %u", op->index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) if (test_bit(op->index, &op->untried))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) goto selected_server;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) op->server = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) _debug("no server");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) op->index = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) rtt = U32_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) for (i = 0; i < op->server_list->nr_servers; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) struct afs_server *s = op->server_list->servers[i].server;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) if (!test_bit(i, &op->untried) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) !test_bit(AFS_SERVER_FL_RESPONDING, &s->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) if (s->probe.rtt < rtt) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) op->index = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) rtt = s->probe.rtt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) if (op->index == -1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) goto no_more_servers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) selected_server:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) _debug("use %d", op->index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) __clear_bit(op->index, &op->untried);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) /* We're starting on a different fileserver from the list. We need to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) * check it, create a callback intercept, find its address list and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) * probe its capabilities before we use it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) ASSERTCMP(op->ac.alist, ==, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) server = op->server_list->servers[op->index].server;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) if (!afs_check_server_record(op, server))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) goto failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) _debug("USING SERVER: %pU", &server->uuid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) op->flags |= AFS_OPERATION_RETRY_SERVER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) op->server = server;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) if (vnode->cb_server != server) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) vnode->cb_server = server;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) vnode->cb_s_break = server->cb_s_break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) vnode->cb_v_break = vnode->volume->cb_v_break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) clear_bit(AFS_VNODE_CB_PROMISED, &vnode->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) read_lock(&server->fs_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) alist = rcu_dereference_protected(server->addresses,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) lockdep_is_held(&server->fs_lock));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) afs_get_addrlist(alist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) read_unlock(&server->fs_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) retry_server:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) memset(&op->ac, 0, sizeof(op->ac));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) if (!op->ac.alist)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) op->ac.alist = alist;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) afs_put_addrlist(alist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) op->ac.index = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) iterate_address:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) ASSERT(op->ac.alist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) /* Iterate over the current server's address list to try and find an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) * address on which it will respond to us.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) if (!afs_iterate_addresses(&op->ac))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) goto out_of_addresses;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) _debug("address [%u] %u/%u %pISp",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) op->index, op->ac.index, op->ac.alist->nr_addrs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) &op->ac.alist->addrs[op->ac.index].transport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) _leave(" = t");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) out_of_addresses:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) /* We've now had a failure to respond on all of a server's addresses -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) * immediately probe them again and consider retrying the server.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) afs_probe_fileserver(op->net, op->server);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) if (op->flags & AFS_OPERATION_RETRY_SERVER) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) alist = op->ac.alist;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) error = afs_wait_for_one_fs_probe(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) op->server, !(op->flags & AFS_OPERATION_UNINTR));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) switch (error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) op->flags &= ~AFS_OPERATION_RETRY_SERVER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) goto retry_server;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) case -ERESTARTSYS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) goto failed_set_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) case -ETIME:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) case -EDESTADDRREQ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) goto next_server;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) next_server:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) _debug("next");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) afs_end_cursor(&op->ac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) goto pick_server;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) no_more_servers:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) /* That's all the servers poked to no good effect. Try again if some
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) * of them were busy.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) if (op->flags & AFS_OPERATION_VBUSY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) goto restart_from_beginning;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) e.error = -EDESTADDRREQ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) e.responded = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) for (i = 0; i < op->server_list->nr_servers; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) struct afs_server *s = op->server_list->servers[i].server;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) afs_prioritise_error(&e, READ_ONCE(s->probe.error),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) s->probe.abort_code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) error = e.error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) failed_set_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) op->error = error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) failed:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) op->flags |= AFS_OPERATION_STOP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) afs_end_cursor(&op->ac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) _leave(" = f [failed %d]", op->error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) * Dump cursor state in the case of the error being EDESTADDRREQ.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) void afs_dump_edestaddrreq(const struct afs_operation *op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) static int count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) if (!IS_ENABLED(CONFIG_AFS_DEBUG_CURSOR) || count > 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) pr_notice("EDESTADDR occurred\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) pr_notice("FC: cbb=%x cbb2=%x fl=%x err=%hd\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) op->file[0].cb_break_before,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) op->file[1].cb_break_before, op->flags, op->error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) pr_notice("FC: ut=%lx ix=%d ni=%u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) op->untried, op->index, op->nr_iterations);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) if (op->server_list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) const struct afs_server_list *sl = op->server_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) pr_notice("FC: SL nr=%u pr=%u vnov=%hx\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) sl->nr_servers, sl->preferred, sl->vnovol_mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) for (i = 0; i < sl->nr_servers; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) const struct afs_server *s = sl->servers[i].server;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) pr_notice("FC: server fl=%lx av=%u %pU\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) s->flags, s->addr_version, &s->uuid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) if (s->addresses) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) const struct afs_addr_list *a =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) rcu_dereference(s->addresses);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) pr_notice("FC: - av=%u nr=%u/%u/%u pr=%u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) a->version,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) a->nr_ipv4, a->nr_addrs, a->max_addrs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) a->preferred);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) pr_notice("FC: - R=%lx F=%lx\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) a->responded, a->failed);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) if (a == op->ac.alist)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) pr_notice("FC: - current\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) pr_notice("AC: t=%lx ax=%u ac=%d er=%d r=%u ni=%u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) op->ac.tried, op->ac.index, op->ac.abort_code, op->ac.error,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) op->ac.responded, op->ac.nr_iterations);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) }