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