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