]>
Commit | Line | Data |
---|---|---|
8ec442ae DH |
1 | /* NFS filesystem cache interface definitions |
2 | * | |
3 | * Copyright (C) 2008 Red Hat, Inc. All Rights Reserved. | |
4 | * Written by David Howells ([email protected]) | |
5 | * | |
6 | * This program is free software; you can redistribute it and/or | |
7 | * modify it under the terms of the GNU General Public Licence | |
8 | * as published by the Free Software Foundation; either version | |
9 | * 2 of the Licence, or (at your option) any later version. | |
10 | */ | |
11 | ||
12 | #ifndef _NFS_FSCACHE_H | |
13 | #define _NFS_FSCACHE_H | |
14 | ||
15 | #include <linux/nfs_fs.h> | |
16 | #include <linux/nfs_mount.h> | |
17 | #include <linux/nfs4_mount.h> | |
18 | #include <linux/fscache.h> | |
19 | ||
20 | #ifdef CONFIG_NFS_FSCACHE | |
21 | ||
08734048 DH |
22 | /* |
23 | * set of NFS FS-Cache objects that form a superblock key | |
24 | */ | |
25 | struct nfs_fscache_key { | |
26 | struct rb_node node; | |
27 | struct nfs_client *nfs_client; /* the server */ | |
28 | ||
29 | /* the elements of the unique key - as used by nfs_compare_super() and | |
30 | * nfs_compare_mount_options() to distinguish superblocks */ | |
31 | struct { | |
32 | struct { | |
33 | unsigned long s_flags; /* various flags | |
34 | * (& NFS_MS_MASK) */ | |
35 | } super; | |
36 | ||
37 | struct { | |
38 | struct nfs_fsid fsid; | |
39 | int flags; | |
40 | unsigned int rsize; /* read size */ | |
41 | unsigned int wsize; /* write size */ | |
42 | unsigned int acregmin; /* attr cache timeouts */ | |
43 | unsigned int acregmax; | |
44 | unsigned int acdirmin; | |
45 | unsigned int acdirmax; | |
46 | } nfs_server; | |
47 | ||
48 | struct { | |
49 | rpc_authflavor_t au_flavor; | |
50 | } rpc_auth; | |
51 | ||
52 | /* uniquifier - can be used if nfs_server.flags includes | |
53 | * NFS_MOUNT_UNSHARED */ | |
54 | u8 uniq_len; | |
55 | char uniquifier[0]; | |
56 | } key; | |
57 | }; | |
58 | ||
8ec442ae DH |
59 | /* |
60 | * fscache-index.c | |
61 | */ | |
62 | extern struct fscache_netfs nfs_fscache_netfs; | |
14727281 | 63 | extern const struct fscache_cookie_def nfs_fscache_server_index_def; |
08734048 | 64 | extern const struct fscache_cookie_def nfs_fscache_super_index_def; |
10329a5d | 65 | extern const struct fscache_cookie_def nfs_fscache_inode_object_def; |
8ec442ae DH |
66 | |
67 | extern int nfs_fscache_register(void); | |
68 | extern void nfs_fscache_unregister(void); | |
69 | ||
14727281 DH |
70 | /* |
71 | * fscache.c | |
72 | */ | |
73 | extern void nfs_fscache_get_client_cookie(struct nfs_client *); | |
74 | extern void nfs_fscache_release_client_cookie(struct nfs_client *); | |
75 | ||
08734048 DH |
76 | extern void nfs_fscache_get_super_cookie(struct super_block *, |
77 | struct nfs_parsed_mount_data *); | |
78 | extern void nfs_fscache_release_super_cookie(struct super_block *); | |
79 | ||
ef79c097 DH |
80 | extern void nfs_fscache_init_inode_cookie(struct inode *); |
81 | extern void nfs_fscache_release_inode_cookie(struct inode *); | |
82 | extern void nfs_fscache_zap_inode_cookie(struct inode *); | |
83 | extern void nfs_fscache_set_inode_cookie(struct inode *, struct file *); | |
84 | extern void nfs_fscache_reset_inode_cookie(struct inode *); | |
85 | ||
545db45f DH |
86 | extern void __nfs_fscache_invalidate_page(struct page *, struct inode *); |
87 | extern int nfs_fscache_release_page(struct page *, gfp_t); | |
88 | ||
9a9fc1c0 DH |
89 | extern int __nfs_readpage_from_fscache(struct nfs_open_context *, |
90 | struct inode *, struct page *); | |
91 | extern int __nfs_readpages_from_fscache(struct nfs_open_context *, | |
92 | struct inode *, struct address_space *, | |
93 | struct list_head *, unsigned *); | |
7f8e05f6 | 94 | extern void __nfs_readpage_to_fscache(struct inode *, struct page *, int); |
9a9fc1c0 | 95 | |
545db45f DH |
96 | /* |
97 | * wait for a page to complete writing to the cache | |
98 | */ | |
99 | static inline void nfs_fscache_wait_on_page_write(struct nfs_inode *nfsi, | |
100 | struct page *page) | |
101 | { | |
102 | if (PageFsCache(page)) | |
103 | fscache_wait_on_page_write(nfsi->fscache, page); | |
104 | } | |
105 | ||
106 | /* | |
107 | * release the caching state associated with a page if undergoing complete page | |
108 | * invalidation | |
109 | */ | |
110 | static inline void nfs_fscache_invalidate_page(struct page *page, | |
111 | struct inode *inode) | |
112 | { | |
113 | if (PageFsCache(page)) | |
114 | __nfs_fscache_invalidate_page(page, inode); | |
115 | } | |
116 | ||
9a9fc1c0 DH |
117 | /* |
118 | * Retrieve a page from an inode data storage object. | |
119 | */ | |
120 | static inline int nfs_readpage_from_fscache(struct nfs_open_context *ctx, | |
121 | struct inode *inode, | |
122 | struct page *page) | |
123 | { | |
124 | if (NFS_I(inode)->fscache) | |
125 | return __nfs_readpage_from_fscache(ctx, inode, page); | |
126 | return -ENOBUFS; | |
127 | } | |
128 | ||
129 | /* | |
130 | * Retrieve a set of pages from an inode data storage object. | |
131 | */ | |
132 | static inline int nfs_readpages_from_fscache(struct nfs_open_context *ctx, | |
133 | struct inode *inode, | |
134 | struct address_space *mapping, | |
135 | struct list_head *pages, | |
136 | unsigned *nr_pages) | |
137 | { | |
138 | if (NFS_I(inode)->fscache) | |
139 | return __nfs_readpages_from_fscache(ctx, inode, mapping, pages, | |
140 | nr_pages); | |
141 | return -ENOBUFS; | |
142 | } | |
545db45f | 143 | |
7f8e05f6 DH |
144 | /* |
145 | * Store a page newly fetched from the server in an inode data storage object | |
146 | * in the cache. | |
147 | */ | |
148 | static inline void nfs_readpage_to_fscache(struct inode *inode, | |
149 | struct page *page, | |
150 | int sync) | |
151 | { | |
152 | if (PageFsCache(page)) | |
153 | __nfs_readpage_to_fscache(inode, page, sync); | |
154 | } | |
155 | ||
5d1acff1 DH |
156 | /* |
157 | * indicate the client caching state as readable text | |
158 | */ | |
159 | static inline const char *nfs_server_fscache_state(struct nfs_server *server) | |
160 | { | |
161 | if (server->fscache && (server->options & NFS_OPTION_FSCACHE)) | |
162 | return "yes"; | |
163 | return "no "; | |
164 | } | |
165 | ||
7f8e05f6 | 166 | |
8ec442ae DH |
167 | #else /* CONFIG_NFS_FSCACHE */ |
168 | static inline int nfs_fscache_register(void) { return 0; } | |
169 | static inline void nfs_fscache_unregister(void) {} | |
170 | ||
14727281 DH |
171 | static inline void nfs_fscache_get_client_cookie(struct nfs_client *clp) {} |
172 | static inline void nfs_fscache_release_client_cookie(struct nfs_client *clp) {} | |
173 | ||
08734048 DH |
174 | static inline void nfs_fscache_get_super_cookie( |
175 | struct super_block *sb, | |
176 | struct nfs_parsed_mount_data *data) | |
177 | { | |
178 | } | |
179 | static inline void nfs_fscache_release_super_cookie(struct super_block *sb) {} | |
180 | ||
ef79c097 DH |
181 | static inline void nfs_fscache_init_inode_cookie(struct inode *inode) {} |
182 | static inline void nfs_fscache_release_inode_cookie(struct inode *inode) {} | |
183 | static inline void nfs_fscache_zap_inode_cookie(struct inode *inode) {} | |
184 | static inline void nfs_fscache_set_inode_cookie(struct inode *inode, | |
185 | struct file *filp) {} | |
186 | static inline void nfs_fscache_reset_inode_cookie(struct inode *inode) {} | |
187 | ||
545db45f DH |
188 | static inline int nfs_fscache_release_page(struct page *page, gfp_t gfp) |
189 | { | |
190 | return 1; /* True: may release page */ | |
191 | } | |
192 | static inline void nfs_fscache_invalidate_page(struct page *page, | |
193 | struct inode *inode) {} | |
194 | static inline void nfs_fscache_wait_on_page_write(struct nfs_inode *nfsi, | |
195 | struct page *page) {} | |
196 | ||
9a9fc1c0 DH |
197 | static inline int nfs_readpage_from_fscache(struct nfs_open_context *ctx, |
198 | struct inode *inode, | |
199 | struct page *page) | |
200 | { | |
201 | return -ENOBUFS; | |
202 | } | |
203 | static inline int nfs_readpages_from_fscache(struct nfs_open_context *ctx, | |
204 | struct inode *inode, | |
205 | struct address_space *mapping, | |
206 | struct list_head *pages, | |
207 | unsigned *nr_pages) | |
208 | { | |
209 | return -ENOBUFS; | |
210 | } | |
7f8e05f6 DH |
211 | static inline void nfs_readpage_to_fscache(struct inode *inode, |
212 | struct page *page, int sync) {} | |
9a9fc1c0 | 213 | |
5d1acff1 DH |
214 | static inline const char *nfs_server_fscache_state(struct nfs_server *server) |
215 | { | |
216 | return "no "; | |
217 | } | |
218 | ||
8ec442ae DH |
219 | #endif /* CONFIG_NFS_FSCACHE */ |
220 | #endif /* _NFS_FSCACHE_H */ |