Lines Matching refs:delegation
27 static void nfs_free_delegation(struct nfs_delegation *delegation) in nfs_free_delegation() argument
29 if (delegation->cred) { in nfs_free_delegation()
30 put_rpccred(delegation->cred); in nfs_free_delegation()
31 delegation->cred = NULL; in nfs_free_delegation()
33 kfree_rcu(delegation, rcu); in nfs_free_delegation()
41 void nfs_mark_delegation_referenced(struct nfs_delegation *delegation) in nfs_mark_delegation_referenced() argument
43 set_bit(NFS_DELEGATION_REFERENCED, &delegation->flags); in nfs_mark_delegation_referenced()
47 nfs4_is_valid_delegation(const struct nfs_delegation *delegation, in nfs4_is_valid_delegation() argument
50 if (delegation != NULL && (delegation->type & flags) == flags && in nfs4_is_valid_delegation()
51 !test_bit(NFS_DELEGATION_REVOKED, &delegation->flags) && in nfs4_is_valid_delegation()
52 !test_bit(NFS_DELEGATION_RETURNING, &delegation->flags)) in nfs4_is_valid_delegation()
60 struct nfs_delegation *delegation; in nfs4_do_check_delegation() local
65 delegation = rcu_dereference(NFS_I(inode)->delegation); in nfs4_do_check_delegation()
66 if (nfs4_is_valid_delegation(delegation, flags)) { in nfs4_do_check_delegation()
68 nfs_mark_delegation_referenced(delegation); in nfs4_do_check_delegation()
185 struct nfs_delegation *delegation; in nfs_inode_reclaim_delegation() local
189 delegation = rcu_dereference(NFS_I(inode)->delegation); in nfs_inode_reclaim_delegation()
190 if (delegation != NULL) { in nfs_inode_reclaim_delegation()
191 spin_lock(&delegation->lock); in nfs_inode_reclaim_delegation()
192 if (delegation->inode != NULL) { in nfs_inode_reclaim_delegation()
193 nfs4_stateid_copy(&delegation->stateid, stateid); in nfs_inode_reclaim_delegation()
194 delegation->type = type; in nfs_inode_reclaim_delegation()
195 delegation->pagemod_limit = pagemod_limit; in nfs_inode_reclaim_delegation()
196 oldcred = delegation->cred; in nfs_inode_reclaim_delegation()
197 delegation->cred = get_rpccred(cred); in nfs_inode_reclaim_delegation()
199 &delegation->flags); in nfs_inode_reclaim_delegation()
200 spin_unlock(&delegation->lock); in nfs_inode_reclaim_delegation()
207 spin_unlock(&delegation->lock); in nfs_inode_reclaim_delegation()
213 static int nfs_do_return_delegation(struct inode *inode, struct nfs_delegation *delegation, int iss… in nfs_do_return_delegation() argument
217 if (!test_bit(NFS_DELEGATION_REVOKED, &delegation->flags)) in nfs_do_return_delegation()
219 delegation->cred, in nfs_do_return_delegation()
220 &delegation->stateid, in nfs_do_return_delegation()
222 nfs_free_delegation(delegation); in nfs_do_return_delegation()
226 static struct inode *nfs_delegation_grab_inode(struct nfs_delegation *delegation) in nfs_delegation_grab_inode() argument
230 spin_lock(&delegation->lock); in nfs_delegation_grab_inode()
231 if (delegation->inode != NULL) in nfs_delegation_grab_inode()
232 inode = igrab(delegation->inode); in nfs_delegation_grab_inode()
233 spin_unlock(&delegation->lock); in nfs_delegation_grab_inode()
241 struct nfs_delegation *delegation = rcu_dereference(nfsi->delegation); in nfs_start_delegation_return_locked() local
243 if (delegation == NULL) in nfs_start_delegation_return_locked()
245 spin_lock(&delegation->lock); in nfs_start_delegation_return_locked()
246 if (!test_and_set_bit(NFS_DELEGATION_RETURNING, &delegation->flags)) in nfs_start_delegation_return_locked()
247 ret = delegation; in nfs_start_delegation_return_locked()
248 spin_unlock(&delegation->lock); in nfs_start_delegation_return_locked()
256 struct nfs_delegation *delegation; in nfs_start_delegation_return() local
259 delegation = nfs_start_delegation_return_locked(nfsi); in nfs_start_delegation_return()
261 return delegation; in nfs_start_delegation_return()
265 nfs_abort_delegation_return(struct nfs_delegation *delegation, in nfs_abort_delegation_return() argument
269 spin_lock(&delegation->lock); in nfs_abort_delegation_return()
270 clear_bit(NFS_DELEGATION_RETURNING, &delegation->flags); in nfs_abort_delegation_return()
271 set_bit(NFS_DELEGATION_RETURN, &delegation->flags); in nfs_abort_delegation_return()
272 spin_unlock(&delegation->lock); in nfs_abort_delegation_return()
278 struct nfs_delegation *delegation, in nfs_detach_delegation_locked() argument
282 rcu_dereference_protected(nfsi->delegation, in nfs_detach_delegation_locked()
285 if (deleg_cur == NULL || delegation != deleg_cur) in nfs_detach_delegation_locked()
288 spin_lock(&delegation->lock); in nfs_detach_delegation_locked()
289 set_bit(NFS_DELEGATION_RETURNING, &delegation->flags); in nfs_detach_delegation_locked()
290 list_del_rcu(&delegation->super_list); in nfs_detach_delegation_locked()
291 delegation->inode = NULL; in nfs_detach_delegation_locked()
292 rcu_assign_pointer(nfsi->delegation, NULL); in nfs_detach_delegation_locked()
293 spin_unlock(&delegation->lock); in nfs_detach_delegation_locked()
294 return delegation; in nfs_detach_delegation_locked()
298 struct nfs_delegation *delegation, in nfs_detach_delegation() argument
304 delegation = nfs_detach_delegation_locked(nfsi, delegation, clp); in nfs_detach_delegation()
306 return delegation; in nfs_detach_delegation()
314 struct nfs_delegation *delegation; in nfs_inode_detach_delegation() local
316 delegation = nfs_start_delegation_return(nfsi); in nfs_inode_detach_delegation()
317 if (delegation == NULL) in nfs_inode_detach_delegation()
319 return nfs_detach_delegation(nfsi, delegation, server); in nfs_inode_detach_delegation()
323 nfs_update_inplace_delegation(struct nfs_delegation *delegation, in nfs_update_inplace_delegation() argument
326 if (nfs4_stateid_is_newer(&update->stateid, &delegation->stateid)) { in nfs_update_inplace_delegation()
327 delegation->stateid.seqid = update->stateid.seqid; in nfs_update_inplace_delegation()
329 delegation->type = update->type; in nfs_update_inplace_delegation()
351 struct nfs_delegation *delegation, *old_delegation; in nfs_inode_set_delegation() local
355 delegation = kmalloc(sizeof(*delegation), GFP_NOFS); in nfs_inode_set_delegation()
356 if (delegation == NULL) in nfs_inode_set_delegation()
358 nfs4_stateid_copy(&delegation->stateid, stateid); in nfs_inode_set_delegation()
359 delegation->type = type; in nfs_inode_set_delegation()
360 delegation->pagemod_limit = pagemod_limit; in nfs_inode_set_delegation()
361 delegation->change_attr = inode_peek_iversion_raw(inode); in nfs_inode_set_delegation()
362 delegation->cred = get_rpccred(cred); in nfs_inode_set_delegation()
363 delegation->inode = inode; in nfs_inode_set_delegation()
364 delegation->flags = 1<<NFS_DELEGATION_REFERENCED; in nfs_inode_set_delegation()
365 spin_lock_init(&delegation->lock); in nfs_inode_set_delegation()
368 old_delegation = rcu_dereference_protected(nfsi->delegation, in nfs_inode_set_delegation()
373 &delegation->stateid)) { in nfs_inode_set_delegation()
375 delegation); in nfs_inode_set_delegation()
387 if (delegation->type == old_delegation->type || in nfs_inode_set_delegation()
388 !(delegation->type & FMODE_WRITE)) { in nfs_inode_set_delegation()
389 freeme = delegation; in nfs_inode_set_delegation()
390 delegation = NULL; in nfs_inode_set_delegation()
401 list_add_tail_rcu(&delegation->super_list, &server->delegations); in nfs_inode_set_delegation()
402 rcu_assign_pointer(nfsi->delegation, delegation); in nfs_inode_set_delegation()
403 delegation = NULL; in nfs_inode_set_delegation()
413 if (delegation != NULL) in nfs_inode_set_delegation()
414 nfs_free_delegation(delegation); in nfs_inode_set_delegation()
423 static int nfs_end_delegation_return(struct inode *inode, struct nfs_delegation *delegation, int is… in nfs_end_delegation_return() argument
429 if (delegation == NULL) in nfs_end_delegation_return()
432 if (test_bit(NFS_DELEGATION_REVOKED, &delegation->flags)) in nfs_end_delegation_return()
434 err = nfs_delegation_claim_opens(inode, &delegation->stateid, in nfs_end_delegation_return()
435 delegation->type); in nfs_end_delegation_return()
445 nfs_abort_delegation_return(delegation, clp); in nfs_end_delegation_return()
448 if (!nfs_detach_delegation(nfsi, delegation, NFS_SERVER(inode))) in nfs_end_delegation_return()
451 err = nfs_do_return_delegation(inode, delegation, issync); in nfs_end_delegation_return()
456 static bool nfs_delegation_need_return(struct nfs_delegation *delegation) in nfs_delegation_need_return() argument
460 if (test_bit(NFS_DELEGATION_RETURNING, &delegation->flags)) in nfs_delegation_need_return()
462 if (test_and_clear_bit(NFS_DELEGATION_RETURN, &delegation->flags)) in nfs_delegation_need_return()
464 if (test_and_clear_bit(NFS_DELEGATION_RETURN_IF_CLOSED, &delegation->flags) && !ret) { in nfs_delegation_need_return()
467 spin_lock(&delegation->lock); in nfs_delegation_need_return()
468 inode = delegation->inode; in nfs_delegation_need_return()
471 spin_unlock(&delegation->lock); in nfs_delegation_need_return()
489 struct nfs_delegation *delegation; in nfs_client_return_marked_delegations() local
516 delegation = NULL; in nfs_client_return_marked_delegations()
518 delegation = rcu_dereference(NFS_I(place_holder)->delegation); in nfs_client_return_marked_delegations()
519 if (!delegation || delegation != place_holder_deleg) in nfs_client_return_marked_delegations()
520 delegation = list_entry_rcu(server->delegations.next, in nfs_client_return_marked_delegations()
522 list_for_each_entry_from_rcu(delegation, &server->delegations, super_list) { in nfs_client_return_marked_delegations()
525 if (!nfs_delegation_need_return(delegation)) { in nfs_client_return_marked_delegations()
526 prev = delegation; in nfs_client_return_marked_delegations()
543 inode = nfs_delegation_grab_inode(delegation); in nfs_client_return_marked_delegations()
551 delegation = nfs_start_delegation_return_locked(NFS_I(inode)); in nfs_client_return_marked_delegations()
557 err = nfs_end_delegation_return(inode, delegation, 0); in nfs_client_return_marked_delegations()
584 struct nfs_delegation *delegation; in nfs_inode_return_delegation_noreclaim() local
586 delegation = nfs_inode_detach_delegation(inode); in nfs_inode_return_delegation_noreclaim()
587 if (delegation != NULL) in nfs_inode_return_delegation_noreclaim()
588 nfs_do_return_delegation(inode, delegation, 1); in nfs_inode_return_delegation_noreclaim()
604 struct nfs_delegation *delegation; in nfs4_inode_return_delegation() local
608 delegation = nfs_start_delegation_return(nfsi); in nfs4_inode_return_delegation()
609 if (delegation != NULL) in nfs4_inode_return_delegation()
610 err = nfs_end_delegation_return(inode, delegation, 1); in nfs4_inode_return_delegation()
631 struct nfs_delegation *delegation) in nfs_mark_return_if_closed_delegation() argument
633 set_bit(NFS_DELEGATION_RETURN_IF_CLOSED, &delegation->flags); in nfs_mark_return_if_closed_delegation()
638 struct nfs_delegation *delegation) in nfs_mark_return_delegation() argument
640 set_bit(NFS_DELEGATION_RETURN, &delegation->flags); in nfs_mark_return_delegation()
646 struct nfs_delegation *delegation; in nfs_server_mark_return_all_delegations() local
649 list_for_each_entry_rcu(delegation, &server->delegations, super_list) { in nfs_server_mark_return_all_delegations()
650 nfs_mark_return_delegation(server, delegation); in nfs_server_mark_return_all_delegations()
709 struct nfs_delegation *delegation; in nfs_mark_return_unused_delegation_types() local
711 list_for_each_entry_rcu(delegation, &server->delegations, super_list) { in nfs_mark_return_unused_delegation_types()
712 if ((delegation->type == (FMODE_READ|FMODE_WRITE)) && !(flags & FMODE_WRITE)) in nfs_mark_return_unused_delegation_types()
714 if (delegation->type & flags) in nfs_mark_return_unused_delegation_types()
715 nfs_mark_return_if_closed_delegation(server, delegation); in nfs_mark_return_unused_delegation_types()
731 struct nfs_delegation *delegation) in nfs_mark_delegation_revoked() argument
733 set_bit(NFS_DELEGATION_REVOKED, &delegation->flags); in nfs_mark_delegation_revoked()
734 delegation->stateid.type = NFS4_INVALID_STATEID_TYPE; in nfs_mark_delegation_revoked()
735 nfs_mark_return_delegation(server, delegation); in nfs_mark_delegation_revoked()
741 struct nfs_delegation *delegation; in nfs_revoke_delegation() local
746 delegation = rcu_dereference(NFS_I(inode)->delegation); in nfs_revoke_delegation()
747 if (delegation == NULL) in nfs_revoke_delegation()
750 nfs4_stateid_copy(&tmp, &delegation->stateid); in nfs_revoke_delegation()
752 } else if (!nfs4_stateid_match(stateid, &delegation->stateid)) in nfs_revoke_delegation()
754 nfs_mark_delegation_revoked(NFS_SERVER(inode), delegation); in nfs_revoke_delegation()
766 struct nfs_delegation *delegation; in nfs_remove_bad_delegation() local
770 delegation = nfs_inode_detach_delegation(inode); in nfs_remove_bad_delegation()
771 if (delegation) in nfs_remove_bad_delegation()
772 nfs_free_delegation(delegation); in nfs_remove_bad_delegation()
790 struct nfs_delegation *delegation; in nfs_mark_return_unreferenced_delegations() local
792 list_for_each_entry_rcu(delegation, &server->delegations, super_list) { in nfs_mark_return_unreferenced_delegations()
793 if (test_and_clear_bit(NFS_DELEGATION_REFERENCED, &delegation->flags)) in nfs_mark_return_unreferenced_delegations()
795 nfs_mark_return_if_closed_delegation(server, delegation); in nfs_mark_return_unreferenced_delegations()
828 struct nfs_delegation *delegation; in nfs_async_inode_return_delegation() local
831 delegation = rcu_dereference(NFS_I(inode)->delegation); in nfs_async_inode_return_delegation()
832 if (delegation == NULL) in nfs_async_inode_return_delegation()
835 !clp->cl_mvops->match_stateid(&delegation->stateid, stateid)) in nfs_async_inode_return_delegation()
837 nfs_mark_return_delegation(server, delegation); in nfs_async_inode_return_delegation()
851 struct nfs_delegation *delegation; in nfs_delegation_find_inode_server() local
854 list_for_each_entry_rcu(delegation, &server->delegations, super_list) { in nfs_delegation_find_inode_server()
855 spin_lock(&delegation->lock); in nfs_delegation_find_inode_server()
856 if (delegation->inode != NULL && in nfs_delegation_find_inode_server()
857 nfs_compare_fh(fhandle, &NFS_I(delegation->inode)->fh) == 0) { in nfs_delegation_find_inode_server()
858 res = igrab(delegation->inode); in nfs_delegation_find_inode_server()
859 spin_unlock(&delegation->lock); in nfs_delegation_find_inode_server()
864 spin_unlock(&delegation->lock); in nfs_delegation_find_inode_server()
897 struct nfs_delegation *delegation; in nfs_delegation_mark_reclaim_server() local
899 list_for_each_entry_rcu(delegation, &server->delegations, super_list) { in nfs_delegation_mark_reclaim_server()
904 if (test_bit(NFS_DELEGATION_TEST_EXPIRED, &delegation->flags)) in nfs_delegation_mark_reclaim_server()
906 set_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags); in nfs_delegation_mark_reclaim_server()
932 struct nfs_delegation *delegation; in nfs_delegation_reap_unclaimed() local
939 list_for_each_entry_rcu(delegation, &server->delegations, in nfs_delegation_reap_unclaimed()
942 &delegation->flags)) in nfs_delegation_reap_unclaimed()
945 &delegation->flags) == 0) in nfs_delegation_reap_unclaimed()
949 inode = nfs_delegation_grab_inode(delegation); in nfs_delegation_reap_unclaimed()
955 delegation = nfs_start_delegation_return_locked(NFS_I(inode)); in nfs_delegation_reap_unclaimed()
957 if (delegation != NULL) { in nfs_delegation_reap_unclaimed()
958 delegation = nfs_detach_delegation(NFS_I(inode), in nfs_delegation_reap_unclaimed()
959 delegation, server); in nfs_delegation_reap_unclaimed()
960 if (delegation != NULL) in nfs_delegation_reap_unclaimed()
961 nfs_free_delegation(delegation); in nfs_delegation_reap_unclaimed()
980 struct nfs_delegation *delegation) in nfs_mark_test_expired_delegation() argument
982 if (delegation->stateid.type == NFS4_INVALID_STATEID_TYPE) in nfs_mark_test_expired_delegation()
984 clear_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags); in nfs_mark_test_expired_delegation()
985 set_bit(NFS_DELEGATION_TEST_EXPIRED, &delegation->flags); in nfs_mark_test_expired_delegation()
992 struct nfs_delegation *delegation; in nfs_inode_mark_test_expired_delegation() local
995 delegation = rcu_dereference(NFS_I(inode)->delegation); in nfs_inode_mark_test_expired_delegation()
996 if (delegation) in nfs_inode_mark_test_expired_delegation()
997 nfs_mark_test_expired_delegation(server, delegation); in nfs_inode_mark_test_expired_delegation()
1004 struct nfs_delegation *delegation; in nfs_delegation_mark_test_expired_server() local
1006 list_for_each_entry_rcu(delegation, &server->delegations, super_list) in nfs_delegation_mark_test_expired_server()
1007 nfs_mark_test_expired_delegation(server, delegation); in nfs_delegation_mark_test_expired_server()
1039 struct nfs_delegation *delegation; in nfs_reap_expired_delegations() local
1048 list_for_each_entry_rcu(delegation, &server->delegations, in nfs_reap_expired_delegations()
1051 &delegation->flags)) in nfs_reap_expired_delegations()
1054 &delegation->flags) == 0) in nfs_reap_expired_delegations()
1058 inode = nfs_delegation_grab_inode(delegation); in nfs_reap_expired_delegations()
1064 cred = get_rpccred_rcu(delegation->cred); in nfs_reap_expired_delegations()
1065 nfs4_stateid_copy(&stateid, &delegation->stateid); in nfs_reap_expired_delegations()
1066 clear_bit(NFS_DELEGATION_TEST_EXPIRED, &delegation->flags); in nfs_reap_expired_delegations()
1093 struct nfs_delegation *delegation; in nfs_inode_find_delegation_state_and_recover() local
1097 delegation = rcu_dereference(NFS_I(inode)->delegation); in nfs_inode_find_delegation_state_and_recover()
1098 if (delegation && in nfs_inode_find_delegation_state_and_recover()
1099 nfs4_stateid_match_other(&delegation->stateid, stateid)) { in nfs_inode_find_delegation_state_and_recover()
1100 nfs_mark_test_expired_delegation(NFS_SERVER(inode), delegation); in nfs_inode_find_delegation_state_and_recover()
1140 struct nfs_delegation *delegation; in nfs4_refresh_delegation_stateid() local
1146 delegation = rcu_dereference(NFS_I(inode)->delegation); in nfs4_refresh_delegation_stateid()
1147 if (delegation != NULL && in nfs4_refresh_delegation_stateid()
1148 nfs4_stateid_match_other(dst, &delegation->stateid)) { in nfs4_refresh_delegation_stateid()
1149 dst->seqid = delegation->stateid.seqid; in nfs4_refresh_delegation_stateid()
1171 struct nfs_delegation *delegation; in nfs4_copy_delegation_stateid() local
1176 delegation = rcu_dereference(nfsi->delegation); in nfs4_copy_delegation_stateid()
1177 ret = nfs4_is_valid_delegation(delegation, flags); in nfs4_copy_delegation_stateid()
1179 nfs4_stateid_copy(dst, &delegation->stateid); in nfs4_copy_delegation_stateid()
1180 nfs_mark_delegation_referenced(delegation); in nfs4_copy_delegation_stateid()
1182 *cred = get_rpccred(delegation->cred); in nfs4_copy_delegation_stateid()
1199 struct nfs_delegation *delegation; in nfs4_delegation_flush_on_close() local
1203 delegation = rcu_dereference(nfsi->delegation); in nfs4_delegation_flush_on_close()
1204 if (delegation == NULL || !(delegation->type & FMODE_WRITE)) in nfs4_delegation_flush_on_close()
1206 if (atomic_long_read(&nfsi->nrequests) < delegation->pagemod_limit) in nfs4_delegation_flush_on_close()