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