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