Linux Audio

Check our new training course

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