xref: /openbmc/linux/fs/nfs/delegation.c (revision e6f4c346)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * linux/fs/nfs/delegation.c
4  *
5  * Copyright (C) 2004 Trond Myklebust
6  *
7  * NFS file delegation management
8  *
9  */
10 #include <linux/completion.h>
11 #include <linux/kthread.h>
12 #include <linux/module.h>
13 #include <linux/sched.h>
14 #include <linux/slab.h>
15 #include <linux/spinlock.h>
16 #include <linux/iversion.h>
17 
18 #include <linux/nfs4.h>
19 #include <linux/nfs_fs.h>
20 #include <linux/nfs_xdr.h>
21 
22 #include "nfs4_fs.h"
23 #include "nfs4session.h"
24 #include "delegation.h"
25 #include "internal.h"
26 #include "nfs4trace.h"
27 
28 static void nfs_free_delegation(struct nfs_delegation *delegation)
29 {
30 	put_cred(delegation->cred);
31 	delegation->cred = NULL;
32 	kfree_rcu(delegation, rcu);
33 }
34 
35 /**
36  * nfs_mark_delegation_referenced - set delegation's REFERENCED flag
37  * @delegation: delegation to process
38  *
39  */
40 void nfs_mark_delegation_referenced(struct nfs_delegation *delegation)
41 {
42 	set_bit(NFS_DELEGATION_REFERENCED, &delegation->flags);
43 }
44 
45 static bool
46 nfs4_is_valid_delegation(const struct nfs_delegation *delegation,
47 		fmode_t flags)
48 {
49 	if (delegation != NULL && (delegation->type & flags) == flags &&
50 	    !test_bit(NFS_DELEGATION_REVOKED, &delegation->flags) &&
51 	    !test_bit(NFS_DELEGATION_RETURNING, &delegation->flags))
52 		return true;
53 	return false;
54 }
55 
56 static int
57 nfs4_do_check_delegation(struct inode *inode, fmode_t flags, bool mark)
58 {
59 	struct nfs_delegation *delegation;
60 	int ret = 0;
61 
62 	flags &= FMODE_READ|FMODE_WRITE;
63 	rcu_read_lock();
64 	delegation = rcu_dereference(NFS_I(inode)->delegation);
65 	if (nfs4_is_valid_delegation(delegation, flags)) {
66 		if (mark)
67 			nfs_mark_delegation_referenced(delegation);
68 		ret = 1;
69 	}
70 	rcu_read_unlock();
71 	return ret;
72 }
73 /**
74  * nfs_have_delegation - check if inode has a delegation, mark it
75  * NFS_DELEGATION_REFERENCED if there is one.
76  * @inode: inode to check
77  * @flags: delegation types to check for
78  *
79  * Returns one if inode has the indicated delegation, otherwise zero.
80  */
81 int nfs4_have_delegation(struct inode *inode, fmode_t flags)
82 {
83 	return nfs4_do_check_delegation(inode, flags, true);
84 }
85 
86 /*
87  * nfs4_check_delegation - check if inode has a delegation, do not mark
88  * NFS_DELEGATION_REFERENCED if it has one.
89  */
90 int nfs4_check_delegation(struct inode *inode, fmode_t flags)
91 {
92 	return nfs4_do_check_delegation(inode, flags, false);
93 }
94 
95 static int nfs_delegation_claim_locks(struct nfs4_state *state, const nfs4_stateid *stateid)
96 {
97 	struct inode *inode = state->inode;
98 	struct file_lock *fl;
99 	struct file_lock_context *flctx = inode->i_flctx;
100 	struct list_head *list;
101 	int status = 0;
102 
103 	if (flctx == NULL)
104 		goto out;
105 
106 	list = &flctx->flc_posix;
107 	spin_lock(&flctx->flc_lock);
108 restart:
109 	list_for_each_entry(fl, list, fl_list) {
110 		if (nfs_file_open_context(fl->fl_file)->state != state)
111 			continue;
112 		spin_unlock(&flctx->flc_lock);
113 		status = nfs4_lock_delegation_recall(fl, state, stateid);
114 		if (status < 0)
115 			goto out;
116 		spin_lock(&flctx->flc_lock);
117 	}
118 	if (list == &flctx->flc_posix) {
119 		list = &flctx->flc_flock;
120 		goto restart;
121 	}
122 	spin_unlock(&flctx->flc_lock);
123 out:
124 	return status;
125 }
126 
127 static int nfs_delegation_claim_opens(struct inode *inode,
128 		const nfs4_stateid *stateid, fmode_t type)
129 {
130 	struct nfs_inode *nfsi = NFS_I(inode);
131 	struct nfs_open_context *ctx;
132 	struct nfs4_state_owner *sp;
133 	struct nfs4_state *state;
134 	unsigned int seq;
135 	int err;
136 
137 again:
138 	rcu_read_lock();
139 	list_for_each_entry_rcu(ctx, &nfsi->open_files, list) {
140 		state = ctx->state;
141 		if (state == NULL)
142 			continue;
143 		if (!test_bit(NFS_DELEGATED_STATE, &state->flags))
144 			continue;
145 		if (!nfs4_valid_open_stateid(state))
146 			continue;
147 		if (!nfs4_stateid_match(&state->stateid, stateid))
148 			continue;
149 		if (!get_nfs_open_context(ctx))
150 			continue;
151 		rcu_read_unlock();
152 		sp = state->owner;
153 		/* Block nfs4_proc_unlck */
154 		mutex_lock(&sp->so_delegreturn_mutex);
155 		seq = raw_seqcount_begin(&sp->so_reclaim_seqcount);
156 		err = nfs4_open_delegation_recall(ctx, state, stateid);
157 		if (!err)
158 			err = nfs_delegation_claim_locks(state, stateid);
159 		if (!err && read_seqcount_retry(&sp->so_reclaim_seqcount, seq))
160 			err = -EAGAIN;
161 		mutex_unlock(&sp->so_delegreturn_mutex);
162 		put_nfs_open_context(ctx);
163 		if (err != 0)
164 			return err;
165 		goto again;
166 	}
167 	rcu_read_unlock();
168 	return 0;
169 }
170 
171 /**
172  * nfs_inode_reclaim_delegation - process a delegation reclaim request
173  * @inode: inode to process
174  * @cred: credential to use for request
175  * @type: delegation type
176  * @stateid: delegation stateid
177  * @pagemod_limit: write delegation "space_limit"
178  *
179  */
180 void nfs_inode_reclaim_delegation(struct inode *inode, const struct cred *cred,
181 				  fmode_t type,
182 				  const nfs4_stateid *stateid,
183 				  unsigned long pagemod_limit)
184 {
185 	struct nfs_delegation *delegation;
186 	const struct cred *oldcred = NULL;
187 
188 	rcu_read_lock();
189 	delegation = rcu_dereference(NFS_I(inode)->delegation);
190 	if (delegation != NULL) {
191 		spin_lock(&delegation->lock);
192 		if (delegation->inode != NULL) {
193 			nfs4_stateid_copy(&delegation->stateid, stateid);
194 			delegation->type = type;
195 			delegation->pagemod_limit = pagemod_limit;
196 			oldcred = delegation->cred;
197 			delegation->cred = get_cred(cred);
198 			clear_bit(NFS_DELEGATION_NEED_RECLAIM,
199 				  &delegation->flags);
200 			spin_unlock(&delegation->lock);
201 			rcu_read_unlock();
202 			put_cred(oldcred);
203 			trace_nfs4_reclaim_delegation(inode, type);
204 			return;
205 		}
206 		/* We appear to have raced with a delegation return. */
207 		spin_unlock(&delegation->lock);
208 	}
209 	rcu_read_unlock();
210 	nfs_inode_set_delegation(inode, cred, type, stateid, pagemod_limit);
211 }
212 
213 static int nfs_do_return_delegation(struct inode *inode, struct nfs_delegation *delegation, int issync)
214 {
215 	int res = 0;
216 
217 	if (!test_bit(NFS_DELEGATION_REVOKED, &delegation->flags))
218 		res = nfs4_proc_delegreturn(inode,
219 				delegation->cred,
220 				&delegation->stateid,
221 				issync);
222 	nfs_free_delegation(delegation);
223 	return res;
224 }
225 
226 static struct inode *nfs_delegation_grab_inode(struct nfs_delegation *delegation)
227 {
228 	struct inode *inode = NULL;
229 
230 	spin_lock(&delegation->lock);
231 	if (delegation->inode != NULL)
232 		inode = igrab(delegation->inode);
233 	if (!inode)
234 		set_bit(NFS_DELEGATION_INODE_FREEING, &delegation->flags);
235 	spin_unlock(&delegation->lock);
236 	return inode;
237 }
238 
239 static struct nfs_delegation *
240 nfs_start_delegation_return_locked(struct nfs_inode *nfsi)
241 {
242 	struct nfs_delegation *ret = NULL;
243 	struct nfs_delegation *delegation = rcu_dereference(nfsi->delegation);
244 
245 	if (delegation == NULL)
246 		goto out;
247 	spin_lock(&delegation->lock);
248 	if (!test_and_set_bit(NFS_DELEGATION_RETURNING, &delegation->flags))
249 		ret = delegation;
250 	spin_unlock(&delegation->lock);
251 out:
252 	return ret;
253 }
254 
255 static struct nfs_delegation *
256 nfs_start_delegation_return(struct nfs_inode *nfsi)
257 {
258 	struct nfs_delegation *delegation;
259 
260 	rcu_read_lock();
261 	delegation = nfs_start_delegation_return_locked(nfsi);
262 	rcu_read_unlock();
263 	return delegation;
264 }
265 
266 static void
267 nfs_abort_delegation_return(struct nfs_delegation *delegation,
268 		struct nfs_client *clp)
269 {
270 
271 	spin_lock(&delegation->lock);
272 	clear_bit(NFS_DELEGATION_RETURNING, &delegation->flags);
273 	set_bit(NFS_DELEGATION_RETURN, &delegation->flags);
274 	spin_unlock(&delegation->lock);
275 	set_bit(NFS4CLNT_DELEGRETURN, &clp->cl_state);
276 }
277 
278 static struct nfs_delegation *
279 nfs_detach_delegation_locked(struct nfs_inode *nfsi,
280 		struct nfs_delegation *delegation,
281 		struct nfs_client *clp)
282 {
283 	struct nfs_delegation *deleg_cur =
284 		rcu_dereference_protected(nfsi->delegation,
285 				lockdep_is_held(&clp->cl_lock));
286 
287 	if (deleg_cur == NULL || delegation != deleg_cur)
288 		return NULL;
289 
290 	spin_lock(&delegation->lock);
291 	set_bit(NFS_DELEGATION_RETURNING, &delegation->flags);
292 	list_del_rcu(&delegation->super_list);
293 	delegation->inode = NULL;
294 	rcu_assign_pointer(nfsi->delegation, NULL);
295 	spin_unlock(&delegation->lock);
296 	return delegation;
297 }
298 
299 static struct nfs_delegation *nfs_detach_delegation(struct nfs_inode *nfsi,
300 		struct nfs_delegation *delegation,
301 		struct nfs_server *server)
302 {
303 	struct nfs_client *clp = server->nfs_client;
304 
305 	spin_lock(&clp->cl_lock);
306 	delegation = nfs_detach_delegation_locked(nfsi, delegation, clp);
307 	spin_unlock(&clp->cl_lock);
308 	return delegation;
309 }
310 
311 static struct nfs_delegation *
312 nfs_inode_detach_delegation(struct inode *inode)
313 {
314 	struct nfs_inode *nfsi = NFS_I(inode);
315 	struct nfs_server *server = NFS_SERVER(inode);
316 	struct nfs_delegation *delegation;
317 
318 	delegation = nfs_start_delegation_return(nfsi);
319 	if (delegation == NULL)
320 		return NULL;
321 	return nfs_detach_delegation(nfsi, delegation, server);
322 }
323 
324 static void
325 nfs_update_inplace_delegation(struct nfs_delegation *delegation,
326 		const struct nfs_delegation *update)
327 {
328 	if (nfs4_stateid_is_newer(&update->stateid, &delegation->stateid)) {
329 		delegation->stateid.seqid = update->stateid.seqid;
330 		smp_wmb();
331 		delegation->type = update->type;
332 	}
333 }
334 
335 /**
336  * nfs_inode_set_delegation - set up a delegation on an inode
337  * @inode: inode to which delegation applies
338  * @cred: cred to use for subsequent delegation processing
339  * @type: delegation type
340  * @stateid: delegation stateid
341  * @pagemod_limit: write delegation "space_limit"
342  *
343  * Returns zero on success, or a negative errno value.
344  */
345 int nfs_inode_set_delegation(struct inode *inode, const struct cred *cred,
346 				  fmode_t type,
347 				  const nfs4_stateid *stateid,
348 				  unsigned long pagemod_limit)
349 {
350 	struct nfs_server *server = NFS_SERVER(inode);
351 	struct nfs_client *clp = server->nfs_client;
352 	struct nfs_inode *nfsi = NFS_I(inode);
353 	struct nfs_delegation *delegation, *old_delegation;
354 	struct nfs_delegation *freeme = NULL;
355 	int status = 0;
356 
357 	delegation = kmalloc(sizeof(*delegation), GFP_NOFS);
358 	if (delegation == NULL)
359 		return -ENOMEM;
360 	nfs4_stateid_copy(&delegation->stateid, stateid);
361 	delegation->type = type;
362 	delegation->pagemod_limit = pagemod_limit;
363 	delegation->change_attr = inode_peek_iversion_raw(inode);
364 	delegation->cred = get_cred(cred);
365 	delegation->inode = inode;
366 	delegation->flags = 1<<NFS_DELEGATION_REFERENCED;
367 	spin_lock_init(&delegation->lock);
368 
369 	spin_lock(&clp->cl_lock);
370 	old_delegation = rcu_dereference_protected(nfsi->delegation,
371 					lockdep_is_held(&clp->cl_lock));
372 	if (old_delegation != NULL) {
373 		/* Is this an update of the existing delegation? */
374 		if (nfs4_stateid_match_other(&old_delegation->stateid,
375 					&delegation->stateid)) {
376 			nfs_update_inplace_delegation(old_delegation,
377 					delegation);
378 			goto out;
379 		}
380 		/*
381 		 * Deal with broken servers that hand out two
382 		 * delegations for the same file.
383 		 * Allow for upgrades to a WRITE delegation, but
384 		 * nothing else.
385 		 */
386 		dfprintk(FILE, "%s: server %s handed out "
387 				"a duplicate delegation!\n",
388 				__func__, clp->cl_hostname);
389 		if (delegation->type == old_delegation->type ||
390 		    !(delegation->type & FMODE_WRITE)) {
391 			freeme = delegation;
392 			delegation = NULL;
393 			goto out;
394 		}
395 		if (test_and_set_bit(NFS_DELEGATION_RETURNING,
396 					&old_delegation->flags))
397 			goto out;
398 		freeme = nfs_detach_delegation_locked(nfsi,
399 				old_delegation, clp);
400 		if (freeme == NULL)
401 			goto out;
402 	}
403 	list_add_tail_rcu(&delegation->super_list, &server->delegations);
404 	rcu_assign_pointer(nfsi->delegation, delegation);
405 	delegation = NULL;
406 
407 	trace_nfs4_set_delegation(inode, type);
408 
409 	spin_lock(&inode->i_lock);
410 	if (NFS_I(inode)->cache_validity & (NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ATIME))
411 		NFS_I(inode)->cache_validity |= NFS_INO_REVAL_FORCED;
412 	spin_unlock(&inode->i_lock);
413 out:
414 	spin_unlock(&clp->cl_lock);
415 	if (delegation != NULL)
416 		nfs_free_delegation(delegation);
417 	if (freeme != NULL)
418 		nfs_do_return_delegation(inode, freeme, 0);
419 	return status;
420 }
421 
422 /*
423  * Basic procedure for returning a delegation to the server
424  */
425 static int nfs_end_delegation_return(struct inode *inode, struct nfs_delegation *delegation, int issync)
426 {
427 	struct nfs_client *clp = NFS_SERVER(inode)->nfs_client;
428 	struct nfs_inode *nfsi = NFS_I(inode);
429 	int err = 0;
430 
431 	if (delegation == NULL)
432 		return 0;
433 	do {
434 		if (test_bit(NFS_DELEGATION_REVOKED, &delegation->flags))
435 			break;
436 		err = nfs_delegation_claim_opens(inode, &delegation->stateid,
437 				delegation->type);
438 		if (!issync || err != -EAGAIN)
439 			break;
440 		/*
441 		 * Guard against state recovery
442 		 */
443 		err = nfs4_wait_clnt_recover(clp);
444 	} while (err == 0);
445 
446 	if (err) {
447 		nfs_abort_delegation_return(delegation, clp);
448 		goto out;
449 	}
450 	if (!nfs_detach_delegation(nfsi, delegation, NFS_SERVER(inode)))
451 		goto out;
452 
453 	err = nfs_do_return_delegation(inode, delegation, issync);
454 out:
455 	return err;
456 }
457 
458 static bool nfs_delegation_need_return(struct nfs_delegation *delegation)
459 {
460 	bool ret = false;
461 
462 	if (test_bit(NFS_DELEGATION_RETURNING, &delegation->flags))
463 		goto out;
464 	if (test_and_clear_bit(NFS_DELEGATION_RETURN, &delegation->flags))
465 		ret = true;
466 	if (test_and_clear_bit(NFS_DELEGATION_RETURN_IF_CLOSED, &delegation->flags) && !ret) {
467 		struct inode *inode;
468 
469 		spin_lock(&delegation->lock);
470 		inode = delegation->inode;
471 		if (inode && list_empty(&NFS_I(inode)->open_files))
472 			ret = true;
473 		spin_unlock(&delegation->lock);
474 	}
475 out:
476 	return ret;
477 }
478 
479 /**
480  * nfs_client_return_marked_delegations - return previously marked delegations
481  * @clp: nfs_client to process
482  *
483  * Note that this function is designed to be called by the state
484  * manager thread. For this reason, it cannot flush the dirty data,
485  * since that could deadlock in case of a state recovery error.
486  *
487  * Returns zero on success, or a negative errno value.
488  */
489 int nfs_client_return_marked_delegations(struct nfs_client *clp)
490 {
491 	struct nfs_delegation *delegation;
492 	struct nfs_delegation *prev;
493 	struct nfs_server *server;
494 	struct inode *inode;
495 	struct inode *place_holder = NULL;
496 	struct nfs_delegation *place_holder_deleg = NULL;
497 	int err = 0;
498 
499 restart:
500 	/*
501 	 * To avoid quadratic looping we hold a reference
502 	 * to an inode place_holder.  Each time we restart, we
503 	 * list nfs_servers from the server of that inode, and
504 	 * delegation in the server from the delegations of that
505 	 * inode.
506 	 * prev is an RCU-protected pointer to a delegation which
507 	 * wasn't marked for return and might be a good choice for
508 	 * the next place_holder.
509 	 */
510 	rcu_read_lock();
511 	prev = NULL;
512 	if (place_holder)
513 		server = NFS_SERVER(place_holder);
514 	else
515 		server = list_entry_rcu(clp->cl_superblocks.next,
516 					struct nfs_server, client_link);
517 	list_for_each_entry_from_rcu(server, &clp->cl_superblocks, client_link) {
518 		delegation = NULL;
519 		if (place_holder && server == NFS_SERVER(place_holder))
520 			delegation = rcu_dereference(NFS_I(place_holder)->delegation);
521 		if (!delegation || delegation != place_holder_deleg)
522 			delegation = list_entry_rcu(server->delegations.next,
523 						    struct nfs_delegation, super_list);
524 		list_for_each_entry_from_rcu(delegation, &server->delegations, super_list) {
525 			struct inode *to_put = NULL;
526 
527 			if (!nfs_delegation_need_return(delegation)) {
528 				prev = delegation;
529 				continue;
530 			}
531 			if (!nfs_sb_active(server->super))
532 				break; /* continue in outer loop */
533 
534 			if (prev) {
535 				struct inode *tmp;
536 
537 				tmp = nfs_delegation_grab_inode(prev);
538 				if (tmp) {
539 					to_put = place_holder;
540 					place_holder = tmp;
541 					place_holder_deleg = prev;
542 				}
543 			}
544 
545 			inode = nfs_delegation_grab_inode(delegation);
546 			if (inode == NULL) {
547 				rcu_read_unlock();
548 				if (to_put)
549 					iput(to_put);
550 				nfs_sb_deactive(server->super);
551 				goto restart;
552 			}
553 			delegation = nfs_start_delegation_return_locked(NFS_I(inode));
554 			rcu_read_unlock();
555 
556 			if (to_put)
557 				iput(to_put);
558 
559 			err = nfs_end_delegation_return(inode, delegation, 0);
560 			iput(inode);
561 			nfs_sb_deactive(server->super);
562 			cond_resched();
563 			if (!err)
564 				goto restart;
565 			set_bit(NFS4CLNT_DELEGRETURN, &clp->cl_state);
566 			if (place_holder)
567 				iput(place_holder);
568 			return err;
569 		}
570 	}
571 	rcu_read_unlock();
572 	if (place_holder)
573 		iput(place_holder);
574 	return 0;
575 }
576 
577 /**
578  * nfs_inode_return_delegation_noreclaim - return delegation, don't reclaim opens
579  * @inode: inode to process
580  *
581  * Does not protect against delegation reclaims, therefore really only safe
582  * to be called from nfs4_clear_inode().
583  */
584 void nfs_inode_return_delegation_noreclaim(struct inode *inode)
585 {
586 	struct nfs_delegation *delegation;
587 
588 	delegation = nfs_inode_detach_delegation(inode);
589 	if (delegation != NULL)
590 		nfs_do_return_delegation(inode, delegation, 1);
591 }
592 
593 /**
594  * nfs_inode_return_delegation - synchronously return a delegation
595  * @inode: inode to process
596  *
597  * This routine will always flush any dirty data to disk on the
598  * assumption that if we need to return the delegation, then
599  * we should stop caching.
600  *
601  * Returns zero on success, or a negative errno value.
602  */
603 int nfs4_inode_return_delegation(struct inode *inode)
604 {
605 	struct nfs_inode *nfsi = NFS_I(inode);
606 	struct nfs_delegation *delegation;
607 	int err = 0;
608 
609 	nfs_wb_all(inode);
610 	delegation = nfs_start_delegation_return(nfsi);
611 	if (delegation != NULL)
612 		err = nfs_end_delegation_return(inode, delegation, 1);
613 	return err;
614 }
615 
616 /**
617  * nfs4_inode_make_writeable
618  * @inode: pointer to inode
619  *
620  * Make the inode writeable by returning the delegation if necessary
621  *
622  * Returns zero on success, or a negative errno value.
623  */
624 int nfs4_inode_make_writeable(struct inode *inode)
625 {
626 	if (!nfs4_has_session(NFS_SERVER(inode)->nfs_client) ||
627 	    !nfs4_check_delegation(inode, FMODE_WRITE))
628 		return nfs4_inode_return_delegation(inode);
629 	return 0;
630 }
631 
632 static void nfs_mark_return_if_closed_delegation(struct nfs_server *server,
633 		struct nfs_delegation *delegation)
634 {
635 	set_bit(NFS_DELEGATION_RETURN_IF_CLOSED, &delegation->flags);
636 	set_bit(NFS4CLNT_DELEGRETURN, &server->nfs_client->cl_state);
637 }
638 
639 static void nfs_mark_return_delegation(struct nfs_server *server,
640 		struct nfs_delegation *delegation)
641 {
642 	set_bit(NFS_DELEGATION_RETURN, &delegation->flags);
643 	set_bit(NFS4CLNT_DELEGRETURN, &server->nfs_client->cl_state);
644 }
645 
646 static bool nfs_server_mark_return_all_delegations(struct nfs_server *server)
647 {
648 	struct nfs_delegation *delegation;
649 	bool ret = false;
650 
651 	list_for_each_entry_rcu(delegation, &server->delegations, super_list) {
652 		nfs_mark_return_delegation(server, delegation);
653 		ret = true;
654 	}
655 	return ret;
656 }
657 
658 static void nfs_client_mark_return_all_delegations(struct nfs_client *clp)
659 {
660 	struct nfs_server *server;
661 
662 	rcu_read_lock();
663 	list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link)
664 		nfs_server_mark_return_all_delegations(server);
665 	rcu_read_unlock();
666 }
667 
668 static void nfs_delegation_run_state_manager(struct nfs_client *clp)
669 {
670 	if (test_bit(NFS4CLNT_DELEGRETURN, &clp->cl_state))
671 		nfs4_schedule_state_manager(clp);
672 }
673 
674 /**
675  * nfs_expire_all_delegations
676  * @clp: client to process
677  *
678  */
679 void nfs_expire_all_delegations(struct nfs_client *clp)
680 {
681 	nfs_client_mark_return_all_delegations(clp);
682 	nfs_delegation_run_state_manager(clp);
683 }
684 
685 /**
686  * nfs_super_return_all_delegations - return delegations for one superblock
687  * @server: pointer to nfs_server to process
688  *
689  */
690 void nfs_server_return_all_delegations(struct nfs_server *server)
691 {
692 	struct nfs_client *clp = server->nfs_client;
693 	bool need_wait;
694 
695 	if (clp == NULL)
696 		return;
697 
698 	rcu_read_lock();
699 	need_wait = nfs_server_mark_return_all_delegations(server);
700 	rcu_read_unlock();
701 
702 	if (need_wait) {
703 		nfs4_schedule_state_manager(clp);
704 		nfs4_wait_clnt_recover(clp);
705 	}
706 }
707 
708 static void nfs_mark_return_unused_delegation_types(struct nfs_server *server,
709 						 fmode_t flags)
710 {
711 	struct nfs_delegation *delegation;
712 
713 	list_for_each_entry_rcu(delegation, &server->delegations, super_list) {
714 		if ((delegation->type == (FMODE_READ|FMODE_WRITE)) && !(flags & FMODE_WRITE))
715 			continue;
716 		if (delegation->type & flags)
717 			nfs_mark_return_if_closed_delegation(server, delegation);
718 	}
719 }
720 
721 static void nfs_client_mark_return_unused_delegation_types(struct nfs_client *clp,
722 							fmode_t flags)
723 {
724 	struct nfs_server *server;
725 
726 	rcu_read_lock();
727 	list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link)
728 		nfs_mark_return_unused_delegation_types(server, flags);
729 	rcu_read_unlock();
730 }
731 
732 static void nfs_mark_delegation_revoked(struct nfs_server *server,
733 		struct nfs_delegation *delegation)
734 {
735 	set_bit(NFS_DELEGATION_REVOKED, &delegation->flags);
736 	delegation->stateid.type = NFS4_INVALID_STATEID_TYPE;
737 	nfs_mark_return_delegation(server, delegation);
738 }
739 
740 static bool nfs_revoke_delegation(struct inode *inode,
741 		const nfs4_stateid *stateid)
742 {
743 	struct nfs_delegation *delegation;
744 	nfs4_stateid tmp;
745 	bool ret = false;
746 
747 	rcu_read_lock();
748 	delegation = rcu_dereference(NFS_I(inode)->delegation);
749 	if (delegation == NULL)
750 		goto out;
751 	if (stateid == NULL) {
752 		nfs4_stateid_copy(&tmp, &delegation->stateid);
753 		stateid = &tmp;
754 	} else if (!nfs4_stateid_match(stateid, &delegation->stateid))
755 		goto out;
756 	nfs_mark_delegation_revoked(NFS_SERVER(inode), delegation);
757 	ret = true;
758 out:
759 	rcu_read_unlock();
760 	if (ret)
761 		nfs_inode_find_state_and_recover(inode, stateid);
762 	return ret;
763 }
764 
765 void nfs_remove_bad_delegation(struct inode *inode,
766 		const nfs4_stateid *stateid)
767 {
768 	struct nfs_delegation *delegation;
769 
770 	if (!nfs_revoke_delegation(inode, stateid))
771 		return;
772 	delegation = nfs_inode_detach_delegation(inode);
773 	if (delegation)
774 		nfs_free_delegation(delegation);
775 }
776 EXPORT_SYMBOL_GPL(nfs_remove_bad_delegation);
777 
778 /**
779  * nfs_expire_unused_delegation_types
780  * @clp: client to process
781  * @flags: delegation types to expire
782  *
783  */
784 void nfs_expire_unused_delegation_types(struct nfs_client *clp, fmode_t flags)
785 {
786 	nfs_client_mark_return_unused_delegation_types(clp, flags);
787 	nfs_delegation_run_state_manager(clp);
788 }
789 
790 static void nfs_mark_return_unreferenced_delegations(struct nfs_server *server)
791 {
792 	struct nfs_delegation *delegation;
793 
794 	list_for_each_entry_rcu(delegation, &server->delegations, super_list) {
795 		if (test_and_clear_bit(NFS_DELEGATION_REFERENCED, &delegation->flags))
796 			continue;
797 		nfs_mark_return_if_closed_delegation(server, delegation);
798 	}
799 }
800 
801 /**
802  * nfs_expire_unreferenced_delegations - Eliminate unused delegations
803  * @clp: nfs_client to process
804  *
805  */
806 void nfs_expire_unreferenced_delegations(struct nfs_client *clp)
807 {
808 	struct nfs_server *server;
809 
810 	rcu_read_lock();
811 	list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link)
812 		nfs_mark_return_unreferenced_delegations(server);
813 	rcu_read_unlock();
814 
815 	nfs_delegation_run_state_manager(clp);
816 }
817 
818 /**
819  * nfs_async_inode_return_delegation - asynchronously return a delegation
820  * @inode: inode to process
821  * @stateid: state ID information
822  *
823  * Returns zero on success, or a negative errno value.
824  */
825 int nfs_async_inode_return_delegation(struct inode *inode,
826 				      const nfs4_stateid *stateid)
827 {
828 	struct nfs_server *server = NFS_SERVER(inode);
829 	struct nfs_client *clp = server->nfs_client;
830 	struct nfs_delegation *delegation;
831 
832 	rcu_read_lock();
833 	delegation = rcu_dereference(NFS_I(inode)->delegation);
834 	if (delegation == NULL)
835 		goto out_enoent;
836 	if (stateid != NULL &&
837 	    !clp->cl_mvops->match_stateid(&delegation->stateid, stateid))
838 		goto out_enoent;
839 	nfs_mark_return_delegation(server, delegation);
840 	rcu_read_unlock();
841 
842 	nfs_delegation_run_state_manager(clp);
843 	return 0;
844 out_enoent:
845 	rcu_read_unlock();
846 	return -ENOENT;
847 }
848 
849 static struct inode *
850 nfs_delegation_find_inode_server(struct nfs_server *server,
851 				 const struct nfs_fh *fhandle)
852 {
853 	struct nfs_delegation *delegation;
854 	struct inode *freeme, *res = NULL;
855 
856 	list_for_each_entry_rcu(delegation, &server->delegations, super_list) {
857 		spin_lock(&delegation->lock);
858 		if (delegation->inode != NULL &&
859 		    nfs_compare_fh(fhandle, &NFS_I(delegation->inode)->fh) == 0) {
860 			freeme = igrab(delegation->inode);
861 			if (freeme && nfs_sb_active(freeme->i_sb))
862 				res = freeme;
863 			spin_unlock(&delegation->lock);
864 			if (res != NULL)
865 				return res;
866 			if (freeme) {
867 				rcu_read_unlock();
868 				iput(freeme);
869 				rcu_read_lock();
870 			}
871 			return ERR_PTR(-EAGAIN);
872 		}
873 		spin_unlock(&delegation->lock);
874 	}
875 	return ERR_PTR(-ENOENT);
876 }
877 
878 /**
879  * nfs_delegation_find_inode - retrieve the inode associated with a delegation
880  * @clp: client state handle
881  * @fhandle: filehandle from a delegation recall
882  *
883  * Returns pointer to inode matching "fhandle," or NULL if a matching inode
884  * cannot be found.
885  */
886 struct inode *nfs_delegation_find_inode(struct nfs_client *clp,
887 					const struct nfs_fh *fhandle)
888 {
889 	struct nfs_server *server;
890 	struct inode *res;
891 
892 	rcu_read_lock();
893 	list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) {
894 		res = nfs_delegation_find_inode_server(server, fhandle);
895 		if (res != ERR_PTR(-ENOENT)) {
896 			rcu_read_unlock();
897 			return res;
898 		}
899 	}
900 	rcu_read_unlock();
901 	return ERR_PTR(-ENOENT);
902 }
903 
904 static void nfs_delegation_mark_reclaim_server(struct nfs_server *server)
905 {
906 	struct nfs_delegation *delegation;
907 
908 	list_for_each_entry_rcu(delegation, &server->delegations, super_list) {
909 		/*
910 		 * If the delegation may have been admin revoked, then we
911 		 * cannot reclaim it.
912 		 */
913 		if (test_bit(NFS_DELEGATION_TEST_EXPIRED, &delegation->flags))
914 			continue;
915 		set_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags);
916 	}
917 }
918 
919 /**
920  * nfs_delegation_mark_reclaim - mark all delegations as needing to be reclaimed
921  * @clp: nfs_client to process
922  *
923  */
924 void nfs_delegation_mark_reclaim(struct nfs_client *clp)
925 {
926 	struct nfs_server *server;
927 
928 	rcu_read_lock();
929 	list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link)
930 		nfs_delegation_mark_reclaim_server(server);
931 	rcu_read_unlock();
932 }
933 
934 /**
935  * nfs_delegation_reap_unclaimed - reap unclaimed delegations after reboot recovery is done
936  * @clp: nfs_client to process
937  *
938  */
939 void nfs_delegation_reap_unclaimed(struct nfs_client *clp)
940 {
941 	struct nfs_delegation *delegation;
942 	struct nfs_server *server;
943 	struct inode *inode;
944 
945 restart:
946 	rcu_read_lock();
947 	list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) {
948 		list_for_each_entry_rcu(delegation, &server->delegations,
949 								super_list) {
950 			if (test_bit(NFS_DELEGATION_INODE_FREEING,
951 						&delegation->flags) ||
952 			    test_bit(NFS_DELEGATION_RETURNING,
953 						&delegation->flags) ||
954 			    test_bit(NFS_DELEGATION_NEED_RECLAIM,
955 						&delegation->flags) == 0)
956 				continue;
957 			if (!nfs_sb_active(server->super))
958 				break; /* continue in outer loop */
959 			inode = nfs_delegation_grab_inode(delegation);
960 			if (inode == NULL) {
961 				rcu_read_unlock();
962 				nfs_sb_deactive(server->super);
963 				goto restart;
964 			}
965 			delegation = nfs_start_delegation_return_locked(NFS_I(inode));
966 			rcu_read_unlock();
967 			if (delegation != NULL) {
968 				delegation = nfs_detach_delegation(NFS_I(inode),
969 					delegation, server);
970 				if (delegation != NULL)
971 					nfs_free_delegation(delegation);
972 			}
973 			iput(inode);
974 			nfs_sb_deactive(server->super);
975 			cond_resched();
976 			goto restart;
977 		}
978 	}
979 	rcu_read_unlock();
980 }
981 
982 static inline bool nfs4_server_rebooted(const struct nfs_client *clp)
983 {
984 	return (clp->cl_state & (BIT(NFS4CLNT_CHECK_LEASE) |
985 				BIT(NFS4CLNT_LEASE_EXPIRED) |
986 				BIT(NFS4CLNT_SESSION_RESET))) != 0;
987 }
988 
989 static void nfs_mark_test_expired_delegation(struct nfs_server *server,
990 	    struct nfs_delegation *delegation)
991 {
992 	if (delegation->stateid.type == NFS4_INVALID_STATEID_TYPE)
993 		return;
994 	clear_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags);
995 	set_bit(NFS_DELEGATION_TEST_EXPIRED, &delegation->flags);
996 	set_bit(NFS4CLNT_DELEGATION_EXPIRED, &server->nfs_client->cl_state);
997 }
998 
999 static void nfs_inode_mark_test_expired_delegation(struct nfs_server *server,
1000 		struct inode *inode)
1001 {
1002 	struct nfs_delegation *delegation;
1003 
1004 	rcu_read_lock();
1005 	delegation = rcu_dereference(NFS_I(inode)->delegation);
1006 	if (delegation)
1007 		nfs_mark_test_expired_delegation(server, delegation);
1008 	rcu_read_unlock();
1009 
1010 }
1011 
1012 static void nfs_delegation_mark_test_expired_server(struct nfs_server *server)
1013 {
1014 	struct nfs_delegation *delegation;
1015 
1016 	list_for_each_entry_rcu(delegation, &server->delegations, super_list)
1017 		nfs_mark_test_expired_delegation(server, delegation);
1018 }
1019 
1020 /**
1021  * nfs_mark_test_expired_all_delegations - mark all delegations for testing
1022  * @clp: nfs_client to process
1023  *
1024  * Iterates through all the delegations associated with this server and
1025  * marks them as needing to be checked for validity.
1026  */
1027 void nfs_mark_test_expired_all_delegations(struct nfs_client *clp)
1028 {
1029 	struct nfs_server *server;
1030 
1031 	rcu_read_lock();
1032 	list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link)
1033 		nfs_delegation_mark_test_expired_server(server);
1034 	rcu_read_unlock();
1035 }
1036 
1037 /**
1038  * nfs_test_expired_all_delegations - test all delegations for a client
1039  * @clp: nfs_client to process
1040  *
1041  * Helper for handling "recallable state revoked" status from server.
1042  */
1043 void nfs_test_expired_all_delegations(struct nfs_client *clp)
1044 {
1045 	nfs_mark_test_expired_all_delegations(clp);
1046 	nfs4_schedule_state_manager(clp);
1047 }
1048 
1049 static void
1050 nfs_delegation_test_free_expired(struct inode *inode,
1051 		nfs4_stateid *stateid,
1052 		const struct cred *cred)
1053 {
1054 	struct nfs_server *server = NFS_SERVER(inode);
1055 	const struct nfs4_minor_version_ops *ops = server->nfs_client->cl_mvops;
1056 	int status;
1057 
1058 	if (!cred)
1059 		return;
1060 	status = ops->test_and_free_expired(server, stateid, cred);
1061 	if (status == -NFS4ERR_EXPIRED || status == -NFS4ERR_BAD_STATEID)
1062 		nfs_remove_bad_delegation(inode, stateid);
1063 }
1064 
1065 /**
1066  * nfs_reap_expired_delegations - reap expired delegations
1067  * @clp: nfs_client to process
1068  *
1069  * Iterates through all the delegations associated with this server and
1070  * checks if they have may have been revoked. This function is usually
1071  * expected to be called in cases where the server may have lost its
1072  * lease.
1073  */
1074 void nfs_reap_expired_delegations(struct nfs_client *clp)
1075 {
1076 	struct nfs_delegation *delegation;
1077 	struct nfs_server *server;
1078 	struct inode *inode;
1079 	const struct cred *cred;
1080 	nfs4_stateid stateid;
1081 
1082 restart:
1083 	rcu_read_lock();
1084 	list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) {
1085 		list_for_each_entry_rcu(delegation, &server->delegations,
1086 								super_list) {
1087 			if (test_bit(NFS_DELEGATION_INODE_FREEING,
1088 						&delegation->flags) ||
1089 			    test_bit(NFS_DELEGATION_RETURNING,
1090 						&delegation->flags) ||
1091 			    test_bit(NFS_DELEGATION_TEST_EXPIRED,
1092 						&delegation->flags) == 0)
1093 				continue;
1094 			if (!nfs_sb_active(server->super))
1095 				break; /* continue in outer loop */
1096 			inode = nfs_delegation_grab_inode(delegation);
1097 			if (inode == NULL) {
1098 				rcu_read_unlock();
1099 				nfs_sb_deactive(server->super);
1100 				goto restart;
1101 			}
1102 			cred = get_cred_rcu(delegation->cred);
1103 			nfs4_stateid_copy(&stateid, &delegation->stateid);
1104 			clear_bit(NFS_DELEGATION_TEST_EXPIRED, &delegation->flags);
1105 			rcu_read_unlock();
1106 			nfs_delegation_test_free_expired(inode, &stateid, cred);
1107 			put_cred(cred);
1108 			if (nfs4_server_rebooted(clp)) {
1109 				nfs_inode_mark_test_expired_delegation(server,inode);
1110 				iput(inode);
1111 				nfs_sb_deactive(server->super);
1112 				return;
1113 			}
1114 			iput(inode);
1115 			nfs_sb_deactive(server->super);
1116 			cond_resched();
1117 			goto restart;
1118 		}
1119 	}
1120 	rcu_read_unlock();
1121 }
1122 
1123 void nfs_inode_find_delegation_state_and_recover(struct inode *inode,
1124 		const nfs4_stateid *stateid)
1125 {
1126 	struct nfs_client *clp = NFS_SERVER(inode)->nfs_client;
1127 	struct nfs_delegation *delegation;
1128 	bool found = false;
1129 
1130 	rcu_read_lock();
1131 	delegation = rcu_dereference(NFS_I(inode)->delegation);
1132 	if (delegation &&
1133 	    nfs4_stateid_match_other(&delegation->stateid, stateid)) {
1134 		nfs_mark_test_expired_delegation(NFS_SERVER(inode), delegation);
1135 		found = true;
1136 	}
1137 	rcu_read_unlock();
1138 	if (found)
1139 		nfs4_schedule_state_manager(clp);
1140 }
1141 
1142 /**
1143  * nfs_delegations_present - check for existence of delegations
1144  * @clp: client state handle
1145  *
1146  * Returns one if there are any nfs_delegation structures attached
1147  * to this nfs_client.
1148  */
1149 int nfs_delegations_present(struct nfs_client *clp)
1150 {
1151 	struct nfs_server *server;
1152 	int ret = 0;
1153 
1154 	rcu_read_lock();
1155 	list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link)
1156 		if (!list_empty(&server->delegations)) {
1157 			ret = 1;
1158 			break;
1159 		}
1160 	rcu_read_unlock();
1161 	return ret;
1162 }
1163 
1164 /**
1165  * nfs4_refresh_delegation_stateid - Update delegation stateid seqid
1166  * @dst: stateid to refresh
1167  * @inode: inode to check
1168  *
1169  * Returns "true" and updates "dst->seqid" * if inode had a delegation
1170  * that matches our delegation stateid. Otherwise "false" is returned.
1171  */
1172 bool nfs4_refresh_delegation_stateid(nfs4_stateid *dst, struct inode *inode)
1173 {
1174 	struct nfs_delegation *delegation;
1175 	bool ret = false;
1176 	if (!inode)
1177 		goto out;
1178 
1179 	rcu_read_lock();
1180 	delegation = rcu_dereference(NFS_I(inode)->delegation);
1181 	if (delegation != NULL &&
1182 	    nfs4_stateid_match_other(dst, &delegation->stateid)) {
1183 		dst->seqid = delegation->stateid.seqid;
1184 		return ret;
1185 	}
1186 	rcu_read_unlock();
1187 out:
1188 	return ret;
1189 }
1190 
1191 /**
1192  * nfs4_copy_delegation_stateid - Copy inode's state ID information
1193  * @inode: inode to check
1194  * @flags: delegation type requirement
1195  * @dst: stateid data structure to fill in
1196  * @cred: optional argument to retrieve credential
1197  *
1198  * Returns "true" and fills in "dst->data" * if inode had a delegation,
1199  * otherwise "false" is returned.
1200  */
1201 bool nfs4_copy_delegation_stateid(struct inode *inode, fmode_t flags,
1202 		nfs4_stateid *dst, const struct cred **cred)
1203 {
1204 	struct nfs_inode *nfsi = NFS_I(inode);
1205 	struct nfs_delegation *delegation;
1206 	bool ret;
1207 
1208 	flags &= FMODE_READ|FMODE_WRITE;
1209 	rcu_read_lock();
1210 	delegation = rcu_dereference(nfsi->delegation);
1211 	ret = nfs4_is_valid_delegation(delegation, flags);
1212 	if (ret) {
1213 		nfs4_stateid_copy(dst, &delegation->stateid);
1214 		nfs_mark_delegation_referenced(delegation);
1215 		if (cred)
1216 			*cred = get_cred(delegation->cred);
1217 	}
1218 	rcu_read_unlock();
1219 	return ret;
1220 }
1221 
1222 /**
1223  * nfs4_delegation_flush_on_close - Check if we must flush file on close
1224  * @inode: inode to check
1225  *
1226  * This function checks the number of outstanding writes to the file
1227  * against the delegation 'space_limit' field to see if
1228  * the spec requires us to flush the file on close.
1229  */
1230 bool nfs4_delegation_flush_on_close(const struct inode *inode)
1231 {
1232 	struct nfs_inode *nfsi = NFS_I(inode);
1233 	struct nfs_delegation *delegation;
1234 	bool ret = true;
1235 
1236 	rcu_read_lock();
1237 	delegation = rcu_dereference(nfsi->delegation);
1238 	if (delegation == NULL || !(delegation->type & FMODE_WRITE))
1239 		goto out;
1240 	if (atomic_long_read(&nfsi->nrequests) < delegation->pagemod_limit)
1241 		ret = false;
1242 out:
1243 	rcu_read_unlock();
1244 	return ret;
1245 }
1246