xref: /openbmc/linux/fs/nfs/fscache.h (revision 5d1acff1)
18ec442aeSDavid Howells /* NFS filesystem cache interface definitions
28ec442aeSDavid Howells  *
38ec442aeSDavid Howells  * Copyright (C) 2008 Red Hat, Inc. All Rights Reserved.
48ec442aeSDavid Howells  * Written by David Howells (dhowells@redhat.com)
58ec442aeSDavid Howells  *
68ec442aeSDavid Howells  * This program is free software; you can redistribute it and/or
78ec442aeSDavid Howells  * modify it under the terms of the GNU General Public Licence
88ec442aeSDavid Howells  * as published by the Free Software Foundation; either version
98ec442aeSDavid Howells  * 2 of the Licence, or (at your option) any later version.
108ec442aeSDavid Howells  */
118ec442aeSDavid Howells 
128ec442aeSDavid Howells #ifndef _NFS_FSCACHE_H
138ec442aeSDavid Howells #define _NFS_FSCACHE_H
148ec442aeSDavid Howells 
158ec442aeSDavid Howells #include <linux/nfs_fs.h>
168ec442aeSDavid Howells #include <linux/nfs_mount.h>
178ec442aeSDavid Howells #include <linux/nfs4_mount.h>
188ec442aeSDavid Howells #include <linux/fscache.h>
198ec442aeSDavid Howells 
208ec442aeSDavid Howells #ifdef CONFIG_NFS_FSCACHE
218ec442aeSDavid Howells 
228ec442aeSDavid Howells /*
2308734048SDavid Howells  * set of NFS FS-Cache objects that form a superblock key
2408734048SDavid Howells  */
2508734048SDavid Howells struct nfs_fscache_key {
2608734048SDavid Howells 	struct rb_node		node;
2708734048SDavid Howells 	struct nfs_client	*nfs_client;	/* the server */
2808734048SDavid Howells 
2908734048SDavid Howells 	/* the elements of the unique key - as used by nfs_compare_super() and
3008734048SDavid Howells 	 * nfs_compare_mount_options() to distinguish superblocks */
3108734048SDavid Howells 	struct {
3208734048SDavid Howells 		struct {
3308734048SDavid Howells 			unsigned long	s_flags;	/* various flags
3408734048SDavid Howells 							 * (& NFS_MS_MASK) */
3508734048SDavid Howells 		} super;
3608734048SDavid Howells 
3708734048SDavid Howells 		struct {
3808734048SDavid Howells 			struct nfs_fsid fsid;
3908734048SDavid Howells 			int		flags;
4008734048SDavid Howells 			unsigned int	rsize;		/* read size */
4108734048SDavid Howells 			unsigned int	wsize;		/* write size */
4208734048SDavid Howells 			unsigned int	acregmin;	/* attr cache timeouts */
4308734048SDavid Howells 			unsigned int	acregmax;
4408734048SDavid Howells 			unsigned int	acdirmin;
4508734048SDavid Howells 			unsigned int	acdirmax;
4608734048SDavid Howells 		} nfs_server;
4708734048SDavid Howells 
4808734048SDavid Howells 		struct {
4908734048SDavid Howells 			rpc_authflavor_t au_flavor;
5008734048SDavid Howells 		} rpc_auth;
5108734048SDavid Howells 
5208734048SDavid Howells 		/* uniquifier - can be used if nfs_server.flags includes
5308734048SDavid Howells 		 * NFS_MOUNT_UNSHARED  */
5408734048SDavid Howells 		u8 uniq_len;
5508734048SDavid Howells 		char uniquifier[0];
5608734048SDavid Howells 	} key;
5708734048SDavid Howells };
5808734048SDavid Howells 
5908734048SDavid Howells /*
608ec442aeSDavid Howells  * fscache-index.c
618ec442aeSDavid Howells  */
628ec442aeSDavid Howells extern struct fscache_netfs nfs_fscache_netfs;
6314727281SDavid Howells extern const struct fscache_cookie_def nfs_fscache_server_index_def;
6408734048SDavid Howells extern const struct fscache_cookie_def nfs_fscache_super_index_def;
6510329a5dSDavid Howells extern const struct fscache_cookie_def nfs_fscache_inode_object_def;
668ec442aeSDavid Howells 
678ec442aeSDavid Howells extern int nfs_fscache_register(void);
688ec442aeSDavid Howells extern void nfs_fscache_unregister(void);
698ec442aeSDavid Howells 
7014727281SDavid Howells /*
7114727281SDavid Howells  * fscache.c
7214727281SDavid Howells  */
7314727281SDavid Howells extern void nfs_fscache_get_client_cookie(struct nfs_client *);
7414727281SDavid Howells extern void nfs_fscache_release_client_cookie(struct nfs_client *);
7514727281SDavid Howells 
7608734048SDavid Howells extern void nfs_fscache_get_super_cookie(struct super_block *,
7708734048SDavid Howells 					 struct nfs_parsed_mount_data *);
7808734048SDavid Howells extern void nfs_fscache_release_super_cookie(struct super_block *);
7908734048SDavid Howells 
80ef79c097SDavid Howells extern void nfs_fscache_init_inode_cookie(struct inode *);
81ef79c097SDavid Howells extern void nfs_fscache_release_inode_cookie(struct inode *);
82ef79c097SDavid Howells extern void nfs_fscache_zap_inode_cookie(struct inode *);
83ef79c097SDavid Howells extern void nfs_fscache_set_inode_cookie(struct inode *, struct file *);
84ef79c097SDavid Howells extern void nfs_fscache_reset_inode_cookie(struct inode *);
85ef79c097SDavid Howells 
86545db45fSDavid Howells extern void __nfs_fscache_invalidate_page(struct page *, struct inode *);
87545db45fSDavid Howells extern int nfs_fscache_release_page(struct page *, gfp_t);
88545db45fSDavid Howells 
899a9fc1c0SDavid Howells extern int __nfs_readpage_from_fscache(struct nfs_open_context *,
909a9fc1c0SDavid Howells 				       struct inode *, struct page *);
919a9fc1c0SDavid Howells extern int __nfs_readpages_from_fscache(struct nfs_open_context *,
929a9fc1c0SDavid Howells 					struct inode *, struct address_space *,
939a9fc1c0SDavid Howells 					struct list_head *, unsigned *);
947f8e05f6SDavid Howells extern void __nfs_readpage_to_fscache(struct inode *, struct page *, int);
959a9fc1c0SDavid Howells 
96545db45fSDavid Howells /*
97545db45fSDavid Howells  * wait for a page to complete writing to the cache
98545db45fSDavid Howells  */
99545db45fSDavid Howells static inline void nfs_fscache_wait_on_page_write(struct nfs_inode *nfsi,
100545db45fSDavid Howells 						  struct page *page)
101545db45fSDavid Howells {
102545db45fSDavid Howells 	if (PageFsCache(page))
103545db45fSDavid Howells 		fscache_wait_on_page_write(nfsi->fscache, page);
104545db45fSDavid Howells }
105545db45fSDavid Howells 
106545db45fSDavid Howells /*
107545db45fSDavid Howells  * release the caching state associated with a page if undergoing complete page
108545db45fSDavid Howells  * invalidation
109545db45fSDavid Howells  */
110545db45fSDavid Howells static inline void nfs_fscache_invalidate_page(struct page *page,
111545db45fSDavid Howells 					       struct inode *inode)
112545db45fSDavid Howells {
113545db45fSDavid Howells 	if (PageFsCache(page))
114545db45fSDavid Howells 		__nfs_fscache_invalidate_page(page, inode);
115545db45fSDavid Howells }
116545db45fSDavid Howells 
1179a9fc1c0SDavid Howells /*
1189a9fc1c0SDavid Howells  * Retrieve a page from an inode data storage object.
1199a9fc1c0SDavid Howells  */
1209a9fc1c0SDavid Howells static inline int nfs_readpage_from_fscache(struct nfs_open_context *ctx,
1219a9fc1c0SDavid Howells 					    struct inode *inode,
1229a9fc1c0SDavid Howells 					    struct page *page)
1239a9fc1c0SDavid Howells {
1249a9fc1c0SDavid Howells 	if (NFS_I(inode)->fscache)
1259a9fc1c0SDavid Howells 		return __nfs_readpage_from_fscache(ctx, inode, page);
1269a9fc1c0SDavid Howells 	return -ENOBUFS;
1279a9fc1c0SDavid Howells }
1289a9fc1c0SDavid Howells 
1299a9fc1c0SDavid Howells /*
1309a9fc1c0SDavid Howells  * Retrieve a set of pages from an inode data storage object.
1319a9fc1c0SDavid Howells  */
1329a9fc1c0SDavid Howells static inline int nfs_readpages_from_fscache(struct nfs_open_context *ctx,
1339a9fc1c0SDavid Howells 					     struct inode *inode,
1349a9fc1c0SDavid Howells 					     struct address_space *mapping,
1359a9fc1c0SDavid Howells 					     struct list_head *pages,
1369a9fc1c0SDavid Howells 					     unsigned *nr_pages)
1379a9fc1c0SDavid Howells {
1389a9fc1c0SDavid Howells 	if (NFS_I(inode)->fscache)
1399a9fc1c0SDavid Howells 		return __nfs_readpages_from_fscache(ctx, inode, mapping, pages,
1409a9fc1c0SDavid Howells 						    nr_pages);
1419a9fc1c0SDavid Howells 	return -ENOBUFS;
1429a9fc1c0SDavid Howells }
143545db45fSDavid Howells 
1447f8e05f6SDavid Howells /*
1457f8e05f6SDavid Howells  * Store a page newly fetched from the server in an inode data storage object
1467f8e05f6SDavid Howells  * in the cache.
1477f8e05f6SDavid Howells  */
1487f8e05f6SDavid Howells static inline void nfs_readpage_to_fscache(struct inode *inode,
1497f8e05f6SDavid Howells 					   struct page *page,
1507f8e05f6SDavid Howells 					   int sync)
1517f8e05f6SDavid Howells {
1527f8e05f6SDavid Howells 	if (PageFsCache(page))
1537f8e05f6SDavid Howells 		__nfs_readpage_to_fscache(inode, page, sync);
1547f8e05f6SDavid Howells }
1557f8e05f6SDavid Howells 
1565d1acff1SDavid Howells /*
1575d1acff1SDavid Howells  * indicate the client caching state as readable text
1585d1acff1SDavid Howells  */
1595d1acff1SDavid Howells static inline const char *nfs_server_fscache_state(struct nfs_server *server)
1605d1acff1SDavid Howells {
1615d1acff1SDavid Howells 	if (server->fscache && (server->options & NFS_OPTION_FSCACHE))
1625d1acff1SDavid Howells 		return "yes";
1635d1acff1SDavid Howells 	return "no ";
1645d1acff1SDavid Howells }
1655d1acff1SDavid Howells 
1667f8e05f6SDavid Howells 
1678ec442aeSDavid Howells #else /* CONFIG_NFS_FSCACHE */
1688ec442aeSDavid Howells static inline int nfs_fscache_register(void) { return 0; }
1698ec442aeSDavid Howells static inline void nfs_fscache_unregister(void) {}
1708ec442aeSDavid Howells 
17114727281SDavid Howells static inline void nfs_fscache_get_client_cookie(struct nfs_client *clp) {}
17214727281SDavid Howells static inline void nfs_fscache_release_client_cookie(struct nfs_client *clp) {}
17314727281SDavid Howells 
17408734048SDavid Howells static inline void nfs_fscache_get_super_cookie(
17508734048SDavid Howells 	struct super_block *sb,
17608734048SDavid Howells 	struct nfs_parsed_mount_data *data)
17708734048SDavid Howells {
17808734048SDavid Howells }
17908734048SDavid Howells static inline void nfs_fscache_release_super_cookie(struct super_block *sb) {}
18008734048SDavid Howells 
181ef79c097SDavid Howells static inline void nfs_fscache_init_inode_cookie(struct inode *inode) {}
182ef79c097SDavid Howells static inline void nfs_fscache_release_inode_cookie(struct inode *inode) {}
183ef79c097SDavid Howells static inline void nfs_fscache_zap_inode_cookie(struct inode *inode) {}
184ef79c097SDavid Howells static inline void nfs_fscache_set_inode_cookie(struct inode *inode,
185ef79c097SDavid Howells 						struct file *filp) {}
186ef79c097SDavid Howells static inline void nfs_fscache_reset_inode_cookie(struct inode *inode) {}
187ef79c097SDavid Howells 
188545db45fSDavid Howells static inline int nfs_fscache_release_page(struct page *page, gfp_t gfp)
189545db45fSDavid Howells {
190545db45fSDavid Howells 	return 1; /* True: may release page */
191545db45fSDavid Howells }
192545db45fSDavid Howells static inline void nfs_fscache_invalidate_page(struct page *page,
193545db45fSDavid Howells 					       struct inode *inode) {}
194545db45fSDavid Howells static inline void nfs_fscache_wait_on_page_write(struct nfs_inode *nfsi,
195545db45fSDavid Howells 						  struct page *page) {}
196545db45fSDavid Howells 
1979a9fc1c0SDavid Howells static inline int nfs_readpage_from_fscache(struct nfs_open_context *ctx,
1989a9fc1c0SDavid Howells 					    struct inode *inode,
1999a9fc1c0SDavid Howells 					    struct page *page)
2009a9fc1c0SDavid Howells {
2019a9fc1c0SDavid Howells 	return -ENOBUFS;
2029a9fc1c0SDavid Howells }
2039a9fc1c0SDavid Howells static inline int nfs_readpages_from_fscache(struct nfs_open_context *ctx,
2049a9fc1c0SDavid Howells 					     struct inode *inode,
2059a9fc1c0SDavid Howells 					     struct address_space *mapping,
2069a9fc1c0SDavid Howells 					     struct list_head *pages,
2079a9fc1c0SDavid Howells 					     unsigned *nr_pages)
2089a9fc1c0SDavid Howells {
2099a9fc1c0SDavid Howells 	return -ENOBUFS;
2109a9fc1c0SDavid Howells }
2117f8e05f6SDavid Howells static inline void nfs_readpage_to_fscache(struct inode *inode,
2127f8e05f6SDavid Howells 					   struct page *page, int sync) {}
2139a9fc1c0SDavid Howells 
2145d1acff1SDavid Howells static inline const char *nfs_server_fscache_state(struct nfs_server *server)
2155d1acff1SDavid Howells {
2165d1acff1SDavid Howells 	return "no ";
2175d1acff1SDavid Howells }
2185d1acff1SDavid Howells 
2198ec442aeSDavid Howells #endif /* CONFIG_NFS_FSCACHE */
2208ec442aeSDavid Howells #endif /* _NFS_FSCACHE_H */
221