Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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) }