locks: convert posix locks to file_lock_context
[cascardo/linux.git] / fs / nfs / delegation.c
1 /*
2  * linux/fs/nfs/delegation.c
3  *
4  * Copyright (C) 2004 Trond Myklebust
5  *
6  * NFS file delegation management
7  *
8  */
9 #include <linux/completion.h>
10 #include <linux/kthread.h>
11 #include <linux/module.h>
12 #include <linux/sched.h>
13 #include <linux/slab.h>
14 #include <linux/spinlock.h>
15
16 #include <linux/nfs4.h>
17 #include <linux/nfs_fs.h>
18 #include <linux/nfs_xdr.h>
19
20 #include "nfs4_fs.h"
21 #include "delegation.h"
22 #include "internal.h"
23 #include "nfs4trace.h"
24
25 static void nfs_free_delegation(struct nfs_delegation *delegation)
26 {
27         if (delegation->cred) {
28                 put_rpccred(delegation->cred);
29                 delegation->cred = NULL;
30         }
31         kfree_rcu(delegation, rcu);
32 }
33
34 /**
35  * nfs_mark_delegation_referenced - set delegation's REFERENCED flag
36  * @delegation: delegation to process
37  *
38  */
39 void nfs_mark_delegation_referenced(struct nfs_delegation *delegation)
40 {
41         set_bit(NFS_DELEGATION_REFERENCED, &delegation->flags);
42 }
43
44 static int
45 nfs4_do_check_delegation(struct inode *inode, fmode_t flags, bool mark)
46 {
47         struct nfs_delegation *delegation;
48         int ret = 0;
49
50         flags &= FMODE_READ|FMODE_WRITE;
51         rcu_read_lock();
52         delegation = rcu_dereference(NFS_I(inode)->delegation);
53         if (delegation != NULL && (delegation->type & flags) == flags &&
54             !test_bit(NFS_DELEGATION_RETURNING, &delegation->flags)) {
55                 if (mark)
56                         nfs_mark_delegation_referenced(delegation);
57                 ret = 1;
58         }
59         rcu_read_unlock();
60         return ret;
61 }
62 /**
63  * nfs_have_delegation - check if inode has a delegation, mark it
64  * NFS_DELEGATION_REFERENCED if there is one.
65  * @inode: inode to check
66  * @flags: delegation types to check for
67  *
68  * Returns one if inode has the indicated delegation, otherwise zero.
69  */
70 int nfs4_have_delegation(struct inode *inode, fmode_t flags)
71 {
72         return nfs4_do_check_delegation(inode, flags, true);
73 }
74
75 /*
76  * nfs4_check_delegation - check if inode has a delegation, do not mark
77  * NFS_DELEGATION_REFERENCED if it has one.
78  */
79 int nfs4_check_delegation(struct inode *inode, fmode_t flags)
80 {
81         return nfs4_do_check_delegation(inode, flags, false);
82 }
83
84 static int nfs_delegation_claim_locks(struct nfs_open_context *ctx, struct nfs4_state *state, const nfs4_stateid *stateid)
85 {
86         struct inode *inode = state->inode;
87         struct file_lock *fl;
88         struct file_lock_context *flctx = inode->i_flctx;
89         struct list_head *list;
90         int status = 0;
91
92         if (flctx == NULL)
93                 goto out;
94
95         list = &flctx->flc_posix;
96         spin_lock(&inode->i_lock);
97 restart:
98         list_for_each_entry(fl, list, fl_list) {
99                 if (nfs_file_open_context(fl->fl_file) != ctx)
100                         continue;
101                 spin_unlock(&inode->i_lock);
102                 status = nfs4_lock_delegation_recall(fl, state, stateid);
103                 if (status < 0)
104                         goto out;
105                 spin_lock(&inode->i_lock);
106         }
107         if (list == &flctx->flc_posix) {
108                 list = &flctx->flc_flock;
109                 goto restart;
110         }
111         spin_unlock(&inode->i_lock);
112 out:
113         return status;
114 }
115
116 static int nfs_delegation_claim_opens(struct inode *inode, const nfs4_stateid *stateid)
117 {
118         struct nfs_inode *nfsi = NFS_I(inode);
119         struct nfs_open_context *ctx;
120         struct nfs4_state_owner *sp;
121         struct nfs4_state *state;
122         unsigned int seq;
123         int err;
124
125 again:
126         spin_lock(&inode->i_lock);
127         list_for_each_entry(ctx, &nfsi->open_files, list) {
128                 state = ctx->state;
129                 if (state == NULL)
130                         continue;
131                 if (!test_bit(NFS_DELEGATED_STATE, &state->flags))
132                         continue;
133                 if (!nfs4_valid_open_stateid(state))
134                         continue;
135                 if (!nfs4_stateid_match(&state->stateid, stateid))
136                         continue;
137                 get_nfs_open_context(ctx);
138                 spin_unlock(&inode->i_lock);
139                 sp = state->owner;
140                 /* Block nfs4_proc_unlck */
141                 mutex_lock(&sp->so_delegreturn_mutex);
142                 seq = raw_seqcount_begin(&sp->so_reclaim_seqcount);
143                 err = nfs4_open_delegation_recall(ctx, state, stateid);
144                 if (!err)
145                         err = nfs_delegation_claim_locks(ctx, state, stateid);
146                 if (!err && read_seqcount_retry(&sp->so_reclaim_seqcount, seq))
147                         err = -EAGAIN;
148                 mutex_unlock(&sp->so_delegreturn_mutex);
149                 put_nfs_open_context(ctx);
150                 if (err != 0)
151                         return err;
152                 goto again;
153         }
154         spin_unlock(&inode->i_lock);
155         return 0;
156 }
157
158 /**
159  * nfs_inode_reclaim_delegation - process a delegation reclaim request
160  * @inode: inode to process
161  * @cred: credential to use for request
162  * @res: new delegation state from server
163  *
164  */
165 void nfs_inode_reclaim_delegation(struct inode *inode, struct rpc_cred *cred,
166                                   struct nfs_openres *res)
167 {
168         struct nfs_delegation *delegation;
169         struct rpc_cred *oldcred = NULL;
170
171         rcu_read_lock();
172         delegation = rcu_dereference(NFS_I(inode)->delegation);
173         if (delegation != NULL) {
174                 spin_lock(&delegation->lock);
175                 if (delegation->inode != NULL) {
176                         nfs4_stateid_copy(&delegation->stateid, &res->delegation);
177                         delegation->type = res->delegation_type;
178                         delegation->maxsize = res->maxsize;
179                         oldcred = delegation->cred;
180                         delegation->cred = get_rpccred(cred);
181                         clear_bit(NFS_DELEGATION_NEED_RECLAIM,
182                                   &delegation->flags);
183                         NFS_I(inode)->delegation_state = delegation->type;
184                         spin_unlock(&delegation->lock);
185                         put_rpccred(oldcred);
186                         rcu_read_unlock();
187                         trace_nfs4_reclaim_delegation(inode, res->delegation_type);
188                 } else {
189                         /* We appear to have raced with a delegation return. */
190                         spin_unlock(&delegation->lock);
191                         rcu_read_unlock();
192                         nfs_inode_set_delegation(inode, cred, res);
193                 }
194         } else {
195                 rcu_read_unlock();
196         }
197 }
198
199 static int nfs_do_return_delegation(struct inode *inode, struct nfs_delegation *delegation, int issync)
200 {
201         int res = 0;
202
203         if (!test_bit(NFS_DELEGATION_REVOKED, &delegation->flags))
204                 res = nfs4_proc_delegreturn(inode,
205                                 delegation->cred,
206                                 &delegation->stateid,
207                                 issync);
208         nfs_free_delegation(delegation);
209         return res;
210 }
211
212 static struct inode *nfs_delegation_grab_inode(struct nfs_delegation *delegation)
213 {
214         struct inode *inode = NULL;
215
216         spin_lock(&delegation->lock);
217         if (delegation->inode != NULL)
218                 inode = igrab(delegation->inode);
219         spin_unlock(&delegation->lock);
220         return inode;
221 }
222
223 static struct nfs_delegation *
224 nfs_start_delegation_return_locked(struct nfs_inode *nfsi)
225 {
226         struct nfs_delegation *ret = NULL;
227         struct nfs_delegation *delegation = rcu_dereference(nfsi->delegation);
228
229         if (delegation == NULL)
230                 goto out;
231         spin_lock(&delegation->lock);
232         if (!test_and_set_bit(NFS_DELEGATION_RETURNING, &delegation->flags))
233                 ret = delegation;
234         spin_unlock(&delegation->lock);
235 out:
236         return ret;
237 }
238
239 static struct nfs_delegation *
240 nfs_start_delegation_return(struct nfs_inode *nfsi)
241 {
242         struct nfs_delegation *delegation;
243
244         rcu_read_lock();
245         delegation = nfs_start_delegation_return_locked(nfsi);
246         rcu_read_unlock();
247         return delegation;
248 }
249
250 static void
251 nfs_abort_delegation_return(struct nfs_delegation *delegation,
252                 struct nfs_client *clp)
253 {
254
255         spin_lock(&delegation->lock);
256         clear_bit(NFS_DELEGATION_RETURNING, &delegation->flags);
257         set_bit(NFS_DELEGATION_RETURN, &delegation->flags);
258         spin_unlock(&delegation->lock);
259         set_bit(NFS4CLNT_DELEGRETURN, &clp->cl_state);
260 }
261
262 static struct nfs_delegation *
263 nfs_detach_delegation_locked(struct nfs_inode *nfsi,
264                 struct nfs_delegation *delegation,
265                 struct nfs_client *clp)
266 {
267         struct nfs_delegation *deleg_cur =
268                 rcu_dereference_protected(nfsi->delegation,
269                                 lockdep_is_held(&clp->cl_lock));
270
271         if (deleg_cur == NULL || delegation != deleg_cur)
272                 return NULL;
273
274         spin_lock(&delegation->lock);
275         set_bit(NFS_DELEGATION_RETURNING, &delegation->flags);
276         list_del_rcu(&delegation->super_list);
277         delegation->inode = NULL;
278         nfsi->delegation_state = 0;
279         rcu_assign_pointer(nfsi->delegation, NULL);
280         spin_unlock(&delegation->lock);
281         return delegation;
282 }
283
284 static struct nfs_delegation *nfs_detach_delegation(struct nfs_inode *nfsi,
285                 struct nfs_delegation *delegation,
286                 struct nfs_server *server)
287 {
288         struct nfs_client *clp = server->nfs_client;
289
290         spin_lock(&clp->cl_lock);
291         delegation = nfs_detach_delegation_locked(nfsi, delegation, clp);
292         spin_unlock(&clp->cl_lock);
293         return delegation;
294 }
295
296 static struct nfs_delegation *
297 nfs_inode_detach_delegation(struct inode *inode)
298 {
299         struct nfs_inode *nfsi = NFS_I(inode);
300         struct nfs_server *server = NFS_SERVER(inode);
301         struct nfs_delegation *delegation;
302
303         delegation = nfs_start_delegation_return(nfsi);
304         if (delegation == NULL)
305                 return NULL;
306         return nfs_detach_delegation(nfsi, delegation, server);
307 }
308
309 /**
310  * nfs_inode_set_delegation - set up a delegation on an inode
311  * @inode: inode to which delegation applies
312  * @cred: cred to use for subsequent delegation processing
313  * @res: new delegation state from server
314  *
315  * Returns zero on success, or a negative errno value.
316  */
317 int nfs_inode_set_delegation(struct inode *inode, struct rpc_cred *cred, struct nfs_openres *res)
318 {
319         struct nfs_server *server = NFS_SERVER(inode);
320         struct nfs_client *clp = server->nfs_client;
321         struct nfs_inode *nfsi = NFS_I(inode);
322         struct nfs_delegation *delegation, *old_delegation;
323         struct nfs_delegation *freeme = NULL;
324         int status = 0;
325
326         delegation = kmalloc(sizeof(*delegation), GFP_NOFS);
327         if (delegation == NULL)
328                 return -ENOMEM;
329         nfs4_stateid_copy(&delegation->stateid, &res->delegation);
330         delegation->type = res->delegation_type;
331         delegation->maxsize = res->maxsize;
332         delegation->change_attr = inode->i_version;
333         delegation->cred = get_rpccred(cred);
334         delegation->inode = inode;
335         delegation->flags = 1<<NFS_DELEGATION_REFERENCED;
336         spin_lock_init(&delegation->lock);
337
338         spin_lock(&clp->cl_lock);
339         old_delegation = rcu_dereference_protected(nfsi->delegation,
340                                         lockdep_is_held(&clp->cl_lock));
341         if (old_delegation != NULL) {
342                 if (nfs4_stateid_match(&delegation->stateid,
343                                         &old_delegation->stateid) &&
344                                 delegation->type == old_delegation->type) {
345                         goto out;
346                 }
347                 /*
348                  * Deal with broken servers that hand out two
349                  * delegations for the same file.
350                  * Allow for upgrades to a WRITE delegation, but
351                  * nothing else.
352                  */
353                 dfprintk(FILE, "%s: server %s handed out "
354                                 "a duplicate delegation!\n",
355                                 __func__, clp->cl_hostname);
356                 if (delegation->type == old_delegation->type ||
357                     !(delegation->type & FMODE_WRITE)) {
358                         freeme = delegation;
359                         delegation = NULL;
360                         goto out;
361                 }
362                 freeme = nfs_detach_delegation_locked(nfsi, 
363                                 old_delegation, clp);
364                 if (freeme == NULL)
365                         goto out;
366         }
367         list_add_rcu(&delegation->super_list, &server->delegations);
368         nfsi->delegation_state = delegation->type;
369         rcu_assign_pointer(nfsi->delegation, delegation);
370         delegation = NULL;
371
372         /* Ensure we revalidate the attributes and page cache! */
373         spin_lock(&inode->i_lock);
374         nfsi->cache_validity |= NFS_INO_REVAL_FORCED;
375         spin_unlock(&inode->i_lock);
376         trace_nfs4_set_delegation(inode, res->delegation_type);
377
378 out:
379         spin_unlock(&clp->cl_lock);
380         if (delegation != NULL)
381                 nfs_free_delegation(delegation);
382         if (freeme != NULL)
383                 nfs_do_return_delegation(inode, freeme, 0);
384         return status;
385 }
386
387 /*
388  * Basic procedure for returning a delegation to the server
389  */
390 static int nfs_end_delegation_return(struct inode *inode, struct nfs_delegation *delegation, int issync)
391 {
392         struct nfs_client *clp = NFS_SERVER(inode)->nfs_client;
393         struct nfs_inode *nfsi = NFS_I(inode);
394         int err = 0;
395
396         if (delegation == NULL)
397                 return 0;
398         do {
399                 if (test_bit(NFS_DELEGATION_REVOKED, &delegation->flags))
400                         break;
401                 err = nfs_delegation_claim_opens(inode, &delegation->stateid);
402                 if (!issync || err != -EAGAIN)
403                         break;
404                 /*
405                  * Guard against state recovery
406                  */
407                 err = nfs4_wait_clnt_recover(clp);
408         } while (err == 0);
409
410         if (err) {
411                 nfs_abort_delegation_return(delegation, clp);
412                 goto out;
413         }
414         if (!nfs_detach_delegation(nfsi, delegation, NFS_SERVER(inode)))
415                 goto out;
416
417         err = nfs_do_return_delegation(inode, delegation, issync);
418 out:
419         return err;
420 }
421
422 static bool nfs_delegation_need_return(struct nfs_delegation *delegation)
423 {
424         bool ret = false;
425
426         if (test_and_clear_bit(NFS_DELEGATION_RETURN, &delegation->flags))
427                 ret = true;
428         if (test_and_clear_bit(NFS_DELEGATION_RETURN_IF_CLOSED, &delegation->flags) && !ret) {
429                 struct inode *inode;
430
431                 spin_lock(&delegation->lock);
432                 inode = delegation->inode;
433                 if (inode && list_empty(&NFS_I(inode)->open_files))
434                         ret = true;
435                 spin_unlock(&delegation->lock);
436         }
437         return ret;
438 }
439
440 /**
441  * nfs_client_return_marked_delegations - return previously marked delegations
442  * @clp: nfs_client to process
443  *
444  * Note that this function is designed to be called by the state
445  * manager thread. For this reason, it cannot flush the dirty data,
446  * since that could deadlock in case of a state recovery error.
447  *
448  * Returns zero on success, or a negative errno value.
449  */
450 int nfs_client_return_marked_delegations(struct nfs_client *clp)
451 {
452         struct nfs_delegation *delegation;
453         struct nfs_server *server;
454         struct inode *inode;
455         int err = 0;
456
457 restart:
458         rcu_read_lock();
459         list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) {
460                 list_for_each_entry_rcu(delegation, &server->delegations,
461                                                                 super_list) {
462                         if (!nfs_delegation_need_return(delegation))
463                                 continue;
464                         inode = nfs_delegation_grab_inode(delegation);
465                         if (inode == NULL)
466                                 continue;
467                         delegation = nfs_start_delegation_return_locked(NFS_I(inode));
468                         rcu_read_unlock();
469
470                         err = nfs_end_delegation_return(inode, delegation, 0);
471                         iput(inode);
472                         if (!err)
473                                 goto restart;
474                         set_bit(NFS4CLNT_DELEGRETURN, &clp->cl_state);
475                         return err;
476                 }
477         }
478         rcu_read_unlock();
479         return 0;
480 }
481
482 /**
483  * nfs_inode_return_delegation_noreclaim - return delegation, don't reclaim opens
484  * @inode: inode to process
485  *
486  * Does not protect against delegation reclaims, therefore really only safe
487  * to be called from nfs4_clear_inode().
488  */
489 void nfs_inode_return_delegation_noreclaim(struct inode *inode)
490 {
491         struct nfs_delegation *delegation;
492
493         delegation = nfs_inode_detach_delegation(inode);
494         if (delegation != NULL)
495                 nfs_do_return_delegation(inode, delegation, 0);
496 }
497
498 /**
499  * nfs_inode_return_delegation - synchronously return a delegation
500  * @inode: inode to process
501  *
502  * This routine will always flush any dirty data to disk on the
503  * assumption that if we need to return the delegation, then
504  * we should stop caching.
505  *
506  * Returns zero on success, or a negative errno value.
507  */
508 int nfs4_inode_return_delegation(struct inode *inode)
509 {
510         struct nfs_inode *nfsi = NFS_I(inode);
511         struct nfs_delegation *delegation;
512         int err = 0;
513
514         nfs_wb_all(inode);
515         delegation = nfs_start_delegation_return(nfsi);
516         if (delegation != NULL)
517                 err = nfs_end_delegation_return(inode, delegation, 1);
518         return err;
519 }
520
521 static void nfs_mark_return_if_closed_delegation(struct nfs_server *server,
522                 struct nfs_delegation *delegation)
523 {
524         set_bit(NFS_DELEGATION_RETURN_IF_CLOSED, &delegation->flags);
525         set_bit(NFS4CLNT_DELEGRETURN, &server->nfs_client->cl_state);
526 }
527
528 static void nfs_mark_return_delegation(struct nfs_server *server,
529                 struct nfs_delegation *delegation)
530 {
531         set_bit(NFS_DELEGATION_RETURN, &delegation->flags);
532         set_bit(NFS4CLNT_DELEGRETURN, &server->nfs_client->cl_state);
533 }
534
535 static bool nfs_server_mark_return_all_delegations(struct nfs_server *server)
536 {
537         struct nfs_delegation *delegation;
538         bool ret = false;
539
540         list_for_each_entry_rcu(delegation, &server->delegations, super_list) {
541                 nfs_mark_return_delegation(server, delegation);
542                 ret = true;
543         }
544         return ret;
545 }
546
547 static void nfs_client_mark_return_all_delegations(struct nfs_client *clp)
548 {
549         struct nfs_server *server;
550
551         rcu_read_lock();
552         list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link)
553                 nfs_server_mark_return_all_delegations(server);
554         rcu_read_unlock();
555 }
556
557 static void nfs_delegation_run_state_manager(struct nfs_client *clp)
558 {
559         if (test_bit(NFS4CLNT_DELEGRETURN, &clp->cl_state))
560                 nfs4_schedule_state_manager(clp);
561 }
562
563 /**
564  * nfs_expire_all_delegations
565  * @clp: client to process
566  *
567  */
568 void nfs_expire_all_delegations(struct nfs_client *clp)
569 {
570         nfs_client_mark_return_all_delegations(clp);
571         nfs_delegation_run_state_manager(clp);
572 }
573
574 /**
575  * nfs_super_return_all_delegations - return delegations for one superblock
576  * @sb: sb to process
577  *
578  */
579 void nfs_server_return_all_delegations(struct nfs_server *server)
580 {
581         struct nfs_client *clp = server->nfs_client;
582         bool need_wait;
583
584         if (clp == NULL)
585                 return;
586
587         rcu_read_lock();
588         need_wait = nfs_server_mark_return_all_delegations(server);
589         rcu_read_unlock();
590
591         if (need_wait) {
592                 nfs4_schedule_state_manager(clp);
593                 nfs4_wait_clnt_recover(clp);
594         }
595 }
596
597 static void nfs_mark_return_unused_delegation_types(struct nfs_server *server,
598                                                  fmode_t flags)
599 {
600         struct nfs_delegation *delegation;
601
602         list_for_each_entry_rcu(delegation, &server->delegations, super_list) {
603                 if ((delegation->type == (FMODE_READ|FMODE_WRITE)) && !(flags & FMODE_WRITE))
604                         continue;
605                 if (delegation->type & flags)
606                         nfs_mark_return_if_closed_delegation(server, delegation);
607         }
608 }
609
610 static void nfs_client_mark_return_unused_delegation_types(struct nfs_client *clp,
611                                                         fmode_t flags)
612 {
613         struct nfs_server *server;
614
615         rcu_read_lock();
616         list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link)
617                 nfs_mark_return_unused_delegation_types(server, flags);
618         rcu_read_unlock();
619 }
620
621 static void nfs_revoke_delegation(struct inode *inode)
622 {
623         struct nfs_delegation *delegation;
624         rcu_read_lock();
625         delegation = rcu_dereference(NFS_I(inode)->delegation);
626         if (delegation != NULL) {
627                 set_bit(NFS_DELEGATION_REVOKED, &delegation->flags);
628                 nfs_mark_return_delegation(NFS_SERVER(inode), delegation);
629         }
630         rcu_read_unlock();
631 }
632
633 void nfs_remove_bad_delegation(struct inode *inode)
634 {
635         struct nfs_delegation *delegation;
636
637         nfs_revoke_delegation(inode);
638         delegation = nfs_inode_detach_delegation(inode);
639         if (delegation) {
640                 nfs_inode_find_state_and_recover(inode, &delegation->stateid);
641                 nfs_free_delegation(delegation);
642         }
643 }
644 EXPORT_SYMBOL_GPL(nfs_remove_bad_delegation);
645
646 /**
647  * nfs_expire_unused_delegation_types
648  * @clp: client to process
649  * @flags: delegation types to expire
650  *
651  */
652 void nfs_expire_unused_delegation_types(struct nfs_client *clp, fmode_t flags)
653 {
654         nfs_client_mark_return_unused_delegation_types(clp, flags);
655         nfs_delegation_run_state_manager(clp);
656 }
657
658 static void nfs_mark_return_unreferenced_delegations(struct nfs_server *server)
659 {
660         struct nfs_delegation *delegation;
661
662         list_for_each_entry_rcu(delegation, &server->delegations, super_list) {
663                 if (test_and_clear_bit(NFS_DELEGATION_REFERENCED, &delegation->flags))
664                         continue;
665                 nfs_mark_return_if_closed_delegation(server, delegation);
666         }
667 }
668
669 /**
670  * nfs_expire_unreferenced_delegations - Eliminate unused delegations
671  * @clp: nfs_client to process
672  *
673  */
674 void nfs_expire_unreferenced_delegations(struct nfs_client *clp)
675 {
676         struct nfs_server *server;
677
678         rcu_read_lock();
679         list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link)
680                 nfs_mark_return_unreferenced_delegations(server);
681         rcu_read_unlock();
682
683         nfs_delegation_run_state_manager(clp);
684 }
685
686 /**
687  * nfs_async_inode_return_delegation - asynchronously return a delegation
688  * @inode: inode to process
689  * @stateid: state ID information
690  *
691  * Returns zero on success, or a negative errno value.
692  */
693 int nfs_async_inode_return_delegation(struct inode *inode,
694                                       const nfs4_stateid *stateid)
695 {
696         struct nfs_server *server = NFS_SERVER(inode);
697         struct nfs_client *clp = server->nfs_client;
698         struct nfs_delegation *delegation;
699
700         filemap_flush(inode->i_mapping);
701
702         rcu_read_lock();
703         delegation = rcu_dereference(NFS_I(inode)->delegation);
704         if (delegation == NULL)
705                 goto out_enoent;
706
707         if (!clp->cl_mvops->match_stateid(&delegation->stateid, stateid))
708                 goto out_enoent;
709         nfs_mark_return_delegation(server, delegation);
710         rcu_read_unlock();
711
712         nfs_delegation_run_state_manager(clp);
713         return 0;
714 out_enoent:
715         rcu_read_unlock();
716         return -ENOENT;
717 }
718
719 static struct inode *
720 nfs_delegation_find_inode_server(struct nfs_server *server,
721                                  const struct nfs_fh *fhandle)
722 {
723         struct nfs_delegation *delegation;
724         struct inode *res = NULL;
725
726         list_for_each_entry_rcu(delegation, &server->delegations, super_list) {
727                 spin_lock(&delegation->lock);
728                 if (delegation->inode != NULL &&
729                     nfs_compare_fh(fhandle, &NFS_I(delegation->inode)->fh) == 0) {
730                         res = igrab(delegation->inode);
731                 }
732                 spin_unlock(&delegation->lock);
733                 if (res != NULL)
734                         break;
735         }
736         return res;
737 }
738
739 /**
740  * nfs_delegation_find_inode - retrieve the inode associated with a delegation
741  * @clp: client state handle
742  * @fhandle: filehandle from a delegation recall
743  *
744  * Returns pointer to inode matching "fhandle," or NULL if a matching inode
745  * cannot be found.
746  */
747 struct inode *nfs_delegation_find_inode(struct nfs_client *clp,
748                                         const struct nfs_fh *fhandle)
749 {
750         struct nfs_server *server;
751         struct inode *res = NULL;
752
753         rcu_read_lock();
754         list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) {
755                 res = nfs_delegation_find_inode_server(server, fhandle);
756                 if (res != NULL)
757                         break;
758         }
759         rcu_read_unlock();
760         return res;
761 }
762
763 static void nfs_delegation_mark_reclaim_server(struct nfs_server *server)
764 {
765         struct nfs_delegation *delegation;
766
767         list_for_each_entry_rcu(delegation, &server->delegations, super_list)
768                 set_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags);
769 }
770
771 /**
772  * nfs_delegation_mark_reclaim - mark all delegations as needing to be reclaimed
773  * @clp: nfs_client to process
774  *
775  */
776 void nfs_delegation_mark_reclaim(struct nfs_client *clp)
777 {
778         struct nfs_server *server;
779
780         rcu_read_lock();
781         list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link)
782                 nfs_delegation_mark_reclaim_server(server);
783         rcu_read_unlock();
784 }
785
786 /**
787  * nfs_delegation_reap_unclaimed - reap unclaimed delegations after reboot recovery is done
788  * @clp: nfs_client to process
789  *
790  */
791 void nfs_delegation_reap_unclaimed(struct nfs_client *clp)
792 {
793         struct nfs_delegation *delegation;
794         struct nfs_server *server;
795         struct inode *inode;
796
797 restart:
798         rcu_read_lock();
799         list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) {
800                 list_for_each_entry_rcu(delegation, &server->delegations,
801                                                                 super_list) {
802                         if (test_bit(NFS_DELEGATION_NEED_RECLAIM,
803                                                 &delegation->flags) == 0)
804                                 continue;
805                         inode = nfs_delegation_grab_inode(delegation);
806                         if (inode == NULL)
807                                 continue;
808                         delegation = nfs_detach_delegation(NFS_I(inode),
809                                         delegation, server);
810                         rcu_read_unlock();
811
812                         if (delegation != NULL)
813                                 nfs_free_delegation(delegation);
814                         iput(inode);
815                         goto restart;
816                 }
817         }
818         rcu_read_unlock();
819 }
820
821 /**
822  * nfs_delegations_present - check for existence of delegations
823  * @clp: client state handle
824  *
825  * Returns one if there are any nfs_delegation structures attached
826  * to this nfs_client.
827  */
828 int nfs_delegations_present(struct nfs_client *clp)
829 {
830         struct nfs_server *server;
831         int ret = 0;
832
833         rcu_read_lock();
834         list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link)
835                 if (!list_empty(&server->delegations)) {
836                         ret = 1;
837                         break;
838                 }
839         rcu_read_unlock();
840         return ret;
841 }
842
843 /**
844  * nfs4_copy_delegation_stateid - Copy inode's state ID information
845  * @dst: stateid data structure to fill in
846  * @inode: inode to check
847  * @flags: delegation type requirement
848  *
849  * Returns "true" and fills in "dst->data" * if inode had a delegation,
850  * otherwise "false" is returned.
851  */
852 bool nfs4_copy_delegation_stateid(nfs4_stateid *dst, struct inode *inode,
853                 fmode_t flags)
854 {
855         struct nfs_inode *nfsi = NFS_I(inode);
856         struct nfs_delegation *delegation;
857         bool ret;
858
859         flags &= FMODE_READ|FMODE_WRITE;
860         rcu_read_lock();
861         delegation = rcu_dereference(nfsi->delegation);
862         ret = (delegation != NULL && (delegation->type & flags) == flags);
863         if (ret) {
864                 nfs4_stateid_copy(dst, &delegation->stateid);
865                 nfs_mark_delegation_referenced(delegation);
866         }
867         rcu_read_unlock();
868         return ret;
869 }