Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
1da177e4 LT |
2 | /* |
3 | * linux/fs/nfs/delegation.h | |
4 | * | |
5 | * Copyright (c) Trond Myklebust | |
6 | * | |
7 | * Definitions pertaining to NFS delegated files | |
8 | */ | |
9 | #ifndef FS_NFS_DELEGATION_H | |
10 | #define FS_NFS_DELEGATION_H | |
11 | ||
89d77c8f | 12 | #if IS_ENABLED(CONFIG_NFS_V4) |
1da177e4 LT |
13 | /* |
14 | * NFSv4 delegation | |
15 | */ | |
16 | struct nfs_delegation { | |
17 | struct list_head super_list; | |
a52458b4 | 18 | const struct cred *cred; |
1da177e4 LT |
19 | struct inode *inode; |
20 | nfs4_stateid stateid; | |
bd7bf9d5 | 21 | fmode_t type; |
7d160a6c | 22 | unsigned long pagemod_limit; |
beb2a5ec | 23 | __u64 change_attr; |
a9b8d90f | 24 | unsigned long test_gen; |
15c831bf | 25 | unsigned long flags; |
8c75593c | 26 | refcount_t refcount; |
34310430 | 27 | spinlock_t lock; |
8383e460 | 28 | struct rcu_head rcu; |
1da177e4 LT |
29 | }; |
30 | ||
515d8611 TM |
31 | enum { |
32 | NFS_DELEGATION_NEED_RECLAIM = 0, | |
33 | NFS_DELEGATION_RETURN, | |
b757144f | 34 | NFS_DELEGATION_RETURN_IF_CLOSED, |
b7391f44 | 35 | NFS_DELEGATION_REFERENCED, |
d25be546 | 36 | NFS_DELEGATION_RETURNING, |
869f9dfa | 37 | NFS_DELEGATION_REVOKED, |
45870d69 | 38 | NFS_DELEGATION_TEST_EXPIRED, |
6f9449be | 39 | NFS_DELEGATION_INODE_FREEING, |
be200377 | 40 | NFS_DELEGATION_RETURN_DELAYED, |
e12912d9 | 41 | NFS_DELEGATION_DELEGTIME, |
515d8611 TM |
42 | }; |
43 | ||
a52458b4 | 44 | int nfs_inode_set_delegation(struct inode *inode, const struct cred *cred, |
e12912d9 TM |
45 | fmode_t type, const nfs4_stateid *stateid, |
46 | unsigned long pagemod_limit, u32 deleg_type); | |
a52458b4 | 47 | void nfs_inode_reclaim_delegation(struct inode *inode, const struct cred *cred, |
e12912d9 TM |
48 | fmode_t type, const nfs4_stateid *stateid, |
49 | unsigned long pagemod_limit, u32 deleg_type); | |
57ec14c5 | 50 | int nfs4_inode_return_delegation(struct inode *inode); |
b7b7dac6 | 51 | void nfs4_inode_return_delegation_on_close(struct inode *inode); |
8f8df955 | 52 | void nfs4_inode_set_return_delegation_on_close(struct inode *inode); |
e047a10c | 53 | int nfs_async_inode_return_delegation(struct inode *inode, const nfs4_stateid *stateid); |
b47e0e47 | 54 | void nfs_inode_evict_delegation(struct inode *inode); |
1da177e4 | 55 | |
adfa6f98 | 56 | struct inode *nfs_delegation_find_inode(struct nfs_client *clp, const struct nfs_fh *fhandle); |
eeebf916 | 57 | void nfs_server_return_all_delegations(struct nfs_server *); |
adfa6f98 | 58 | void nfs_expire_all_delegations(struct nfs_client *clp); |
826e0013 | 59 | void nfs_expire_unused_delegation_types(struct nfs_client *clp, fmode_t flags); |
b7391f44 | 60 | void nfs_expire_unreferenced_delegations(struct nfs_client *clp); |
d18cc1fd | 61 | int nfs_client_return_marked_delegations(struct nfs_client *clp); |
d3978bb3 | 62 | int nfs_delegations_present(struct nfs_client *clp); |
41020b67 | 63 | void nfs_remove_bad_delegation(struct inode *inode, const nfs4_stateid *stateid); |
d51f91d2 | 64 | void nfs_delegation_mark_returned(struct inode *inode, const nfs4_stateid *stateid); |
1da177e4 | 65 | |
adfa6f98 DH |
66 | void nfs_delegation_mark_reclaim(struct nfs_client *clp); |
67 | void nfs_delegation_reap_unclaimed(struct nfs_client *clp); | |
1da177e4 | 68 | |
45870d69 | 69 | void nfs_mark_test_expired_all_delegations(struct nfs_client *clp); |
8ca017c8 | 70 | void nfs_test_expired_all_delegations(struct nfs_client *clp); |
45870d69 TM |
71 | void nfs_reap_expired_delegations(struct nfs_client *clp); |
72 | ||
1da177e4 | 73 | /* NFSv4 delegation-related procedures */ |
b81aca09 TM |
74 | int nfs4_proc_delegreturn(struct inode *inode, const struct cred *cred, |
75 | const nfs4_stateid *stateid, | |
76 | struct nfs_delegation *delegation, int issync); | |
5eb8d18c | 77 | int nfs4_open_delegation_recall(struct nfs_open_context *ctx, struct nfs4_state *state, const nfs4_stateid *stateid); |
db4f2e63 | 78 | int nfs4_lock_delegation_recall(struct file_lock *fl, struct nfs4_state *state, const nfs4_stateid *stateid); |
a52458b4 | 79 | bool nfs4_copy_delegation_stateid(struct inode *inode, fmode_t flags, nfs4_stateid *dst, const struct cred **cred); |
12f275cd | 80 | bool nfs4_refresh_delegation_stateid(nfs4_stateid *dst, struct inode *inode); |
1da177e4 | 81 | |
be3df3dd | 82 | struct nfs_delegation *nfs4_get_valid_delegation(const struct inode *inode); |
b7391f44 | 83 | void nfs_mark_delegation_referenced(struct nfs_delegation *delegation); |
4201916f TM |
84 | int nfs4_have_delegation(struct inode *inode, fmode_t type, int flags); |
85 | int nfs4_check_delegation(struct inode *inode, fmode_t type); | |
5445b1fb | 86 | bool nfs4_delegation_flush_on_close(const struct inode *inode); |
6c2d8f8d TM |
87 | void nfs_inode_find_delegation_state_and_recover(struct inode *inode, |
88 | const nfs4_stateid *stateid); | |
c01d3645 | 89 | int nfs4_inode_make_writeable(struct inode *inode); |
cae7a073 | 90 | |
1da177e4 LT |
91 | #endif |
92 | ||
e12912d9 TM |
93 | #define NFS_DELEGATION_FLAG_TIME BIT(1) |
94 | ||
95 | void nfs_update_delegated_atime(struct inode *inode); | |
96 | void nfs_update_delegated_mtime(struct inode *inode); | |
97 | void nfs_update_delegated_mtime_locked(struct inode *inode); | |
98 | ||
4201916f TM |
99 | static inline int nfs_have_read_or_write_delegation(struct inode *inode) |
100 | { | |
101 | return NFS_PROTO(inode)->have_delegation(inode, FMODE_READ, 0); | |
102 | } | |
103 | ||
104 | static inline int nfs_have_write_delegation(struct inode *inode) | |
105 | { | |
106 | return NFS_PROTO(inode)->have_delegation(inode, FMODE_WRITE, 0); | |
107 | } | |
108 | ||
b4d2314b TM |
109 | static inline int nfs_have_delegated_attributes(struct inode *inode) |
110 | { | |
4201916f | 111 | return NFS_PROTO(inode)->have_delegation(inode, FMODE_READ, 0); |
b4d2314b TM |
112 | } |
113 | ||
e12912d9 TM |
114 | static inline int nfs_have_delegated_atime(struct inode *inode) |
115 | { | |
116 | return NFS_PROTO(inode)->have_delegation(inode, FMODE_READ, | |
117 | NFS_DELEGATION_FLAG_TIME); | |
118 | } | |
119 | ||
120 | static inline int nfs_have_delegated_mtime(struct inode *inode) | |
121 | { | |
122 | return NFS_PROTO(inode)->have_delegation(inode, FMODE_WRITE, | |
123 | NFS_DELEGATION_FLAG_TIME); | |
124 | } | |
125 | ||
1da177e4 | 126 | #endif |