1 /* SPDX-License-Identifier: LGPL-2.1 */
3 * CIFS filesystem cache interface definitions
5 * Copyright (c) 2010 Novell, Inc.
6 * Authors(s): Suresh Jayaraman (sjayaraman@suse.de>
9 #ifndef _CIFS_FSCACHE_H
10 #define _CIFS_FSCACHE_H
12 #include <linux/swap.h>
13 #include <linux/fscache.h>
18 * Coherency data attached to CIFS volume within the cache
20 struct cifs_fscache_volume_coherency_data
{
21 __le64 resource_id
; /* unique server resource id */
22 __le64 vol_create_time
;
23 __le32 vol_serial_number
;
27 * Coherency data attached to CIFS inode within the cache.
29 struct cifs_fscache_inode_coherency_data
{
30 __le64 last_write_time_sec
;
31 __le64 last_change_time_sec
;
32 __le32 last_write_time_nsec
;
33 __le32 last_change_time_nsec
;
36 #ifdef CONFIG_CIFS_FSCACHE
41 extern int cifs_fscache_get_super_cookie(struct cifs_tcon
*);
42 extern void cifs_fscache_release_super_cookie(struct cifs_tcon
*);
44 extern void cifs_fscache_get_inode_cookie(struct inode
*inode
);
45 extern void cifs_fscache_release_inode_cookie(struct inode
*);
46 extern void cifs_fscache_unuse_inode_cookie(struct inode
*inode
, bool update
);
49 void cifs_fscache_fill_coherency(struct inode
*inode
,
50 struct cifs_fscache_inode_coherency_data
*cd
)
52 struct cifsInodeInfo
*cifsi
= CIFS_I(inode
);
54 memset(cd
, 0, sizeof(*cd
));
55 cd
->last_write_time_sec
= cpu_to_le64(cifsi
->netfs
.inode
.i_mtime
.tv_sec
);
56 cd
->last_write_time_nsec
= cpu_to_le32(cifsi
->netfs
.inode
.i_mtime
.tv_nsec
);
57 cd
->last_change_time_sec
= cpu_to_le64(cifsi
->netfs
.inode
.i_ctime
.tv_sec
);
58 cd
->last_change_time_nsec
= cpu_to_le32(cifsi
->netfs
.inode
.i_ctime
.tv_nsec
);
62 static inline struct fscache_cookie
*cifs_inode_cookie(struct inode
*inode
)
64 return netfs_i_cookie(&CIFS_I(inode
)->netfs
);
67 static inline void cifs_invalidate_cache(struct inode
*inode
, unsigned int flags
)
69 struct cifs_fscache_inode_coherency_data cd
;
71 cifs_fscache_fill_coherency(inode
, &cd
);
72 fscache_invalidate(cifs_inode_cookie(inode
), &cd
,
73 i_size_read(inode
), flags
);
76 extern int __cifs_fscache_query_occupancy(struct inode
*inode
,
77 pgoff_t first
, unsigned int nr_pages
,
79 unsigned int *_data_nr_pages
);
81 static inline int cifs_fscache_query_occupancy(struct inode
*inode
,
82 pgoff_t first
, unsigned int nr_pages
,
84 unsigned int *_data_nr_pages
)
86 if (!cifs_inode_cookie(inode
))
88 return __cifs_fscache_query_occupancy(inode
, first
, nr_pages
,
89 _data_first
, _data_nr_pages
);
92 extern int __cifs_readpage_from_fscache(struct inode
*pinode
, struct page
*ppage
);
93 extern void __cifs_readpage_to_fscache(struct inode
*pinode
, struct page
*ppage
);
96 static inline int cifs_readpage_from_fscache(struct inode
*inode
,
99 if (cifs_inode_cookie(inode
))
100 return __cifs_readpage_from_fscache(inode
, page
);
104 static inline void cifs_readpage_to_fscache(struct inode
*inode
,
107 if (cifs_inode_cookie(inode
))
108 __cifs_readpage_to_fscache(inode
, page
);
111 #else /* CONFIG_CIFS_FSCACHE */
113 void cifs_fscache_fill_coherency(struct inode
*inode
,
114 struct cifs_fscache_inode_coherency_data
*cd
)
118 static inline int cifs_fscache_get_super_cookie(struct cifs_tcon
*tcon
) { return 0; }
119 static inline void cifs_fscache_release_super_cookie(struct cifs_tcon
*tcon
) {}
121 static inline void cifs_fscache_get_inode_cookie(struct inode
*inode
) {}
122 static inline void cifs_fscache_release_inode_cookie(struct inode
*inode
) {}
123 static inline void cifs_fscache_unuse_inode_cookie(struct inode
*inode
, bool update
) {}
124 static inline struct fscache_cookie
*cifs_inode_cookie(struct inode
*inode
) { return NULL
; }
125 static inline void cifs_invalidate_cache(struct inode
*inode
, unsigned int flags
) {}
127 static inline int cifs_fscache_query_occupancy(struct inode
*inode
,
128 pgoff_t first
, unsigned int nr_pages
,
129 pgoff_t
*_data_first
,
130 unsigned int *_data_nr_pages
)
132 *_data_first
= ULONG_MAX
;
138 cifs_readpage_from_fscache(struct inode
*inode
, struct page
*page
)
144 void cifs_readpage_to_fscache(struct inode
*inode
, struct page
*page
) {}
146 #endif /* CONFIG_CIFS_FSCACHE */
148 #endif /* _CIFS_FSCACHE_H */