diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2008-12-23 15:21:52 -0500 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2008-12-23 15:21:52 -0500 |
commit | b7391f44f26b17ad25c7183a3d6ad50f0a9305ff (patch) | |
tree | 8e09a5714587a8bde2a805819501d10bae4787b7 /fs/nfs/delegation.h | |
parent | 6411bd4a471893ab2af103d96253ba97c92d4777 (diff) |
NFSv4: Return unreferenced delegations more promptly
If the client is not using a delegation, the right thing to do is to return
it as soon as possible. This helps reduce the amount of state the server
has to track, as well as reducing the potential for conflicts with other
clients.
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs/delegation.h')
-rw-r--r-- | fs/nfs/delegation.h | 17 |
1 files changed, 4 insertions, 13 deletions
diff --git a/fs/nfs/delegation.h b/fs/nfs/delegation.h index 56f3eb558ef4..2a74882e5d50 100644 --- a/fs/nfs/delegation.h +++ b/fs/nfs/delegation.h | |||
@@ -28,6 +28,7 @@ struct nfs_delegation { | |||
28 | enum { | 28 | enum { |
29 | NFS_DELEGATION_NEED_RECLAIM = 0, | 29 | NFS_DELEGATION_NEED_RECLAIM = 0, |
30 | NFS_DELEGATION_RETURN, | 30 | NFS_DELEGATION_RETURN, |
31 | NFS_DELEGATION_REFERENCED, | ||
31 | }; | 32 | }; |
32 | 33 | ||
33 | int nfs_inode_set_delegation(struct inode *inode, struct rpc_cred *cred, struct nfs_openres *res); | 34 | int nfs_inode_set_delegation(struct inode *inode, struct rpc_cred *cred, struct nfs_openres *res); |
@@ -39,6 +40,7 @@ void nfs_inode_return_delegation_noreclaim(struct inode *inode); | |||
39 | struct inode *nfs_delegation_find_inode(struct nfs_client *clp, const struct nfs_fh *fhandle); | 40 | struct inode *nfs_delegation_find_inode(struct nfs_client *clp, const struct nfs_fh *fhandle); |
40 | void nfs_super_return_all_delegations(struct super_block *sb); | 41 | void nfs_super_return_all_delegations(struct super_block *sb); |
41 | void nfs_expire_all_delegations(struct nfs_client *clp); | 42 | void nfs_expire_all_delegations(struct nfs_client *clp); |
43 | void nfs_expire_unreferenced_delegations(struct nfs_client *clp); | ||
42 | void nfs_handle_cb_pathdown(struct nfs_client *clp); | 44 | void nfs_handle_cb_pathdown(struct nfs_client *clp); |
43 | void nfs_client_return_marked_delegations(struct nfs_client *clp); | 45 | void nfs_client_return_marked_delegations(struct nfs_client *clp); |
44 | 46 | ||
@@ -51,19 +53,8 @@ int nfs4_open_delegation_recall(struct nfs_open_context *ctx, struct nfs4_state | |||
51 | int nfs4_lock_delegation_recall(struct nfs4_state *state, struct file_lock *fl); | 53 | int nfs4_lock_delegation_recall(struct nfs4_state *state, struct file_lock *fl); |
52 | int nfs4_copy_delegation_stateid(nfs4_stateid *dst, struct inode *inode); | 54 | int nfs4_copy_delegation_stateid(nfs4_stateid *dst, struct inode *inode); |
53 | 55 | ||
54 | static inline int nfs_have_delegation(struct inode *inode, int flags) | 56 | void nfs_mark_delegation_referenced(struct nfs_delegation *delegation); |
55 | { | 57 | int nfs_have_delegation(struct inode *inode, int flags); |
56 | struct nfs_delegation *delegation; | ||
57 | int ret = 0; | ||
58 | |||
59 | flags &= FMODE_READ|FMODE_WRITE; | ||
60 | rcu_read_lock(); | ||
61 | delegation = rcu_dereference(NFS_I(inode)->delegation); | ||
62 | if (delegation != NULL && (delegation->type & flags) == flags) | ||
63 | ret = 1; | ||
64 | rcu_read_unlock(); | ||
65 | return ret; | ||
66 | } | ||
67 | 58 | ||
68 | #else | 59 | #else |
69 | static inline int nfs_have_delegation(struct inode *inode, int flags) | 60 | static inline int nfs_have_delegation(struct inode *inode, int flags) |