Lines Matching refs:delegation
28 static void nfs_free_delegation(struct nfs_delegation *delegation) in nfs_free_delegation() argument
30 put_cred(delegation->cred); in nfs_free_delegation()
31 delegation->cred = NULL; in nfs_free_delegation()
32 kfree_rcu(delegation, rcu); in nfs_free_delegation()
40 void nfs_mark_delegation_referenced(struct nfs_delegation *delegation) in nfs_mark_delegation_referenced() argument
42 set_bit(NFS_DELEGATION_REFERENCED, &delegation->flags); in nfs_mark_delegation_referenced()
46 nfs4_is_valid_delegation(const struct nfs_delegation *delegation, in nfs4_is_valid_delegation() argument
49 if (delegation != NULL && (delegation->type & flags) == flags && in nfs4_is_valid_delegation()
50 !test_bit(NFS_DELEGATION_REVOKED, &delegation->flags) && in nfs4_is_valid_delegation()
51 !test_bit(NFS_DELEGATION_RETURNING, &delegation->flags)) in nfs4_is_valid_delegation()
58 struct nfs_delegation *delegation; in nfs4_get_valid_delegation() local
60 delegation = rcu_dereference(NFS_I(inode)->delegation); in nfs4_get_valid_delegation()
61 if (nfs4_is_valid_delegation(delegation, 0)) in nfs4_get_valid_delegation()
62 return delegation; in nfs4_get_valid_delegation()
69 struct nfs_delegation *delegation; in nfs4_do_check_delegation() local
74 delegation = rcu_dereference(NFS_I(inode)->delegation); in nfs4_do_check_delegation()
75 if (nfs4_is_valid_delegation(delegation, flags)) { in nfs4_do_check_delegation()
77 nfs_mark_delegation_referenced(delegation); in nfs4_do_check_delegation()
195 struct nfs_delegation *delegation; in nfs_inode_reclaim_delegation() local
199 delegation = rcu_dereference(NFS_I(inode)->delegation); in nfs_inode_reclaim_delegation()
200 if (delegation != NULL) { in nfs_inode_reclaim_delegation()
201 spin_lock(&delegation->lock); in nfs_inode_reclaim_delegation()
202 if (delegation->inode != NULL) { in nfs_inode_reclaim_delegation()
203 nfs4_stateid_copy(&delegation->stateid, stateid); in nfs_inode_reclaim_delegation()
204 delegation->type = type; in nfs_inode_reclaim_delegation()
205 delegation->pagemod_limit = pagemod_limit; in nfs_inode_reclaim_delegation()
206 oldcred = delegation->cred; in nfs_inode_reclaim_delegation()
207 delegation->cred = get_cred(cred); in nfs_inode_reclaim_delegation()
209 &delegation->flags); in nfs_inode_reclaim_delegation()
210 spin_unlock(&delegation->lock); in nfs_inode_reclaim_delegation()
217 spin_unlock(&delegation->lock); in nfs_inode_reclaim_delegation()
223 static int nfs_do_return_delegation(struct inode *inode, struct nfs_delegation *delegation, int iss… in nfs_do_return_delegation() argument
227 if (!test_bit(NFS_DELEGATION_REVOKED, &delegation->flags)) in nfs_do_return_delegation()
229 delegation->cred, in nfs_do_return_delegation()
230 &delegation->stateid, in nfs_do_return_delegation()
232 nfs_free_delegation(delegation); in nfs_do_return_delegation()
236 static struct inode *nfs_delegation_grab_inode(struct nfs_delegation *delegation) in nfs_delegation_grab_inode() argument
240 spin_lock(&delegation->lock); in nfs_delegation_grab_inode()
241 if (delegation->inode != NULL) in nfs_delegation_grab_inode()
242 inode = igrab(delegation->inode); in nfs_delegation_grab_inode()
244 set_bit(NFS_DELEGATION_INODE_FREEING, &delegation->flags); in nfs_delegation_grab_inode()
245 spin_unlock(&delegation->lock); in nfs_delegation_grab_inode()
253 struct nfs_delegation *delegation = rcu_dereference(nfsi->delegation); in nfs_start_delegation_return_locked() local
255 if (delegation == NULL) in nfs_start_delegation_return_locked()
257 spin_lock(&delegation->lock); in nfs_start_delegation_return_locked()
258 if (!test_and_set_bit(NFS_DELEGATION_RETURNING, &delegation->flags)) in nfs_start_delegation_return_locked()
259 ret = delegation; in nfs_start_delegation_return_locked()
260 spin_unlock(&delegation->lock); in nfs_start_delegation_return_locked()
268 struct nfs_delegation *delegation; in nfs_start_delegation_return() local
271 delegation = nfs_start_delegation_return_locked(nfsi); in nfs_start_delegation_return()
273 return delegation; in nfs_start_delegation_return()
277 nfs_abort_delegation_return(struct nfs_delegation *delegation, in nfs_abort_delegation_return() argument
281 spin_lock(&delegation->lock); in nfs_abort_delegation_return()
282 clear_bit(NFS_DELEGATION_RETURNING, &delegation->flags); in nfs_abort_delegation_return()
283 set_bit(NFS_DELEGATION_RETURN, &delegation->flags); in nfs_abort_delegation_return()
284 spin_unlock(&delegation->lock); in nfs_abort_delegation_return()
290 struct nfs_delegation *delegation, in nfs_detach_delegation_locked() argument
294 rcu_dereference_protected(nfsi->delegation, in nfs_detach_delegation_locked()
297 if (deleg_cur == NULL || delegation != deleg_cur) in nfs_detach_delegation_locked()
300 spin_lock(&delegation->lock); in nfs_detach_delegation_locked()
301 set_bit(NFS_DELEGATION_RETURNING, &delegation->flags); in nfs_detach_delegation_locked()
302 list_del_rcu(&delegation->super_list); in nfs_detach_delegation_locked()
303 delegation->inode = NULL; in nfs_detach_delegation_locked()
304 rcu_assign_pointer(nfsi->delegation, NULL); in nfs_detach_delegation_locked()
305 spin_unlock(&delegation->lock); in nfs_detach_delegation_locked()
306 return delegation; in nfs_detach_delegation_locked()
310 struct nfs_delegation *delegation, in nfs_detach_delegation() argument
316 delegation = nfs_detach_delegation_locked(nfsi, delegation, clp); in nfs_detach_delegation()
318 return delegation; in nfs_detach_delegation()
326 struct nfs_delegation *delegation; in nfs_inode_detach_delegation() local
328 delegation = nfs_start_delegation_return(nfsi); in nfs_inode_detach_delegation()
329 if (delegation == NULL) in nfs_inode_detach_delegation()
331 return nfs_detach_delegation(nfsi, delegation, server); in nfs_inode_detach_delegation()
335 nfs_update_inplace_delegation(struct nfs_delegation *delegation, in nfs_update_inplace_delegation() argument
338 if (nfs4_stateid_is_newer(&update->stateid, &delegation->stateid)) { in nfs_update_inplace_delegation()
339 delegation->stateid.seqid = update->stateid.seqid; in nfs_update_inplace_delegation()
341 delegation->type = update->type; in nfs_update_inplace_delegation()
363 struct nfs_delegation *delegation, *old_delegation; in nfs_inode_set_delegation() local
367 delegation = kmalloc(sizeof(*delegation), GFP_NOFS); in nfs_inode_set_delegation()
368 if (delegation == NULL) in nfs_inode_set_delegation()
370 nfs4_stateid_copy(&delegation->stateid, stateid); in nfs_inode_set_delegation()
371 delegation->type = type; in nfs_inode_set_delegation()
372 delegation->pagemod_limit = pagemod_limit; in nfs_inode_set_delegation()
373 delegation->change_attr = inode_peek_iversion_raw(inode); in nfs_inode_set_delegation()
374 delegation->cred = get_cred(cred); in nfs_inode_set_delegation()
375 delegation->inode = inode; in nfs_inode_set_delegation()
376 delegation->flags = 1<<NFS_DELEGATION_REFERENCED; in nfs_inode_set_delegation()
377 spin_lock_init(&delegation->lock); in nfs_inode_set_delegation()
380 old_delegation = rcu_dereference_protected(nfsi->delegation, in nfs_inode_set_delegation()
385 &delegation->stateid)) { in nfs_inode_set_delegation()
387 delegation); in nfs_inode_set_delegation()
399 if (delegation->type == old_delegation->type || in nfs_inode_set_delegation()
400 !(delegation->type & FMODE_WRITE)) { in nfs_inode_set_delegation()
401 freeme = delegation; in nfs_inode_set_delegation()
402 delegation = NULL; in nfs_inode_set_delegation()
413 list_add_tail_rcu(&delegation->super_list, &server->delegations); in nfs_inode_set_delegation()
414 rcu_assign_pointer(nfsi->delegation, delegation); in nfs_inode_set_delegation()
415 delegation = NULL; in nfs_inode_set_delegation()
425 if (delegation != NULL) in nfs_inode_set_delegation()
426 nfs_free_delegation(delegation); in nfs_inode_set_delegation()
435 static int nfs_end_delegation_return(struct inode *inode, struct nfs_delegation *delegation, int is… in nfs_end_delegation_return() argument
441 if (delegation == NULL) in nfs_end_delegation_return()
444 if (test_bit(NFS_DELEGATION_REVOKED, &delegation->flags)) in nfs_end_delegation_return()
446 err = nfs_delegation_claim_opens(inode, &delegation->stateid, in nfs_end_delegation_return()
447 delegation->type); in nfs_end_delegation_return()
457 nfs_abort_delegation_return(delegation, clp); in nfs_end_delegation_return()
460 if (!nfs_detach_delegation(nfsi, delegation, NFS_SERVER(inode))) in nfs_end_delegation_return()
463 err = nfs_do_return_delegation(inode, delegation, issync); in nfs_end_delegation_return()
468 static bool nfs_delegation_need_return(struct nfs_delegation *delegation) in nfs_delegation_need_return() argument
472 if (test_bit(NFS_DELEGATION_RETURNING, &delegation->flags)) in nfs_delegation_need_return()
474 if (test_and_clear_bit(NFS_DELEGATION_RETURN, &delegation->flags)) in nfs_delegation_need_return()
476 if (test_and_clear_bit(NFS_DELEGATION_RETURN_IF_CLOSED, &delegation->flags) && !ret) { in nfs_delegation_need_return()
479 spin_lock(&delegation->lock); in nfs_delegation_need_return()
480 inode = delegation->inode; in nfs_delegation_need_return()
483 spin_unlock(&delegation->lock); in nfs_delegation_need_return()
501 struct nfs_delegation *delegation; in nfs_client_return_marked_delegations() local
528 delegation = NULL; in nfs_client_return_marked_delegations()
530 delegation = rcu_dereference(NFS_I(place_holder)->delegation); in nfs_client_return_marked_delegations()
531 if (!delegation || delegation != place_holder_deleg) in nfs_client_return_marked_delegations()
532 delegation = list_entry_rcu(server->delegations.next, in nfs_client_return_marked_delegations()
534 list_for_each_entry_from_rcu(delegation, &server->delegations, super_list) { in nfs_client_return_marked_delegations()
537 if (!nfs_delegation_need_return(delegation)) { in nfs_client_return_marked_delegations()
538 prev = delegation; in nfs_client_return_marked_delegations()
555 inode = nfs_delegation_grab_inode(delegation); in nfs_client_return_marked_delegations()
563 delegation = nfs_start_delegation_return_locked(NFS_I(inode)); in nfs_client_return_marked_delegations()
569 err = nfs_end_delegation_return(inode, delegation, 0); in nfs_client_return_marked_delegations()
596 struct nfs_delegation *delegation; in nfs_inode_return_delegation_noreclaim() local
598 delegation = nfs_inode_detach_delegation(inode); in nfs_inode_return_delegation_noreclaim()
599 if (delegation != NULL) in nfs_inode_return_delegation_noreclaim()
600 nfs_do_return_delegation(inode, delegation, 1); in nfs_inode_return_delegation_noreclaim()
616 struct nfs_delegation *delegation; in nfs4_inode_return_delegation() local
620 delegation = nfs_start_delegation_return(nfsi); in nfs4_inode_return_delegation()
621 if (delegation != NULL) in nfs4_inode_return_delegation()
622 err = nfs_end_delegation_return(inode, delegation, 1); in nfs4_inode_return_delegation()
643 struct nfs_delegation *delegation) in nfs_mark_return_if_closed_delegation() argument
645 set_bit(NFS_DELEGATION_RETURN_IF_CLOSED, &delegation->flags); in nfs_mark_return_if_closed_delegation()
650 struct nfs_delegation *delegation) in nfs_mark_return_delegation() argument
652 set_bit(NFS_DELEGATION_RETURN, &delegation->flags); in nfs_mark_return_delegation()
658 struct nfs_delegation *delegation; in nfs_server_mark_return_all_delegations() local
661 list_for_each_entry_rcu(delegation, &server->delegations, super_list) { in nfs_server_mark_return_all_delegations()
662 nfs_mark_return_delegation(server, delegation); in nfs_server_mark_return_all_delegations()
721 struct nfs_delegation *delegation; in nfs_mark_return_unused_delegation_types() local
723 list_for_each_entry_rcu(delegation, &server->delegations, super_list) { in nfs_mark_return_unused_delegation_types()
724 if ((delegation->type == (FMODE_READ|FMODE_WRITE)) && !(flags & FMODE_WRITE)) in nfs_mark_return_unused_delegation_types()
726 if (delegation->type & flags) in nfs_mark_return_unused_delegation_types()
727 nfs_mark_return_if_closed_delegation(server, delegation); in nfs_mark_return_unused_delegation_types()
743 struct nfs_delegation *delegation) in nfs_mark_delegation_revoked() argument
745 set_bit(NFS_DELEGATION_REVOKED, &delegation->flags); in nfs_mark_delegation_revoked()
746 delegation->stateid.type = NFS4_INVALID_STATEID_TYPE; in nfs_mark_delegation_revoked()
747 nfs_mark_return_delegation(server, delegation); in nfs_mark_delegation_revoked()
753 struct nfs_delegation *delegation; in nfs_revoke_delegation() local
758 delegation = rcu_dereference(NFS_I(inode)->delegation); in nfs_revoke_delegation()
759 if (delegation == NULL) in nfs_revoke_delegation()
762 nfs4_stateid_copy(&tmp, &delegation->stateid); in nfs_revoke_delegation()
764 } else if (!nfs4_stateid_match(stateid, &delegation->stateid)) in nfs_revoke_delegation()
766 nfs_mark_delegation_revoked(NFS_SERVER(inode), delegation); in nfs_revoke_delegation()
778 struct nfs_delegation *delegation; in nfs_remove_bad_delegation() local
782 delegation = nfs_inode_detach_delegation(inode); in nfs_remove_bad_delegation()
783 if (delegation) in nfs_remove_bad_delegation()
784 nfs_free_delegation(delegation); in nfs_remove_bad_delegation()
802 struct nfs_delegation *delegation; in nfs_mark_return_unreferenced_delegations() local
804 list_for_each_entry_rcu(delegation, &server->delegations, super_list) { in nfs_mark_return_unreferenced_delegations()
805 if (test_and_clear_bit(NFS_DELEGATION_REFERENCED, &delegation->flags)) in nfs_mark_return_unreferenced_delegations()
807 nfs_mark_return_if_closed_delegation(server, delegation); in nfs_mark_return_unreferenced_delegations()
840 struct nfs_delegation *delegation; in nfs_async_inode_return_delegation() local
843 delegation = rcu_dereference(NFS_I(inode)->delegation); in nfs_async_inode_return_delegation()
844 if (delegation == NULL) in nfs_async_inode_return_delegation()
847 !clp->cl_mvops->match_stateid(&delegation->stateid, stateid)) in nfs_async_inode_return_delegation()
849 nfs_mark_return_delegation(server, delegation); in nfs_async_inode_return_delegation()
863 struct nfs_delegation *delegation; in nfs_delegation_find_inode_server() local
866 list_for_each_entry_rcu(delegation, &server->delegations, super_list) { in nfs_delegation_find_inode_server()
867 spin_lock(&delegation->lock); in nfs_delegation_find_inode_server()
868 if (delegation->inode != NULL && in nfs_delegation_find_inode_server()
869 nfs_compare_fh(fhandle, &NFS_I(delegation->inode)->fh) == 0) { in nfs_delegation_find_inode_server()
870 freeme = igrab(delegation->inode); in nfs_delegation_find_inode_server()
873 spin_unlock(&delegation->lock); in nfs_delegation_find_inode_server()
883 spin_unlock(&delegation->lock); in nfs_delegation_find_inode_server()
916 struct nfs_delegation *delegation; in nfs_delegation_mark_reclaim_server() local
918 list_for_each_entry_rcu(delegation, &server->delegations, super_list) { in nfs_delegation_mark_reclaim_server()
923 if (test_bit(NFS_DELEGATION_TEST_EXPIRED, &delegation->flags)) in nfs_delegation_mark_reclaim_server()
925 set_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags); in nfs_delegation_mark_reclaim_server()
951 struct nfs_delegation *delegation; in nfs_delegation_reap_unclaimed() local
958 list_for_each_entry_rcu(delegation, &server->delegations, in nfs_delegation_reap_unclaimed()
961 &delegation->flags) || in nfs_delegation_reap_unclaimed()
963 &delegation->flags) || in nfs_delegation_reap_unclaimed()
965 &delegation->flags) == 0) in nfs_delegation_reap_unclaimed()
969 inode = nfs_delegation_grab_inode(delegation); in nfs_delegation_reap_unclaimed()
975 delegation = nfs_start_delegation_return_locked(NFS_I(inode)); in nfs_delegation_reap_unclaimed()
977 if (delegation != NULL) { in nfs_delegation_reap_unclaimed()
978 delegation = nfs_detach_delegation(NFS_I(inode), in nfs_delegation_reap_unclaimed()
979 delegation, server); in nfs_delegation_reap_unclaimed()
980 if (delegation != NULL) in nfs_delegation_reap_unclaimed()
981 nfs_free_delegation(delegation); in nfs_delegation_reap_unclaimed()
1000 struct nfs_delegation *delegation) in nfs_mark_test_expired_delegation() argument
1002 if (delegation->stateid.type == NFS4_INVALID_STATEID_TYPE) in nfs_mark_test_expired_delegation()
1004 clear_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags); in nfs_mark_test_expired_delegation()
1005 set_bit(NFS_DELEGATION_TEST_EXPIRED, &delegation->flags); in nfs_mark_test_expired_delegation()
1012 struct nfs_delegation *delegation; in nfs_inode_mark_test_expired_delegation() local
1015 delegation = rcu_dereference(NFS_I(inode)->delegation); in nfs_inode_mark_test_expired_delegation()
1016 if (delegation) in nfs_inode_mark_test_expired_delegation()
1017 nfs_mark_test_expired_delegation(server, delegation); in nfs_inode_mark_test_expired_delegation()
1024 struct nfs_delegation *delegation; in nfs_delegation_mark_test_expired_server() local
1026 list_for_each_entry_rcu(delegation, &server->delegations, super_list) in nfs_delegation_mark_test_expired_server()
1027 nfs_mark_test_expired_delegation(server, delegation); in nfs_delegation_mark_test_expired_server()
1086 struct nfs_delegation *delegation; in nfs_reap_expired_delegations() local
1095 list_for_each_entry_rcu(delegation, &server->delegations, in nfs_reap_expired_delegations()
1098 &delegation->flags) || in nfs_reap_expired_delegations()
1100 &delegation->flags) || in nfs_reap_expired_delegations()
1102 &delegation->flags) == 0) in nfs_reap_expired_delegations()
1106 inode = nfs_delegation_grab_inode(delegation); in nfs_reap_expired_delegations()
1112 cred = get_cred_rcu(delegation->cred); in nfs_reap_expired_delegations()
1113 nfs4_stateid_copy(&stateid, &delegation->stateid); in nfs_reap_expired_delegations()
1114 clear_bit(NFS_DELEGATION_TEST_EXPIRED, &delegation->flags); in nfs_reap_expired_delegations()
1137 struct nfs_delegation *delegation; in nfs_inode_find_delegation_state_and_recover() local
1141 delegation = rcu_dereference(NFS_I(inode)->delegation); in nfs_inode_find_delegation_state_and_recover()
1142 if (delegation && in nfs_inode_find_delegation_state_and_recover()
1143 nfs4_stateid_match_other(&delegation->stateid, stateid)) { in nfs_inode_find_delegation_state_and_recover()
1144 nfs_mark_test_expired_delegation(NFS_SERVER(inode), delegation); in nfs_inode_find_delegation_state_and_recover()
1184 struct nfs_delegation *delegation; in nfs4_refresh_delegation_stateid() local
1190 delegation = rcu_dereference(NFS_I(inode)->delegation); in nfs4_refresh_delegation_stateid()
1191 if (delegation != NULL && in nfs4_refresh_delegation_stateid()
1192 nfs4_stateid_match_other(dst, &delegation->stateid)) { in nfs4_refresh_delegation_stateid()
1193 dst->seqid = delegation->stateid.seqid; in nfs4_refresh_delegation_stateid()
1215 struct nfs_delegation *delegation; in nfs4_copy_delegation_stateid() local
1220 delegation = rcu_dereference(nfsi->delegation); in nfs4_copy_delegation_stateid()
1221 ret = nfs4_is_valid_delegation(delegation, flags); in nfs4_copy_delegation_stateid()
1223 nfs4_stateid_copy(dst, &delegation->stateid); in nfs4_copy_delegation_stateid()
1224 nfs_mark_delegation_referenced(delegation); in nfs4_copy_delegation_stateid()
1226 *cred = get_cred(delegation->cred); in nfs4_copy_delegation_stateid()
1243 struct nfs_delegation *delegation; in nfs4_delegation_flush_on_close() local
1247 delegation = rcu_dereference(nfsi->delegation); in nfs4_delegation_flush_on_close()
1248 if (delegation == NULL || !(delegation->type & FMODE_WRITE)) in nfs4_delegation_flush_on_close()
1250 if (atomic_long_read(&nfsi->nrequests) < delegation->pagemod_limit) in nfs4_delegation_flush_on_close()