1 // SPDX-License-Identifier: GPL-2.0-only
3 * linux/fs/nfs/delegation.c
5 * Copyright (C) 2004 Trond Myklebust
7 * NFS file delegation management
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>
18 #include <linux/nfs4.h>
19 #include <linux/nfs_fs.h>
20 #include <linux/nfs_xdr.h>
23 #include "nfs4session.h"
24 #include "delegation.h"
26 #include "nfs4trace.h"
28 #define NFS_DEFAULT_DELEGATION_WATERMARK (5000U)
30 static atomic_long_t nfs_active_delegations
;
31 static unsigned nfs_delegation_watermark
= NFS_DEFAULT_DELEGATION_WATERMARK
;
33 static void __nfs_free_delegation(struct nfs_delegation
*delegation
)
35 put_cred(delegation
->cred
);
36 delegation
->cred
= NULL
;
37 kfree_rcu(delegation
, rcu
);
40 static void nfs_mark_delegation_revoked(struct nfs_delegation
*delegation
)
42 if (!test_and_set_bit(NFS_DELEGATION_REVOKED
, &delegation
->flags
)) {
43 delegation
->stateid
.type
= NFS4_INVALID_STATEID_TYPE
;
44 atomic_long_dec(&nfs_active_delegations
);
45 if (!test_bit(NFS_DELEGATION_RETURNING
, &delegation
->flags
))
46 nfs_clear_verifier_delegated(delegation
->inode
);
50 static struct nfs_delegation
*nfs_get_delegation(struct nfs_delegation
*delegation
)
52 refcount_inc(&delegation
->refcount
);
56 static void nfs_put_delegation(struct nfs_delegation
*delegation
)
58 if (refcount_dec_and_test(&delegation
->refcount
))
59 __nfs_free_delegation(delegation
);
62 static void nfs_free_delegation(struct nfs_delegation
*delegation
)
64 nfs_mark_delegation_revoked(delegation
);
65 nfs_put_delegation(delegation
);
69 * nfs_mark_delegation_referenced - set delegation's REFERENCED flag
70 * @delegation: delegation to process
73 void nfs_mark_delegation_referenced(struct nfs_delegation
*delegation
)
75 set_bit(NFS_DELEGATION_REFERENCED
, &delegation
->flags
);
79 nfs4_is_valid_delegation(const struct nfs_delegation
*delegation
,
82 if (delegation
!= NULL
&& (delegation
->type
& flags
) == flags
&&
83 !test_bit(NFS_DELEGATION_REVOKED
, &delegation
->flags
) &&
84 !test_bit(NFS_DELEGATION_RETURNING
, &delegation
->flags
))
89 struct nfs_delegation
*nfs4_get_valid_delegation(const struct inode
*inode
)
91 struct nfs_delegation
*delegation
;
93 delegation
= rcu_dereference(NFS_I(inode
)->delegation
);
94 if (nfs4_is_valid_delegation(delegation
, 0))
100 nfs4_do_check_delegation(struct inode
*inode
, fmode_t flags
, bool mark
)
102 struct nfs_delegation
*delegation
;
105 flags
&= FMODE_READ
|FMODE_WRITE
;
107 delegation
= rcu_dereference(NFS_I(inode
)->delegation
);
108 if (nfs4_is_valid_delegation(delegation
, flags
)) {
110 nfs_mark_delegation_referenced(delegation
);
117 * nfs_have_delegation - check if inode has a delegation, mark it
118 * NFS_DELEGATION_REFERENCED if there is one.
119 * @inode: inode to check
120 * @flags: delegation types to check for
122 * Returns one if inode has the indicated delegation, otherwise zero.
124 int nfs4_have_delegation(struct inode
*inode
, fmode_t flags
)
126 return nfs4_do_check_delegation(inode
, flags
, true);
130 * nfs4_check_delegation - check if inode has a delegation, do not mark
131 * NFS_DELEGATION_REFERENCED if it has one.
133 int nfs4_check_delegation(struct inode
*inode
, fmode_t flags
)
135 return nfs4_do_check_delegation(inode
, flags
, false);
138 static int nfs_delegation_claim_locks(struct nfs4_state
*state
, const nfs4_stateid
*stateid
)
140 struct inode
*inode
= state
->inode
;
141 struct file_lock
*fl
;
142 struct file_lock_context
*flctx
= inode
->i_flctx
;
143 struct list_head
*list
;
149 list
= &flctx
->flc_posix
;
150 spin_lock(&flctx
->flc_lock
);
152 list_for_each_entry(fl
, list
, fl_list
) {
153 if (nfs_file_open_context(fl
->fl_file
)->state
!= state
)
155 spin_unlock(&flctx
->flc_lock
);
156 status
= nfs4_lock_delegation_recall(fl
, state
, stateid
);
159 spin_lock(&flctx
->flc_lock
);
161 if (list
== &flctx
->flc_posix
) {
162 list
= &flctx
->flc_flock
;
165 spin_unlock(&flctx
->flc_lock
);
170 static int nfs_delegation_claim_opens(struct inode
*inode
,
171 const nfs4_stateid
*stateid
, fmode_t type
)
173 struct nfs_inode
*nfsi
= NFS_I(inode
);
174 struct nfs_open_context
*ctx
;
175 struct nfs4_state_owner
*sp
;
176 struct nfs4_state
*state
;
182 list_for_each_entry_rcu(ctx
, &nfsi
->open_files
, list
) {
186 if (!test_bit(NFS_DELEGATED_STATE
, &state
->flags
))
188 if (!nfs4_valid_open_stateid(state
))
190 if (!nfs4_stateid_match(&state
->stateid
, stateid
))
192 if (!get_nfs_open_context(ctx
))
196 /* Block nfs4_proc_unlck */
197 mutex_lock(&sp
->so_delegreturn_mutex
);
198 seq
= raw_seqcount_begin(&sp
->so_reclaim_seqcount
);
199 err
= nfs4_open_delegation_recall(ctx
, state
, stateid
);
201 err
= nfs_delegation_claim_locks(state
, stateid
);
202 if (!err
&& read_seqcount_retry(&sp
->so_reclaim_seqcount
, seq
))
204 mutex_unlock(&sp
->so_delegreturn_mutex
);
205 put_nfs_open_context(ctx
);
215 * nfs_inode_reclaim_delegation - process a delegation reclaim request
216 * @inode: inode to process
217 * @cred: credential to use for request
218 * @type: delegation type
219 * @stateid: delegation stateid
220 * @pagemod_limit: write delegation "space_limit"
223 void nfs_inode_reclaim_delegation(struct inode
*inode
, const struct cred
*cred
,
225 const nfs4_stateid
*stateid
,
226 unsigned long pagemod_limit
)
228 struct nfs_delegation
*delegation
;
229 const struct cred
*oldcred
= NULL
;
232 delegation
= rcu_dereference(NFS_I(inode
)->delegation
);
233 if (delegation
!= NULL
) {
234 spin_lock(&delegation
->lock
);
235 if (nfs4_is_valid_delegation(delegation
, 0)) {
236 nfs4_stateid_copy(&delegation
->stateid
, stateid
);
237 delegation
->type
= type
;
238 delegation
->pagemod_limit
= pagemod_limit
;
239 oldcred
= delegation
->cred
;
240 delegation
->cred
= get_cred(cred
);
241 clear_bit(NFS_DELEGATION_NEED_RECLAIM
,
243 spin_unlock(&delegation
->lock
);
246 trace_nfs4_reclaim_delegation(inode
, type
);
249 /* We appear to have raced with a delegation return. */
250 spin_unlock(&delegation
->lock
);
253 nfs_inode_set_delegation(inode
, cred
, type
, stateid
, pagemod_limit
);
256 static int nfs_do_return_delegation(struct inode
*inode
, struct nfs_delegation
*delegation
, int issync
)
258 const struct cred
*cred
;
261 if (!test_bit(NFS_DELEGATION_REVOKED
, &delegation
->flags
)) {
262 spin_lock(&delegation
->lock
);
263 cred
= get_cred(delegation
->cred
);
264 spin_unlock(&delegation
->lock
);
265 res
= nfs4_proc_delegreturn(inode
, cred
,
266 &delegation
->stateid
,
273 static struct inode
*nfs_delegation_grab_inode(struct nfs_delegation
*delegation
)
275 struct inode
*inode
= NULL
;
277 spin_lock(&delegation
->lock
);
278 if (delegation
->inode
!= NULL
)
279 inode
= igrab(delegation
->inode
);
281 set_bit(NFS_DELEGATION_INODE_FREEING
, &delegation
->flags
);
282 spin_unlock(&delegation
->lock
);
286 static struct nfs_delegation
*
287 nfs_start_delegation_return_locked(struct nfs_inode
*nfsi
)
289 struct nfs_delegation
*ret
= NULL
;
290 struct nfs_delegation
*delegation
= rcu_dereference(nfsi
->delegation
);
292 if (delegation
== NULL
)
294 spin_lock(&delegation
->lock
);
295 if (!test_and_set_bit(NFS_DELEGATION_RETURNING
, &delegation
->flags
)) {
296 /* Refcount matched in nfs_end_delegation_return() */
297 ret
= nfs_get_delegation(delegation
);
299 spin_unlock(&delegation
->lock
);
301 nfs_clear_verifier_delegated(&nfsi
->vfs_inode
);
306 static struct nfs_delegation
*
307 nfs_start_delegation_return(struct nfs_inode
*nfsi
)
309 struct nfs_delegation
*delegation
;
312 delegation
= nfs_start_delegation_return_locked(nfsi
);
318 nfs_abort_delegation_return(struct nfs_delegation
*delegation
,
319 struct nfs_client
*clp
)
322 spin_lock(&delegation
->lock
);
323 clear_bit(NFS_DELEGATION_RETURNING
, &delegation
->flags
);
324 set_bit(NFS_DELEGATION_RETURN
, &delegation
->flags
);
325 spin_unlock(&delegation
->lock
);
326 set_bit(NFS4CLNT_DELEGRETURN
, &clp
->cl_state
);
329 static struct nfs_delegation
*
330 nfs_detach_delegation_locked(struct nfs_inode
*nfsi
,
331 struct nfs_delegation
*delegation
,
332 struct nfs_client
*clp
)
334 struct nfs_delegation
*deleg_cur
=
335 rcu_dereference_protected(nfsi
->delegation
,
336 lockdep_is_held(&clp
->cl_lock
));
338 if (deleg_cur
== NULL
|| delegation
!= deleg_cur
)
341 spin_lock(&delegation
->lock
);
342 if (!delegation
->inode
) {
343 spin_unlock(&delegation
->lock
);
346 list_del_rcu(&delegation
->super_list
);
347 delegation
->inode
= NULL
;
348 rcu_assign_pointer(nfsi
->delegation
, NULL
);
349 spin_unlock(&delegation
->lock
);
353 static struct nfs_delegation
*nfs_detach_delegation(struct nfs_inode
*nfsi
,
354 struct nfs_delegation
*delegation
,
355 struct nfs_server
*server
)
357 struct nfs_client
*clp
= server
->nfs_client
;
359 spin_lock(&clp
->cl_lock
);
360 delegation
= nfs_detach_delegation_locked(nfsi
, delegation
, clp
);
361 spin_unlock(&clp
->cl_lock
);
365 static struct nfs_delegation
*
366 nfs_inode_detach_delegation(struct inode
*inode
)
368 struct nfs_inode
*nfsi
= NFS_I(inode
);
369 struct nfs_server
*server
= NFS_SERVER(inode
);
370 struct nfs_delegation
*delegation
;
373 delegation
= rcu_dereference(nfsi
->delegation
);
374 if (delegation
!= NULL
)
375 delegation
= nfs_detach_delegation(nfsi
, delegation
, server
);
381 nfs_update_delegation_cred(struct nfs_delegation
*delegation
,
382 const struct cred
*cred
)
384 const struct cred
*old
;
386 if (cred_fscmp(delegation
->cred
, cred
) != 0) {
387 old
= xchg(&delegation
->cred
, get_cred(cred
));
393 nfs_update_inplace_delegation(struct nfs_delegation
*delegation
,
394 const struct nfs_delegation
*update
)
396 if (nfs4_stateid_is_newer(&update
->stateid
, &delegation
->stateid
)) {
397 delegation
->stateid
.seqid
= update
->stateid
.seqid
;
399 delegation
->type
= update
->type
;
400 delegation
->pagemod_limit
= update
->pagemod_limit
;
401 if (test_bit(NFS_DELEGATION_REVOKED
, &delegation
->flags
)) {
402 delegation
->change_attr
= update
->change_attr
;
403 nfs_update_delegation_cred(delegation
, update
->cred
);
404 /* smp_mb__before_atomic() is implicit due to xchg() */
405 clear_bit(NFS_DELEGATION_REVOKED
, &delegation
->flags
);
406 atomic_long_inc(&nfs_active_delegations
);
412 * nfs_inode_set_delegation - set up a delegation on an inode
413 * @inode: inode to which delegation applies
414 * @cred: cred to use for subsequent delegation processing
415 * @type: delegation type
416 * @stateid: delegation stateid
417 * @pagemod_limit: write delegation "space_limit"
419 * Returns zero on success, or a negative errno value.
421 int nfs_inode_set_delegation(struct inode
*inode
, const struct cred
*cred
,
423 const nfs4_stateid
*stateid
,
424 unsigned long pagemod_limit
)
426 struct nfs_server
*server
= NFS_SERVER(inode
);
427 struct nfs_client
*clp
= server
->nfs_client
;
428 struct nfs_inode
*nfsi
= NFS_I(inode
);
429 struct nfs_delegation
*delegation
, *old_delegation
;
430 struct nfs_delegation
*freeme
= NULL
;
433 delegation
= kmalloc(sizeof(*delegation
), GFP_NOFS
);
434 if (delegation
== NULL
)
436 nfs4_stateid_copy(&delegation
->stateid
, stateid
);
437 refcount_set(&delegation
->refcount
, 1);
438 delegation
->type
= type
;
439 delegation
->pagemod_limit
= pagemod_limit
;
440 delegation
->change_attr
= inode_peek_iversion_raw(inode
);
441 delegation
->cred
= get_cred(cred
);
442 delegation
->inode
= inode
;
443 delegation
->flags
= 1<<NFS_DELEGATION_REFERENCED
;
444 spin_lock_init(&delegation
->lock
);
446 spin_lock(&clp
->cl_lock
);
447 old_delegation
= rcu_dereference_protected(nfsi
->delegation
,
448 lockdep_is_held(&clp
->cl_lock
));
449 if (old_delegation
== NULL
)
451 /* Is this an update of the existing delegation? */
452 if (nfs4_stateid_match_other(&old_delegation
->stateid
,
453 &delegation
->stateid
)) {
454 spin_lock(&old_delegation
->lock
);
455 nfs_update_inplace_delegation(old_delegation
,
457 spin_unlock(&old_delegation
->lock
);
460 if (!test_bit(NFS_DELEGATION_REVOKED
, &old_delegation
->flags
)) {
462 * Deal with broken servers that hand out two
463 * delegations for the same file.
464 * Allow for upgrades to a WRITE delegation, but
467 dfprintk(FILE, "%s: server %s handed out "
468 "a duplicate delegation!\n",
469 __func__
, clp
->cl_hostname
);
470 if (delegation
->type
== old_delegation
->type
||
471 !(delegation
->type
& FMODE_WRITE
)) {
476 if (test_and_set_bit(NFS_DELEGATION_RETURNING
,
477 &old_delegation
->flags
))
480 freeme
= nfs_detach_delegation_locked(nfsi
, old_delegation
, clp
);
484 list_add_tail_rcu(&delegation
->super_list
, &server
->delegations
);
485 rcu_assign_pointer(nfsi
->delegation
, delegation
);
488 atomic_long_inc(&nfs_active_delegations
);
490 trace_nfs4_set_delegation(inode
, type
);
492 spin_lock(&inode
->i_lock
);
493 if (NFS_I(inode
)->cache_validity
& (NFS_INO_INVALID_ATTR
|NFS_INO_INVALID_ATIME
))
494 NFS_I(inode
)->cache_validity
|= NFS_INO_REVAL_FORCED
;
495 spin_unlock(&inode
->i_lock
);
497 spin_unlock(&clp
->cl_lock
);
498 if (delegation
!= NULL
)
499 __nfs_free_delegation(delegation
);
500 if (freeme
!= NULL
) {
501 nfs_do_return_delegation(inode
, freeme
, 0);
502 nfs_free_delegation(freeme
);
508 * Basic procedure for returning a delegation to the server
510 static int nfs_end_delegation_return(struct inode
*inode
, struct nfs_delegation
*delegation
, int issync
)
512 struct nfs_client
*clp
= NFS_SERVER(inode
)->nfs_client
;
515 if (delegation
== NULL
)
518 if (test_bit(NFS_DELEGATION_REVOKED
, &delegation
->flags
))
520 err
= nfs_delegation_claim_opens(inode
, &delegation
->stateid
,
522 if (!issync
|| err
!= -EAGAIN
)
525 * Guard against state recovery
527 err
= nfs4_wait_clnt_recover(clp
);
531 nfs_abort_delegation_return(delegation
, clp
);
535 err
= nfs_do_return_delegation(inode
, delegation
, issync
);
537 /* Refcount matched in nfs_start_delegation_return_locked() */
538 nfs_put_delegation(delegation
);
542 static bool nfs_delegation_need_return(struct nfs_delegation
*delegation
)
546 if (test_and_clear_bit(NFS_DELEGATION_RETURN
, &delegation
->flags
))
548 else if (test_bit(NFS_DELEGATION_RETURN_IF_CLOSED
, &delegation
->flags
)) {
551 spin_lock(&delegation
->lock
);
552 inode
= delegation
->inode
;
553 if (inode
&& list_empty(&NFS_I(inode
)->open_files
))
555 spin_unlock(&delegation
->lock
);
558 clear_bit(NFS_DELEGATION_RETURN_IF_CLOSED
, &delegation
->flags
);
559 if (test_bit(NFS_DELEGATION_RETURNING
, &delegation
->flags
) ||
560 test_bit(NFS_DELEGATION_REVOKED
, &delegation
->flags
))
566 static int nfs_server_return_marked_delegations(struct nfs_server
*server
,
567 void __always_unused
*data
)
569 struct nfs_delegation
*delegation
;
570 struct nfs_delegation
*prev
;
572 struct inode
*place_holder
= NULL
;
573 struct nfs_delegation
*place_holder_deleg
= NULL
;
578 * To avoid quadratic looping we hold a reference
579 * to an inode place_holder. Each time we restart, we
580 * list delegation in the server from the delegations
582 * prev is an RCU-protected pointer to a delegation which
583 * wasn't marked for return and might be a good choice for
584 * the next place_holder.
590 delegation
= rcu_dereference(NFS_I(place_holder
)->delegation
);
591 if (!delegation
|| delegation
!= place_holder_deleg
)
592 delegation
= list_entry_rcu(server
->delegations
.next
,
593 struct nfs_delegation
, super_list
);
594 list_for_each_entry_from_rcu(delegation
, &server
->delegations
, super_list
) {
595 struct inode
*to_put
= NULL
;
597 if (test_bit(NFS_DELEGATION_INODE_FREEING
, &delegation
->flags
))
599 if (!nfs_delegation_need_return(delegation
)) {
600 if (nfs4_is_valid_delegation(delegation
, 0))
606 struct inode
*tmp
= nfs_delegation_grab_inode(prev
);
608 to_put
= place_holder
;
610 place_holder_deleg
= prev
;
614 inode
= nfs_delegation_grab_inode(delegation
);
620 delegation
= nfs_start_delegation_return_locked(NFS_I(inode
));
625 err
= nfs_end_delegation_return(inode
, delegation
, 0);
630 set_bit(NFS4CLNT_DELEGRETURN
, &server
->nfs_client
->cl_state
);
640 * nfs_client_return_marked_delegations - return previously marked delegations
641 * @clp: nfs_client to process
643 * Note that this function is designed to be called by the state
644 * manager thread. For this reason, it cannot flush the dirty data,
645 * since that could deadlock in case of a state recovery error.
647 * Returns zero on success, or a negative errno value.
649 int nfs_client_return_marked_delegations(struct nfs_client
*clp
)
651 return nfs_client_for_each_server(clp
,
652 nfs_server_return_marked_delegations
, NULL
);
656 * nfs_inode_evict_delegation - return delegation, don't reclaim opens
657 * @inode: inode to process
659 * Does not protect against delegation reclaims, therefore really only safe
660 * to be called from nfs4_clear_inode(). Guaranteed to always free
661 * the delegation structure.
663 void nfs_inode_evict_delegation(struct inode
*inode
)
665 struct nfs_delegation
*delegation
;
667 delegation
= nfs_inode_detach_delegation(inode
);
668 if (delegation
!= NULL
) {
669 set_bit(NFS_DELEGATION_RETURNING
, &delegation
->flags
);
670 set_bit(NFS_DELEGATION_INODE_FREEING
, &delegation
->flags
);
671 nfs_do_return_delegation(inode
, delegation
, 1);
672 nfs_free_delegation(delegation
);
677 * nfs_inode_return_delegation - synchronously return a delegation
678 * @inode: inode to process
680 * This routine will always flush any dirty data to disk on the
681 * assumption that if we need to return the delegation, then
682 * we should stop caching.
684 * Returns zero on success, or a negative errno value.
686 int nfs4_inode_return_delegation(struct inode
*inode
)
688 struct nfs_inode
*nfsi
= NFS_I(inode
);
689 struct nfs_delegation
*delegation
;
693 delegation
= nfs_start_delegation_return(nfsi
);
694 if (delegation
!= NULL
)
695 err
= nfs_end_delegation_return(inode
, delegation
, 1);
700 * nfs_inode_return_delegation_on_close - asynchronously return a delegation
701 * @inode: inode to process
703 * This routine is called on file close in order to determine if the
704 * inode delegation needs to be returned immediately.
706 void nfs4_inode_return_delegation_on_close(struct inode
*inode
)
708 struct nfs_delegation
*delegation
;
709 struct nfs_delegation
*ret
= NULL
;
714 delegation
= nfs4_get_valid_delegation(inode
);
717 if (test_bit(NFS_DELEGATION_RETURN_IF_CLOSED
, &delegation
->flags
) ||
718 atomic_long_read(&nfs_active_delegations
) >= nfs_delegation_watermark
) {
719 spin_lock(&delegation
->lock
);
720 if (delegation
->inode
&&
721 list_empty(&NFS_I(inode
)->open_files
) &&
722 !test_and_set_bit(NFS_DELEGATION_RETURNING
, &delegation
->flags
)) {
723 clear_bit(NFS_DELEGATION_RETURN_IF_CLOSED
, &delegation
->flags
);
724 /* Refcount matched in nfs_end_delegation_return() */
725 ret
= nfs_get_delegation(delegation
);
727 spin_unlock(&delegation
->lock
);
729 nfs_clear_verifier_delegated(inode
);
733 nfs_end_delegation_return(inode
, ret
, 0);
737 * nfs4_inode_make_writeable
738 * @inode: pointer to inode
740 * Make the inode writeable by returning the delegation if necessary
742 * Returns zero on success, or a negative errno value.
744 int nfs4_inode_make_writeable(struct inode
*inode
)
746 struct nfs_delegation
*delegation
;
749 delegation
= nfs4_get_valid_delegation(inode
);
750 if (delegation
== NULL
||
751 (nfs4_has_session(NFS_SERVER(inode
)->nfs_client
) &&
752 (delegation
->type
& FMODE_WRITE
))) {
757 return nfs4_inode_return_delegation(inode
);
760 static void nfs_mark_return_if_closed_delegation(struct nfs_server
*server
,
761 struct nfs_delegation
*delegation
)
763 set_bit(NFS_DELEGATION_RETURN_IF_CLOSED
, &delegation
->flags
);
764 set_bit(NFS4CLNT_DELEGRETURN
, &server
->nfs_client
->cl_state
);
767 static void nfs_mark_return_delegation(struct nfs_server
*server
,
768 struct nfs_delegation
*delegation
)
770 set_bit(NFS_DELEGATION_RETURN
, &delegation
->flags
);
771 set_bit(NFS4CLNT_DELEGRETURN
, &server
->nfs_client
->cl_state
);
774 static bool nfs_server_mark_return_all_delegations(struct nfs_server
*server
)
776 struct nfs_delegation
*delegation
;
779 list_for_each_entry_rcu(delegation
, &server
->delegations
, super_list
) {
780 nfs_mark_return_delegation(server
, delegation
);
786 static void nfs_client_mark_return_all_delegations(struct nfs_client
*clp
)
788 struct nfs_server
*server
;
791 list_for_each_entry_rcu(server
, &clp
->cl_superblocks
, client_link
)
792 nfs_server_mark_return_all_delegations(server
);
796 static void nfs_delegation_run_state_manager(struct nfs_client
*clp
)
798 if (test_bit(NFS4CLNT_DELEGRETURN
, &clp
->cl_state
))
799 nfs4_schedule_state_manager(clp
);
803 * nfs_expire_all_delegations
804 * @clp: client to process
807 void nfs_expire_all_delegations(struct nfs_client
*clp
)
809 nfs_client_mark_return_all_delegations(clp
);
810 nfs_delegation_run_state_manager(clp
);
814 * nfs_super_return_all_delegations - return delegations for one superblock
815 * @server: pointer to nfs_server to process
818 void nfs_server_return_all_delegations(struct nfs_server
*server
)
820 struct nfs_client
*clp
= server
->nfs_client
;
827 need_wait
= nfs_server_mark_return_all_delegations(server
);
831 nfs4_schedule_state_manager(clp
);
832 nfs4_wait_clnt_recover(clp
);
836 static void nfs_mark_return_unused_delegation_types(struct nfs_server
*server
,
839 struct nfs_delegation
*delegation
;
841 list_for_each_entry_rcu(delegation
, &server
->delegations
, super_list
) {
842 if ((delegation
->type
== (FMODE_READ
|FMODE_WRITE
)) && !(flags
& FMODE_WRITE
))
844 if (delegation
->type
& flags
)
845 nfs_mark_return_if_closed_delegation(server
, delegation
);
849 static void nfs_client_mark_return_unused_delegation_types(struct nfs_client
*clp
,
852 struct nfs_server
*server
;
855 list_for_each_entry_rcu(server
, &clp
->cl_superblocks
, client_link
)
856 nfs_mark_return_unused_delegation_types(server
, flags
);
860 static void nfs_revoke_delegation(struct inode
*inode
,
861 const nfs4_stateid
*stateid
)
863 struct nfs_delegation
*delegation
;
868 delegation
= rcu_dereference(NFS_I(inode
)->delegation
);
869 if (delegation
== NULL
)
871 if (stateid
== NULL
) {
872 nfs4_stateid_copy(&tmp
, &delegation
->stateid
);
875 if (!nfs4_stateid_match_other(stateid
, &delegation
->stateid
))
877 spin_lock(&delegation
->lock
);
878 if (stateid
->seqid
) {
879 if (nfs4_stateid_is_newer(&delegation
->stateid
, stateid
)) {
880 spin_unlock(&delegation
->lock
);
883 delegation
->stateid
.seqid
= stateid
->seqid
;
885 spin_unlock(&delegation
->lock
);
887 nfs_mark_delegation_revoked(delegation
);
892 nfs_inode_find_state_and_recover(inode
, stateid
);
895 void nfs_remove_bad_delegation(struct inode
*inode
,
896 const nfs4_stateid
*stateid
)
898 nfs_revoke_delegation(inode
, stateid
);
900 EXPORT_SYMBOL_GPL(nfs_remove_bad_delegation
);
902 void nfs_delegation_mark_returned(struct inode
*inode
,
903 const nfs4_stateid
*stateid
)
905 struct nfs_delegation
*delegation
;
911 delegation
= rcu_dereference(NFS_I(inode
)->delegation
);
915 spin_lock(&delegation
->lock
);
916 if (!nfs4_stateid_match_other(stateid
, &delegation
->stateid
))
917 goto out_spin_unlock
;
918 if (stateid
->seqid
) {
919 /* If delegation->stateid is newer, dont mark as returned */
920 if (nfs4_stateid_is_newer(&delegation
->stateid
, stateid
))
921 goto out_clear_returning
;
922 if (delegation
->stateid
.seqid
!= stateid
->seqid
)
923 delegation
->stateid
.seqid
= stateid
->seqid
;
926 nfs_mark_delegation_revoked(delegation
);
929 clear_bit(NFS_DELEGATION_RETURNING
, &delegation
->flags
);
931 spin_unlock(&delegation
->lock
);
935 nfs_inode_find_state_and_recover(inode
, stateid
);
939 * nfs_expire_unused_delegation_types
940 * @clp: client to process
941 * @flags: delegation types to expire
944 void nfs_expire_unused_delegation_types(struct nfs_client
*clp
, fmode_t flags
)
946 nfs_client_mark_return_unused_delegation_types(clp
, flags
);
947 nfs_delegation_run_state_manager(clp
);
950 static void nfs_mark_return_unreferenced_delegations(struct nfs_server
*server
)
952 struct nfs_delegation
*delegation
;
954 list_for_each_entry_rcu(delegation
, &server
->delegations
, super_list
) {
955 if (test_and_clear_bit(NFS_DELEGATION_REFERENCED
, &delegation
->flags
))
957 nfs_mark_return_if_closed_delegation(server
, delegation
);
962 * nfs_expire_unreferenced_delegations - Eliminate unused delegations
963 * @clp: nfs_client to process
966 void nfs_expire_unreferenced_delegations(struct nfs_client
*clp
)
968 struct nfs_server
*server
;
971 list_for_each_entry_rcu(server
, &clp
->cl_superblocks
, client_link
)
972 nfs_mark_return_unreferenced_delegations(server
);
975 nfs_delegation_run_state_manager(clp
);
979 * nfs_async_inode_return_delegation - asynchronously return a delegation
980 * @inode: inode to process
981 * @stateid: state ID information
983 * Returns zero on success, or a negative errno value.
985 int nfs_async_inode_return_delegation(struct inode
*inode
,
986 const nfs4_stateid
*stateid
)
988 struct nfs_server
*server
= NFS_SERVER(inode
);
989 struct nfs_client
*clp
= server
->nfs_client
;
990 struct nfs_delegation
*delegation
;
993 delegation
= nfs4_get_valid_delegation(inode
);
994 if (delegation
== NULL
)
996 if (stateid
!= NULL
&&
997 !clp
->cl_mvops
->match_stateid(&delegation
->stateid
, stateid
))
999 nfs_mark_return_delegation(server
, delegation
);
1002 nfs_delegation_run_state_manager(clp
);
1009 static struct inode
*
1010 nfs_delegation_find_inode_server(struct nfs_server
*server
,
1011 const struct nfs_fh
*fhandle
)
1013 struct nfs_delegation
*delegation
;
1014 struct inode
*freeme
, *res
= NULL
;
1016 list_for_each_entry_rcu(delegation
, &server
->delegations
, super_list
) {
1017 spin_lock(&delegation
->lock
);
1018 if (delegation
->inode
!= NULL
&&
1019 !test_bit(NFS_DELEGATION_REVOKED
, &delegation
->flags
) &&
1020 nfs_compare_fh(fhandle
, &NFS_I(delegation
->inode
)->fh
) == 0) {
1021 freeme
= igrab(delegation
->inode
);
1022 if (freeme
&& nfs_sb_active(freeme
->i_sb
))
1024 spin_unlock(&delegation
->lock
);
1032 return ERR_PTR(-EAGAIN
);
1034 spin_unlock(&delegation
->lock
);
1036 return ERR_PTR(-ENOENT
);
1040 * nfs_delegation_find_inode - retrieve the inode associated with a delegation
1041 * @clp: client state handle
1042 * @fhandle: filehandle from a delegation recall
1044 * Returns pointer to inode matching "fhandle," or NULL if a matching inode
1047 struct inode
*nfs_delegation_find_inode(struct nfs_client
*clp
,
1048 const struct nfs_fh
*fhandle
)
1050 struct nfs_server
*server
;
1054 list_for_each_entry_rcu(server
, &clp
->cl_superblocks
, client_link
) {
1055 res
= nfs_delegation_find_inode_server(server
, fhandle
);
1056 if (res
!= ERR_PTR(-ENOENT
)) {
1062 return ERR_PTR(-ENOENT
);
1065 static void nfs_delegation_mark_reclaim_server(struct nfs_server
*server
)
1067 struct nfs_delegation
*delegation
;
1069 list_for_each_entry_rcu(delegation
, &server
->delegations
, super_list
) {
1071 * If the delegation may have been admin revoked, then we
1072 * cannot reclaim it.
1074 if (test_bit(NFS_DELEGATION_TEST_EXPIRED
, &delegation
->flags
))
1076 set_bit(NFS_DELEGATION_NEED_RECLAIM
, &delegation
->flags
);
1081 * nfs_delegation_mark_reclaim - mark all delegations as needing to be reclaimed
1082 * @clp: nfs_client to process
1085 void nfs_delegation_mark_reclaim(struct nfs_client
*clp
)
1087 struct nfs_server
*server
;
1090 list_for_each_entry_rcu(server
, &clp
->cl_superblocks
, client_link
)
1091 nfs_delegation_mark_reclaim_server(server
);
1095 static int nfs_server_reap_unclaimed_delegations(struct nfs_server
*server
,
1096 void __always_unused
*data
)
1098 struct nfs_delegation
*delegation
;
1099 struct inode
*inode
;
1103 list_for_each_entry_rcu(delegation
, &server
->delegations
, super_list
) {
1104 if (test_bit(NFS_DELEGATION_INODE_FREEING
,
1105 &delegation
->flags
) ||
1106 test_bit(NFS_DELEGATION_RETURNING
,
1107 &delegation
->flags
) ||
1108 test_bit(NFS_DELEGATION_NEED_RECLAIM
,
1109 &delegation
->flags
) == 0)
1111 inode
= nfs_delegation_grab_inode(delegation
);
1113 goto restart_locked
;
1114 delegation
= nfs_start_delegation_return_locked(NFS_I(inode
));
1116 if (delegation
!= NULL
) {
1117 if (nfs_detach_delegation(NFS_I(inode
), delegation
,
1119 nfs_free_delegation(delegation
);
1120 /* Match nfs_start_delegation_return_locked */
1121 nfs_put_delegation(delegation
);
1132 * nfs_delegation_reap_unclaimed - reap unclaimed delegations after reboot recovery is done
1133 * @clp: nfs_client to process
1136 void nfs_delegation_reap_unclaimed(struct nfs_client
*clp
)
1138 nfs_client_for_each_server(clp
, nfs_server_reap_unclaimed_delegations
,
1142 static inline bool nfs4_server_rebooted(const struct nfs_client
*clp
)
1144 return (clp
->cl_state
& (BIT(NFS4CLNT_CHECK_LEASE
) |
1145 BIT(NFS4CLNT_LEASE_EXPIRED
) |
1146 BIT(NFS4CLNT_SESSION_RESET
))) != 0;
1149 static void nfs_mark_test_expired_delegation(struct nfs_server
*server
,
1150 struct nfs_delegation
*delegation
)
1152 if (delegation
->stateid
.type
== NFS4_INVALID_STATEID_TYPE
)
1154 clear_bit(NFS_DELEGATION_NEED_RECLAIM
, &delegation
->flags
);
1155 set_bit(NFS_DELEGATION_TEST_EXPIRED
, &delegation
->flags
);
1156 set_bit(NFS4CLNT_DELEGATION_EXPIRED
, &server
->nfs_client
->cl_state
);
1159 static void nfs_inode_mark_test_expired_delegation(struct nfs_server
*server
,
1160 struct inode
*inode
)
1162 struct nfs_delegation
*delegation
;
1165 delegation
= rcu_dereference(NFS_I(inode
)->delegation
);
1167 nfs_mark_test_expired_delegation(server
, delegation
);
1172 static void nfs_delegation_mark_test_expired_server(struct nfs_server
*server
)
1174 struct nfs_delegation
*delegation
;
1176 list_for_each_entry_rcu(delegation
, &server
->delegations
, super_list
)
1177 nfs_mark_test_expired_delegation(server
, delegation
);
1181 * nfs_mark_test_expired_all_delegations - mark all delegations for testing
1182 * @clp: nfs_client to process
1184 * Iterates through all the delegations associated with this server and
1185 * marks them as needing to be checked for validity.
1187 void nfs_mark_test_expired_all_delegations(struct nfs_client
*clp
)
1189 struct nfs_server
*server
;
1192 list_for_each_entry_rcu(server
, &clp
->cl_superblocks
, client_link
)
1193 nfs_delegation_mark_test_expired_server(server
);
1198 * nfs_test_expired_all_delegations - test all delegations for a client
1199 * @clp: nfs_client to process
1201 * Helper for handling "recallable state revoked" status from server.
1203 void nfs_test_expired_all_delegations(struct nfs_client
*clp
)
1205 nfs_mark_test_expired_all_delegations(clp
);
1206 nfs4_schedule_state_manager(clp
);
1210 nfs_delegation_test_free_expired(struct inode
*inode
,
1211 nfs4_stateid
*stateid
,
1212 const struct cred
*cred
)
1214 struct nfs_server
*server
= NFS_SERVER(inode
);
1215 const struct nfs4_minor_version_ops
*ops
= server
->nfs_client
->cl_mvops
;
1220 status
= ops
->test_and_free_expired(server
, stateid
, cred
);
1221 if (status
== -NFS4ERR_EXPIRED
|| status
== -NFS4ERR_BAD_STATEID
)
1222 nfs_remove_bad_delegation(inode
, stateid
);
1225 static int nfs_server_reap_expired_delegations(struct nfs_server
*server
,
1226 void __always_unused
*data
)
1228 struct nfs_delegation
*delegation
;
1229 struct inode
*inode
;
1230 const struct cred
*cred
;
1231 nfs4_stateid stateid
;
1235 list_for_each_entry_rcu(delegation
, &server
->delegations
, super_list
) {
1236 if (test_bit(NFS_DELEGATION_INODE_FREEING
,
1237 &delegation
->flags
) ||
1238 test_bit(NFS_DELEGATION_RETURNING
,
1239 &delegation
->flags
) ||
1240 test_bit(NFS_DELEGATION_TEST_EXPIRED
,
1241 &delegation
->flags
) == 0)
1243 inode
= nfs_delegation_grab_inode(delegation
);
1245 goto restart_locked
;
1246 spin_lock(&delegation
->lock
);
1247 cred
= get_cred_rcu(delegation
->cred
);
1248 nfs4_stateid_copy(&stateid
, &delegation
->stateid
);
1249 spin_unlock(&delegation
->lock
);
1250 clear_bit(NFS_DELEGATION_TEST_EXPIRED
, &delegation
->flags
);
1252 nfs_delegation_test_free_expired(inode
, &stateid
, cred
);
1254 if (!nfs4_server_rebooted(server
->nfs_client
)) {
1259 nfs_inode_mark_test_expired_delegation(server
,inode
);
1268 * nfs_reap_expired_delegations - reap expired delegations
1269 * @clp: nfs_client to process
1271 * Iterates through all the delegations associated with this server and
1272 * checks if they have may have been revoked. This function is usually
1273 * expected to be called in cases where the server may have lost its
1276 void nfs_reap_expired_delegations(struct nfs_client
*clp
)
1278 nfs_client_for_each_server(clp
, nfs_server_reap_expired_delegations
,
1282 void nfs_inode_find_delegation_state_and_recover(struct inode
*inode
,
1283 const nfs4_stateid
*stateid
)
1285 struct nfs_client
*clp
= NFS_SERVER(inode
)->nfs_client
;
1286 struct nfs_delegation
*delegation
;
1290 delegation
= rcu_dereference(NFS_I(inode
)->delegation
);
1292 nfs4_stateid_match_or_older(&delegation
->stateid
, stateid
) &&
1293 !test_bit(NFS_DELEGATION_REVOKED
, &delegation
->flags
)) {
1294 nfs_mark_test_expired_delegation(NFS_SERVER(inode
), delegation
);
1299 nfs4_schedule_state_manager(clp
);
1303 * nfs_delegations_present - check for existence of delegations
1304 * @clp: client state handle
1306 * Returns one if there are any nfs_delegation structures attached
1307 * to this nfs_client.
1309 int nfs_delegations_present(struct nfs_client
*clp
)
1311 struct nfs_server
*server
;
1315 list_for_each_entry_rcu(server
, &clp
->cl_superblocks
, client_link
)
1316 if (!list_empty(&server
->delegations
)) {
1325 * nfs4_refresh_delegation_stateid - Update delegation stateid seqid
1326 * @dst: stateid to refresh
1327 * @inode: inode to check
1329 * Returns "true" and updates "dst->seqid" * if inode had a delegation
1330 * that matches our delegation stateid. Otherwise "false" is returned.
1332 bool nfs4_refresh_delegation_stateid(nfs4_stateid
*dst
, struct inode
*inode
)
1334 struct nfs_delegation
*delegation
;
1340 delegation
= rcu_dereference(NFS_I(inode
)->delegation
);
1341 if (delegation
!= NULL
&&
1342 nfs4_stateid_match_other(dst
, &delegation
->stateid
) &&
1343 nfs4_stateid_is_newer(&delegation
->stateid
, dst
) &&
1344 !test_bit(NFS_DELEGATION_REVOKED
, &delegation
->flags
)) {
1345 dst
->seqid
= delegation
->stateid
.seqid
;
1354 * nfs4_copy_delegation_stateid - Copy inode's state ID information
1355 * @inode: inode to check
1356 * @flags: delegation type requirement
1357 * @dst: stateid data structure to fill in
1358 * @cred: optional argument to retrieve credential
1360 * Returns "true" and fills in "dst->data" * if inode had a delegation,
1361 * otherwise "false" is returned.
1363 bool nfs4_copy_delegation_stateid(struct inode
*inode
, fmode_t flags
,
1364 nfs4_stateid
*dst
, const struct cred
**cred
)
1366 struct nfs_inode
*nfsi
= NFS_I(inode
);
1367 struct nfs_delegation
*delegation
;
1370 flags
&= FMODE_READ
|FMODE_WRITE
;
1372 delegation
= rcu_dereference(nfsi
->delegation
);
1375 spin_lock(&delegation
->lock
);
1376 ret
= nfs4_is_valid_delegation(delegation
, flags
);
1378 nfs4_stateid_copy(dst
, &delegation
->stateid
);
1379 nfs_mark_delegation_referenced(delegation
);
1381 *cred
= get_cred(delegation
->cred
);
1383 spin_unlock(&delegation
->lock
);
1390 * nfs4_delegation_flush_on_close - Check if we must flush file on close
1391 * @inode: inode to check
1393 * This function checks the number of outstanding writes to the file
1394 * against the delegation 'space_limit' field to see if
1395 * the spec requires us to flush the file on close.
1397 bool nfs4_delegation_flush_on_close(const struct inode
*inode
)
1399 struct nfs_inode
*nfsi
= NFS_I(inode
);
1400 struct nfs_delegation
*delegation
;
1404 delegation
= rcu_dereference(nfsi
->delegation
);
1405 if (delegation
== NULL
|| !(delegation
->type
& FMODE_WRITE
))
1407 if (atomic_long_read(&nfsi
->nrequests
) < delegation
->pagemod_limit
)
1414 module_param_named(delegation_watermark
, nfs_delegation_watermark
, uint
, 0644);