xref: /openbmc/linux/fs/smb/client/fscache.h (revision 0fdada1e)
138c8a9a5SSteve French /* SPDX-License-Identifier: LGPL-2.1 */
238c8a9a5SSteve French /*
338c8a9a5SSteve French  *   CIFS filesystem cache interface definitions
438c8a9a5SSteve French  *
538c8a9a5SSteve French  *   Copyright (c) 2010 Novell, Inc.
638c8a9a5SSteve French  *   Authors(s): Suresh Jayaraman (sjayaraman@suse.de>
738c8a9a5SSteve French  *
838c8a9a5SSteve French  */
938c8a9a5SSteve French #ifndef _CIFS_FSCACHE_H
1038c8a9a5SSteve French #define _CIFS_FSCACHE_H
1138c8a9a5SSteve French 
1238c8a9a5SSteve French #include <linux/swap.h>
1338c8a9a5SSteve French #include <linux/fscache.h>
1438c8a9a5SSteve French 
1538c8a9a5SSteve French #include "cifsglob.h"
1638c8a9a5SSteve French 
1738c8a9a5SSteve French /*
1838c8a9a5SSteve French  * Coherency data attached to CIFS volume within the cache
1938c8a9a5SSteve French  */
2038c8a9a5SSteve French struct cifs_fscache_volume_coherency_data {
2138c8a9a5SSteve French 	__le64	resource_id;		/* unique server resource id */
2238c8a9a5SSteve French 	__le64	vol_create_time;
2338c8a9a5SSteve French 	__le32	vol_serial_number;
2438c8a9a5SSteve French } __packed;
2538c8a9a5SSteve French 
2638c8a9a5SSteve French /*
2738c8a9a5SSteve French  * Coherency data attached to CIFS inode within the cache.
2838c8a9a5SSteve French  */
2938c8a9a5SSteve French struct cifs_fscache_inode_coherency_data {
3038c8a9a5SSteve French 	__le64 last_write_time_sec;
3138c8a9a5SSteve French 	__le64 last_change_time_sec;
3238c8a9a5SSteve French 	__le32 last_write_time_nsec;
3338c8a9a5SSteve French 	__le32 last_change_time_nsec;
3438c8a9a5SSteve French };
3538c8a9a5SSteve French 
3638c8a9a5SSteve French #ifdef CONFIG_CIFS_FSCACHE
3738c8a9a5SSteve French 
3838c8a9a5SSteve French /*
3938c8a9a5SSteve French  * fscache.c
4038c8a9a5SSteve French  */
4138c8a9a5SSteve French extern int cifs_fscache_get_super_cookie(struct cifs_tcon *);
4238c8a9a5SSteve French extern void cifs_fscache_release_super_cookie(struct cifs_tcon *);
4338c8a9a5SSteve French 
4438c8a9a5SSteve French extern void cifs_fscache_get_inode_cookie(struct inode *inode);
4538c8a9a5SSteve French extern void cifs_fscache_release_inode_cookie(struct inode *);
4638c8a9a5SSteve French extern void cifs_fscache_unuse_inode_cookie(struct inode *inode, bool update);
4738c8a9a5SSteve French 
4838c8a9a5SSteve French static inline
cifs_fscache_fill_coherency(struct inode * inode,struct cifs_fscache_inode_coherency_data * cd)4938c8a9a5SSteve French void cifs_fscache_fill_coherency(struct inode *inode,
5038c8a9a5SSteve French 				 struct cifs_fscache_inode_coherency_data *cd)
5138c8a9a5SSteve French {
5294487653SJeff Layton 	struct timespec64 ctime = inode_get_ctime(inode);
5323171df5SJeff Layton 	struct timespec64 mtime = inode_get_mtime(inode);
5438c8a9a5SSteve French 
5538c8a9a5SSteve French 	memset(cd, 0, sizeof(*cd));
5623171df5SJeff Layton 	cd->last_write_time_sec   = cpu_to_le64(mtime.tv_sec);
5723171df5SJeff Layton 	cd->last_write_time_nsec  = cpu_to_le32(mtime.tv_nsec);
5894487653SJeff Layton 	cd->last_change_time_sec  = cpu_to_le64(ctime.tv_sec);
5994487653SJeff Layton 	cd->last_change_time_nsec = cpu_to_le32(ctime.tv_nsec);
6038c8a9a5SSteve French }
6138c8a9a5SSteve French 
6238c8a9a5SSteve French 
cifs_inode_cookie(struct inode * inode)6338c8a9a5SSteve French static inline struct fscache_cookie *cifs_inode_cookie(struct inode *inode)
6438c8a9a5SSteve French {
6538c8a9a5SSteve French 	return netfs_i_cookie(&CIFS_I(inode)->netfs);
6638c8a9a5SSteve French }
6738c8a9a5SSteve French 
cifs_invalidate_cache(struct inode * inode,unsigned int flags)6838c8a9a5SSteve French static inline void cifs_invalidate_cache(struct inode *inode, unsigned int flags)
6938c8a9a5SSteve French {
7038c8a9a5SSteve French 	struct cifs_fscache_inode_coherency_data cd;
7138c8a9a5SSteve French 
7238c8a9a5SSteve French 	cifs_fscache_fill_coherency(inode, &cd);
7338c8a9a5SSteve French 	fscache_invalidate(cifs_inode_cookie(inode), &cd,
7438c8a9a5SSteve French 			   i_size_read(inode), flags);
7538c8a9a5SSteve French }
7638c8a9a5SSteve French 
7738c8a9a5SSteve French extern int __cifs_fscache_query_occupancy(struct inode *inode,
7838c8a9a5SSteve French 					  pgoff_t first, unsigned int nr_pages,
7938c8a9a5SSteve French 					  pgoff_t *_data_first,
8038c8a9a5SSteve French 					  unsigned int *_data_nr_pages);
8138c8a9a5SSteve French 
cifs_fscache_query_occupancy(struct inode * inode,pgoff_t first,unsigned int nr_pages,pgoff_t * _data_first,unsigned int * _data_nr_pages)8238c8a9a5SSteve French static inline int cifs_fscache_query_occupancy(struct inode *inode,
8338c8a9a5SSteve French 					       pgoff_t first, unsigned int nr_pages,
8438c8a9a5SSteve French 					       pgoff_t *_data_first,
8538c8a9a5SSteve French 					       unsigned int *_data_nr_pages)
8638c8a9a5SSteve French {
8738c8a9a5SSteve French 	if (!cifs_inode_cookie(inode))
8838c8a9a5SSteve French 		return -ENOBUFS;
8938c8a9a5SSteve French 	return __cifs_fscache_query_occupancy(inode, first, nr_pages,
9038c8a9a5SSteve French 					      _data_first, _data_nr_pages);
9138c8a9a5SSteve French }
9238c8a9a5SSteve French 
9338c8a9a5SSteve French extern int __cifs_readpage_from_fscache(struct inode *pinode, struct page *ppage);
9438c8a9a5SSteve French extern void __cifs_readahead_to_fscache(struct inode *pinode, loff_t pos, size_t len);
9538c8a9a5SSteve French 
9638c8a9a5SSteve French 
cifs_readpage_from_fscache(struct inode * inode,struct page * page)9738c8a9a5SSteve French static inline int cifs_readpage_from_fscache(struct inode *inode,
9838c8a9a5SSteve French 					     struct page *page)
9938c8a9a5SSteve French {
10038c8a9a5SSteve French 	if (cifs_inode_cookie(inode))
10138c8a9a5SSteve French 		return __cifs_readpage_from_fscache(inode, page);
10238c8a9a5SSteve French 	return -ENOBUFS;
10338c8a9a5SSteve French }
10438c8a9a5SSteve French 
cifs_readahead_to_fscache(struct inode * inode,loff_t pos,size_t len)10538c8a9a5SSteve French static inline void cifs_readahead_to_fscache(struct inode *inode,
10638c8a9a5SSteve French 					     loff_t pos, size_t len)
10738c8a9a5SSteve French {
10838c8a9a5SSteve French 	if (cifs_inode_cookie(inode))
10938c8a9a5SSteve French 		__cifs_readahead_to_fscache(inode, pos, len);
11038c8a9a5SSteve French }
11138c8a9a5SSteve French 
cifs_fscache_enabled(struct inode * inode)112*0fdada1eSDavid Howells static inline bool cifs_fscache_enabled(struct inode *inode)
113*0fdada1eSDavid Howells {
114*0fdada1eSDavid Howells 	return fscache_cookie_enabled(cifs_inode_cookie(inode));
115*0fdada1eSDavid Howells }
116*0fdada1eSDavid Howells 
11738c8a9a5SSteve French #else /* CONFIG_CIFS_FSCACHE */
11838c8a9a5SSteve French static inline
cifs_fscache_fill_coherency(struct inode * inode,struct cifs_fscache_inode_coherency_data * cd)11938c8a9a5SSteve French void cifs_fscache_fill_coherency(struct inode *inode,
12038c8a9a5SSteve French 				 struct cifs_fscache_inode_coherency_data *cd)
12138c8a9a5SSteve French {
12238c8a9a5SSteve French }
12338c8a9a5SSteve French 
cifs_fscache_get_super_cookie(struct cifs_tcon * tcon)12438c8a9a5SSteve French static inline int cifs_fscache_get_super_cookie(struct cifs_tcon *tcon) { return 0; }
cifs_fscache_release_super_cookie(struct cifs_tcon * tcon)12538c8a9a5SSteve French static inline void cifs_fscache_release_super_cookie(struct cifs_tcon *tcon) {}
12638c8a9a5SSteve French 
cifs_fscache_get_inode_cookie(struct inode * inode)12738c8a9a5SSteve French static inline void cifs_fscache_get_inode_cookie(struct inode *inode) {}
cifs_fscache_release_inode_cookie(struct inode * inode)12838c8a9a5SSteve French static inline void cifs_fscache_release_inode_cookie(struct inode *inode) {}
cifs_fscache_unuse_inode_cookie(struct inode * inode,bool update)12938c8a9a5SSteve French static inline void cifs_fscache_unuse_inode_cookie(struct inode *inode, bool update) {}
cifs_inode_cookie(struct inode * inode)13038c8a9a5SSteve French static inline struct fscache_cookie *cifs_inode_cookie(struct inode *inode) { return NULL; }
cifs_invalidate_cache(struct inode * inode,unsigned int flags)13138c8a9a5SSteve French static inline void cifs_invalidate_cache(struct inode *inode, unsigned int flags) {}
cifs_fscache_enabled(struct inode * inode)132*0fdada1eSDavid Howells static inline bool cifs_fscache_enabled(struct inode *inode) { return false; }
13338c8a9a5SSteve French 
cifs_fscache_query_occupancy(struct inode * inode,pgoff_t first,unsigned int nr_pages,pgoff_t * _data_first,unsigned int * _data_nr_pages)13438c8a9a5SSteve French static inline int cifs_fscache_query_occupancy(struct inode *inode,
13538c8a9a5SSteve French 					       pgoff_t first, unsigned int nr_pages,
13638c8a9a5SSteve French 					       pgoff_t *_data_first,
13738c8a9a5SSteve French 					       unsigned int *_data_nr_pages)
13838c8a9a5SSteve French {
13938c8a9a5SSteve French 	*_data_first = ULONG_MAX;
14038c8a9a5SSteve French 	*_data_nr_pages = 0;
14138c8a9a5SSteve French 	return -ENOBUFS;
14238c8a9a5SSteve French }
14338c8a9a5SSteve French 
14438c8a9a5SSteve French static inline int
cifs_readpage_from_fscache(struct inode * inode,struct page * page)14538c8a9a5SSteve French cifs_readpage_from_fscache(struct inode *inode, struct page *page)
14638c8a9a5SSteve French {
14738c8a9a5SSteve French 	return -ENOBUFS;
14838c8a9a5SSteve French }
14938c8a9a5SSteve French 
15038c8a9a5SSteve French static inline
cifs_readahead_to_fscache(struct inode * inode,loff_t pos,size_t len)15138c8a9a5SSteve French void cifs_readahead_to_fscache(struct inode *inode, loff_t pos, size_t len) {}
15238c8a9a5SSteve French 
15338c8a9a5SSteve French #endif /* CONFIG_CIFS_FSCACHE */
15438c8a9a5SSteve French 
15538c8a9a5SSteve French #endif /* _CIFS_FSCACHE_H */
156