Lines Matching refs:delegation
25 static void nfs_free_delegation(struct nfs_delegation *delegation) in nfs_free_delegation() argument
27 if (delegation->cred) { in nfs_free_delegation()
28 put_rpccred(delegation->cred); in nfs_free_delegation()
29 delegation->cred = NULL; in nfs_free_delegation()
31 kfree_rcu(delegation, rcu); in nfs_free_delegation()
39 void nfs_mark_delegation_referenced(struct nfs_delegation *delegation) in nfs_mark_delegation_referenced() argument
41 set_bit(NFS_DELEGATION_REFERENCED, &delegation->flags); in nfs_mark_delegation_referenced()
47 struct nfs_delegation *delegation; in nfs4_do_check_delegation() local
52 delegation = rcu_dereference(NFS_I(inode)->delegation); in nfs4_do_check_delegation()
53 if (delegation != NULL && (delegation->type & flags) == flags && in nfs4_do_check_delegation()
54 !test_bit(NFS_DELEGATION_RETURNING, &delegation->flags)) { in nfs4_do_check_delegation()
56 nfs_mark_delegation_referenced(delegation); in nfs4_do_check_delegation()
169 struct nfs_delegation *delegation; in nfs_inode_reclaim_delegation() local
173 delegation = rcu_dereference(NFS_I(inode)->delegation); in nfs_inode_reclaim_delegation()
174 if (delegation != NULL) { in nfs_inode_reclaim_delegation()
175 spin_lock(&delegation->lock); in nfs_inode_reclaim_delegation()
176 if (delegation->inode != NULL) { in nfs_inode_reclaim_delegation()
177 nfs4_stateid_copy(&delegation->stateid, &res->delegation); in nfs_inode_reclaim_delegation()
178 delegation->type = res->delegation_type; in nfs_inode_reclaim_delegation()
179 delegation->pagemod_limit = res->pagemod_limit; in nfs_inode_reclaim_delegation()
180 oldcred = delegation->cred; in nfs_inode_reclaim_delegation()
181 delegation->cred = get_rpccred(cred); in nfs_inode_reclaim_delegation()
183 &delegation->flags); in nfs_inode_reclaim_delegation()
184 spin_unlock(&delegation->lock); in nfs_inode_reclaim_delegation()
190 spin_unlock(&delegation->lock); in nfs_inode_reclaim_delegation()
199 static int nfs_do_return_delegation(struct inode *inode, struct nfs_delegation *delegation, int iss… in nfs_do_return_delegation() argument
203 if (!test_bit(NFS_DELEGATION_REVOKED, &delegation->flags)) in nfs_do_return_delegation()
205 delegation->cred, in nfs_do_return_delegation()
206 &delegation->stateid, in nfs_do_return_delegation()
208 nfs_free_delegation(delegation); in nfs_do_return_delegation()
212 static struct inode *nfs_delegation_grab_inode(struct nfs_delegation *delegation) in nfs_delegation_grab_inode() argument
216 spin_lock(&delegation->lock); in nfs_delegation_grab_inode()
217 if (delegation->inode != NULL) in nfs_delegation_grab_inode()
218 inode = igrab(delegation->inode); in nfs_delegation_grab_inode()
219 spin_unlock(&delegation->lock); in nfs_delegation_grab_inode()
227 struct nfs_delegation *delegation = rcu_dereference(nfsi->delegation); in nfs_start_delegation_return_locked() local
229 if (delegation == NULL) in nfs_start_delegation_return_locked()
231 spin_lock(&delegation->lock); in nfs_start_delegation_return_locked()
232 if (!test_and_set_bit(NFS_DELEGATION_RETURNING, &delegation->flags)) in nfs_start_delegation_return_locked()
233 ret = delegation; in nfs_start_delegation_return_locked()
234 spin_unlock(&delegation->lock); in nfs_start_delegation_return_locked()
242 struct nfs_delegation *delegation; in nfs_start_delegation_return() local
245 delegation = nfs_start_delegation_return_locked(nfsi); in nfs_start_delegation_return()
247 return delegation; in nfs_start_delegation_return()
251 nfs_abort_delegation_return(struct nfs_delegation *delegation, in nfs_abort_delegation_return() argument
255 spin_lock(&delegation->lock); in nfs_abort_delegation_return()
256 clear_bit(NFS_DELEGATION_RETURNING, &delegation->flags); in nfs_abort_delegation_return()
257 set_bit(NFS_DELEGATION_RETURN, &delegation->flags); in nfs_abort_delegation_return()
258 spin_unlock(&delegation->lock); in nfs_abort_delegation_return()
264 struct nfs_delegation *delegation, in nfs_detach_delegation_locked() argument
268 rcu_dereference_protected(nfsi->delegation, in nfs_detach_delegation_locked()
271 if (deleg_cur == NULL || delegation != deleg_cur) in nfs_detach_delegation_locked()
274 spin_lock(&delegation->lock); in nfs_detach_delegation_locked()
275 set_bit(NFS_DELEGATION_RETURNING, &delegation->flags); in nfs_detach_delegation_locked()
276 list_del_rcu(&delegation->super_list); in nfs_detach_delegation_locked()
277 delegation->inode = NULL; in nfs_detach_delegation_locked()
278 rcu_assign_pointer(nfsi->delegation, NULL); in nfs_detach_delegation_locked()
279 spin_unlock(&delegation->lock); in nfs_detach_delegation_locked()
280 return delegation; in nfs_detach_delegation_locked()
284 struct nfs_delegation *delegation, in nfs_detach_delegation() argument
290 delegation = nfs_detach_delegation_locked(nfsi, delegation, clp); in nfs_detach_delegation()
292 return delegation; in nfs_detach_delegation()
300 struct nfs_delegation *delegation; in nfs_inode_detach_delegation() local
302 delegation = nfs_start_delegation_return(nfsi); in nfs_inode_detach_delegation()
303 if (delegation == NULL) in nfs_inode_detach_delegation()
305 return nfs_detach_delegation(nfsi, delegation, server); in nfs_inode_detach_delegation()
309 nfs_update_inplace_delegation(struct nfs_delegation *delegation, in nfs_update_inplace_delegation() argument
312 if (nfs4_stateid_is_newer(&update->stateid, &delegation->stateid)) { in nfs_update_inplace_delegation()
313 delegation->stateid.seqid = update->stateid.seqid; in nfs_update_inplace_delegation()
315 delegation->type = update->type; in nfs_update_inplace_delegation()
332 struct nfs_delegation *delegation, *old_delegation; in nfs_inode_set_delegation() local
336 delegation = kmalloc(sizeof(*delegation), GFP_NOFS); in nfs_inode_set_delegation()
337 if (delegation == NULL) in nfs_inode_set_delegation()
339 nfs4_stateid_copy(&delegation->stateid, &res->delegation); in nfs_inode_set_delegation()
340 delegation->type = res->delegation_type; in nfs_inode_set_delegation()
341 delegation->pagemod_limit = res->pagemod_limit; in nfs_inode_set_delegation()
342 delegation->change_attr = inode->i_version; in nfs_inode_set_delegation()
343 delegation->cred = get_rpccred(cred); in nfs_inode_set_delegation()
344 delegation->inode = inode; in nfs_inode_set_delegation()
345 delegation->flags = 1<<NFS_DELEGATION_REFERENCED; in nfs_inode_set_delegation()
346 spin_lock_init(&delegation->lock); in nfs_inode_set_delegation()
349 old_delegation = rcu_dereference_protected(nfsi->delegation, in nfs_inode_set_delegation()
354 &delegation->stateid)) { in nfs_inode_set_delegation()
356 delegation); in nfs_inode_set_delegation()
368 if (delegation->type == old_delegation->type || in nfs_inode_set_delegation()
369 !(delegation->type & FMODE_WRITE)) { in nfs_inode_set_delegation()
370 freeme = delegation; in nfs_inode_set_delegation()
371 delegation = NULL; in nfs_inode_set_delegation()
382 list_add_tail_rcu(&delegation->super_list, &server->delegations); in nfs_inode_set_delegation()
383 rcu_assign_pointer(nfsi->delegation, delegation); in nfs_inode_set_delegation()
384 delegation = NULL; in nfs_inode_set_delegation()
394 if (delegation != NULL) in nfs_inode_set_delegation()
395 nfs_free_delegation(delegation); in nfs_inode_set_delegation()
404 static int nfs_end_delegation_return(struct inode *inode, struct nfs_delegation *delegation, int is… in nfs_end_delegation_return() argument
410 if (delegation == NULL) in nfs_end_delegation_return()
413 if (test_bit(NFS_DELEGATION_REVOKED, &delegation->flags)) in nfs_end_delegation_return()
415 err = nfs_delegation_claim_opens(inode, &delegation->stateid, in nfs_end_delegation_return()
416 delegation->type); in nfs_end_delegation_return()
426 nfs_abort_delegation_return(delegation, clp); in nfs_end_delegation_return()
429 if (!nfs_detach_delegation(nfsi, delegation, NFS_SERVER(inode))) in nfs_end_delegation_return()
432 err = nfs_do_return_delegation(inode, delegation, issync); in nfs_end_delegation_return()
437 static bool nfs_delegation_need_return(struct nfs_delegation *delegation) in nfs_delegation_need_return() argument
441 if (test_bit(NFS_DELEGATION_RETURNING, &delegation->flags)) in nfs_delegation_need_return()
443 if (test_and_clear_bit(NFS_DELEGATION_RETURN, &delegation->flags)) in nfs_delegation_need_return()
445 if (test_and_clear_bit(NFS_DELEGATION_RETURN_IF_CLOSED, &delegation->flags) && !ret) { in nfs_delegation_need_return()
448 spin_lock(&delegation->lock); in nfs_delegation_need_return()
449 inode = delegation->inode; in nfs_delegation_need_return()
452 spin_unlock(&delegation->lock); in nfs_delegation_need_return()
470 struct nfs_delegation *delegation; in nfs_client_return_marked_delegations() local
478 list_for_each_entry_rcu(delegation, &server->delegations, in nfs_client_return_marked_delegations()
480 if (!nfs_delegation_need_return(delegation)) in nfs_client_return_marked_delegations()
484 inode = nfs_delegation_grab_inode(delegation); in nfs_client_return_marked_delegations()
490 delegation = nfs_start_delegation_return_locked(NFS_I(inode)); in nfs_client_return_marked_delegations()
493 err = nfs_end_delegation_return(inode, delegation, 0); in nfs_client_return_marked_delegations()
515 struct nfs_delegation *delegation; in nfs_inode_return_delegation_noreclaim() local
517 delegation = nfs_inode_detach_delegation(inode); in nfs_inode_return_delegation_noreclaim()
518 if (delegation != NULL) in nfs_inode_return_delegation_noreclaim()
519 nfs_do_return_delegation(inode, delegation, 1); in nfs_inode_return_delegation_noreclaim()
535 struct nfs_delegation *delegation; in nfs4_inode_return_delegation() local
539 delegation = nfs_start_delegation_return(nfsi); in nfs4_inode_return_delegation()
540 if (delegation != NULL) in nfs4_inode_return_delegation()
541 err = nfs_end_delegation_return(inode, delegation, 1); in nfs4_inode_return_delegation()
546 struct nfs_delegation *delegation) in nfs_mark_return_if_closed_delegation() argument
548 set_bit(NFS_DELEGATION_RETURN_IF_CLOSED, &delegation->flags); in nfs_mark_return_if_closed_delegation()
553 struct nfs_delegation *delegation) in nfs_mark_return_delegation() argument
555 set_bit(NFS_DELEGATION_RETURN, &delegation->flags); in nfs_mark_return_delegation()
561 struct nfs_delegation *delegation; in nfs_server_mark_return_all_delegations() local
564 list_for_each_entry_rcu(delegation, &server->delegations, super_list) { in nfs_server_mark_return_all_delegations()
565 nfs_mark_return_delegation(server, delegation); in nfs_server_mark_return_all_delegations()
624 struct nfs_delegation *delegation; in nfs_mark_return_unused_delegation_types() local
626 list_for_each_entry_rcu(delegation, &server->delegations, super_list) { in nfs_mark_return_unused_delegation_types()
627 if ((delegation->type == (FMODE_READ|FMODE_WRITE)) && !(flags & FMODE_WRITE)) in nfs_mark_return_unused_delegation_types()
629 if (delegation->type & flags) in nfs_mark_return_unused_delegation_types()
630 nfs_mark_return_if_closed_delegation(server, delegation); in nfs_mark_return_unused_delegation_types()
647 struct nfs_delegation *delegation; in nfs_revoke_delegation() local
649 delegation = rcu_dereference(NFS_I(inode)->delegation); in nfs_revoke_delegation()
650 if (delegation != NULL) { in nfs_revoke_delegation()
651 set_bit(NFS_DELEGATION_REVOKED, &delegation->flags); in nfs_revoke_delegation()
652 nfs_mark_return_delegation(NFS_SERVER(inode), delegation); in nfs_revoke_delegation()
659 struct nfs_delegation *delegation; in nfs_remove_bad_delegation() local
662 delegation = nfs_inode_detach_delegation(inode); in nfs_remove_bad_delegation()
663 if (delegation) { in nfs_remove_bad_delegation()
664 nfs_inode_find_state_and_recover(inode, &delegation->stateid); in nfs_remove_bad_delegation()
665 nfs_free_delegation(delegation); in nfs_remove_bad_delegation()
684 struct nfs_delegation *delegation; in nfs_mark_return_unreferenced_delegations() local
686 list_for_each_entry_rcu(delegation, &server->delegations, super_list) { in nfs_mark_return_unreferenced_delegations()
687 if (test_and_clear_bit(NFS_DELEGATION_REFERENCED, &delegation->flags)) in nfs_mark_return_unreferenced_delegations()
689 nfs_mark_return_if_closed_delegation(server, delegation); in nfs_mark_return_unreferenced_delegations()
722 struct nfs_delegation *delegation; in nfs_async_inode_return_delegation() local
725 delegation = rcu_dereference(NFS_I(inode)->delegation); in nfs_async_inode_return_delegation()
726 if (delegation == NULL) in nfs_async_inode_return_delegation()
729 !clp->cl_mvops->match_stateid(&delegation->stateid, stateid)) in nfs_async_inode_return_delegation()
731 nfs_mark_return_delegation(server, delegation); in nfs_async_inode_return_delegation()
745 struct nfs_delegation *delegation; in nfs_delegation_find_inode_server() local
748 list_for_each_entry_rcu(delegation, &server->delegations, super_list) { in nfs_delegation_find_inode_server()
749 spin_lock(&delegation->lock); in nfs_delegation_find_inode_server()
750 if (delegation->inode != NULL && in nfs_delegation_find_inode_server()
751 nfs_compare_fh(fhandle, &NFS_I(delegation->inode)->fh) == 0) { in nfs_delegation_find_inode_server()
752 res = igrab(delegation->inode); in nfs_delegation_find_inode_server()
754 spin_unlock(&delegation->lock); in nfs_delegation_find_inode_server()
787 struct nfs_delegation *delegation; in nfs_delegation_mark_reclaim_server() local
789 list_for_each_entry_rcu(delegation, &server->delegations, super_list) in nfs_delegation_mark_reclaim_server()
790 set_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags); in nfs_delegation_mark_reclaim_server()
815 struct nfs_delegation *delegation; in nfs_delegation_reap_unclaimed() local
822 list_for_each_entry_rcu(delegation, &server->delegations, in nfs_delegation_reap_unclaimed()
825 &delegation->flags)) in nfs_delegation_reap_unclaimed()
828 &delegation->flags) == 0) in nfs_delegation_reap_unclaimed()
832 inode = nfs_delegation_grab_inode(delegation); in nfs_delegation_reap_unclaimed()
838 delegation = nfs_start_delegation_return_locked(NFS_I(inode)); in nfs_delegation_reap_unclaimed()
840 if (delegation != NULL) { in nfs_delegation_reap_unclaimed()
841 delegation = nfs_detach_delegation(NFS_I(inode), in nfs_delegation_reap_unclaimed()
842 delegation, server); in nfs_delegation_reap_unclaimed()
843 if (delegation != NULL) in nfs_delegation_reap_unclaimed()
844 nfs_free_delegation(delegation); in nfs_delegation_reap_unclaimed()
889 struct nfs_delegation *delegation; in nfs4_copy_delegation_stateid() local
894 delegation = rcu_dereference(nfsi->delegation); in nfs4_copy_delegation_stateid()
895 ret = (delegation != NULL && (delegation->type & flags) == flags); in nfs4_copy_delegation_stateid()
897 nfs4_stateid_copy(dst, &delegation->stateid); in nfs4_copy_delegation_stateid()
898 nfs_mark_delegation_referenced(delegation); in nfs4_copy_delegation_stateid()
915 struct nfs_delegation *delegation; in nfs4_delegation_flush_on_close() local
919 delegation = rcu_dereference(nfsi->delegation); in nfs4_delegation_flush_on_close()
920 if (delegation == NULL || !(delegation->type & FMODE_WRITE)) in nfs4_delegation_flush_on_close()
922 if (nfsi->nrequests < delegation->pagemod_limit) in nfs4_delegation_flush_on_close()