]>
Commit | Line | Data |
---|---|---|
929be906 | 1 | /* SPDX-License-Identifier: LGPL-2.1 */ |
f579cf3c | 2 | /* |
099dd788 | 3 | * CIFS filesystem cache interface definitions |
f579cf3c SJ |
4 | * |
5 | * Copyright (c) 2010 Novell, Inc. | |
6 | * Authors(s): Suresh Jayaraman (sjayaraman@suse.de> | |
7 | * | |
f579cf3c SJ |
8 | */ |
9 | #ifndef _CIFS_FSCACHE_H | |
10 | #define _CIFS_FSCACHE_H | |
11 | ||
0174ee99 | 12 | #include <linux/swap.h> |
f579cf3c SJ |
13 | #include <linux/fscache.h> |
14 | ||
488f1d2d SJ |
15 | #include "cifsglob.h" |
16 | ||
58659854 | 17 | /* |
70431bfd | 18 | * Coherency data attached to CIFS volume within the cache |
58659854 | 19 | */ |
70431bfd DH |
20 | struct cifs_fscache_volume_coherency_data { |
21 | __le64 resource_id; /* unique server resource id */ | |
58659854 | 22 | __le64 vol_create_time; |
70431bfd | 23 | __le32 vol_serial_number; |
58659854 SF |
24 | } __packed; |
25 | ||
402cb8dd | 26 | /* |
70431bfd | 27 | * Coherency data attached to CIFS inode within the cache. |
402cb8dd | 28 | */ |
70431bfd DH |
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; | |
402cb8dd DH |
34 | }; |
35 | ||
70431bfd | 36 | #ifdef CONFIG_CIFS_FSCACHE |
f579cf3c | 37 | |
488f1d2d SJ |
38 | /* |
39 | * fscache.c | |
40 | */ | |
70431bfd | 41 | extern int cifs_fscache_get_super_cookie(struct cifs_tcon *); |
96daf2b0 | 42 | extern void cifs_fscache_release_super_cookie(struct cifs_tcon *); |
488f1d2d | 43 | |
70431bfd | 44 | extern void cifs_fscache_get_inode_cookie(struct inode *inode); |
9451a9a5 | 45 | extern void cifs_fscache_release_inode_cookie(struct inode *); |
70431bfd DH |
46 | extern void cifs_fscache_unuse_inode_cookie(struct inode *inode, bool update); |
47 | ||
48 | static inline | |
49 | void cifs_fscache_fill_coherency(struct inode *inode, | |
50 | struct cifs_fscache_inode_coherency_data *cd) | |
51 | { | |
52 | struct cifsInodeInfo *cifsi = CIFS_I(inode); | |
53 | ||
54 | memset(cd, 0, sizeof(*cd)); | |
874c8ca1 DH |
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); | |
70431bfd DH |
59 | } |
60 | ||
9451a9a5 | 61 | |
70431bfd | 62 | static inline struct fscache_cookie *cifs_inode_cookie(struct inode *inode) |
85f2d6b4 | 63 | { |
e81fb419 | 64 | return netfs_i_cookie(&CIFS_I(inode)->netfs); |
85f2d6b4 SJ |
65 | } |
66 | ||
70431bfd | 67 | static inline void cifs_invalidate_cache(struct inode *inode, unsigned int flags) |
18d04062 | 68 | { |
70431bfd | 69 | struct cifs_fscache_inode_coherency_data cd; |
18d04062 | 70 | |
70431bfd DH |
71 | cifs_fscache_fill_coherency(inode, &cd); |
72 | fscache_invalidate(cifs_inode_cookie(inode), &cd, | |
73 | i_size_read(inode), flags); | |
18d04062 SP |
74 | } |
75 | ||
0174ee99 DH |
76 | extern int __cifs_fscache_query_occupancy(struct inode *inode, |
77 | pgoff_t first, unsigned int nr_pages, | |
78 | pgoff_t *_data_first, | |
79 | unsigned int *_data_nr_pages); | |
56698236 | 80 | |
0174ee99 DH |
81 | static inline int cifs_fscache_query_occupancy(struct inode *inode, |
82 | pgoff_t first, unsigned int nr_pages, | |
83 | pgoff_t *_data_first, | |
84 | unsigned int *_data_nr_pages) | |
85 | { | |
86 | if (!cifs_inode_cookie(inode)) | |
87 | return -ENOBUFS; | |
88 | return __cifs_fscache_query_occupancy(inode, first, nr_pages, | |
89 | _data_first, _data_nr_pages); | |
56698236 SJ |
90 | } |
91 | ||
0174ee99 DH |
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); | |
94 | ||
95 | ||
96 | static inline int cifs_readpage_from_fscache(struct inode *inode, | |
97 | struct page *page) | |
56698236 | 98 | { |
0174ee99 DH |
99 | if (cifs_inode_cookie(inode)) |
100 | return __cifs_readpage_from_fscache(inode, page); | |
56698236 SJ |
101 | return -ENOBUFS; |
102 | } | |
103 | ||
9dc06558 SJ |
104 | static inline void cifs_readpage_to_fscache(struct inode *inode, |
105 | struct page *page) | |
106 | { | |
0174ee99 | 107 | if (cifs_inode_cookie(inode)) |
9dc06558 SJ |
108 | __cifs_readpage_to_fscache(inode, page); |
109 | } | |
110 | ||
70431bfd DH |
111 | #else /* CONFIG_CIFS_FSCACHE */ |
112 | static inline | |
113 | void cifs_fscache_fill_coherency(struct inode *inode, | |
114 | struct cifs_fscache_inode_coherency_data *cd) | |
54afa990 | 115 | { |
54afa990 DH |
116 | } |
117 | ||
70431bfd DH |
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) {} | |
488f1d2d | 120 | |
70431bfd | 121 | static inline void cifs_fscache_get_inode_cookie(struct inode *inode) {} |
9451a9a5 | 122 | static inline void cifs_fscache_release_inode_cookie(struct inode *inode) {} |
70431bfd DH |
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) {} | |
18d04062 | 126 | |
0174ee99 DH |
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) | |
56698236 | 131 | { |
0174ee99 DH |
132 | *_data_first = ULONG_MAX; |
133 | *_data_nr_pages = 0; | |
56698236 SJ |
134 | return -ENOBUFS; |
135 | } | |
136 | ||
0174ee99 DH |
137 | static inline int |
138 | cifs_readpage_from_fscache(struct inode *inode, struct page *page) | |
56698236 SJ |
139 | { |
140 | return -ENOBUFS; | |
141 | } | |
142 | ||
0174ee99 DH |
143 | static inline |
144 | void cifs_readpage_to_fscache(struct inode *inode, struct page *page) {} | |
145 | ||
f579cf3c SJ |
146 | #endif /* CONFIG_CIFS_FSCACHE */ |
147 | ||
148 | #endif /* _CIFS_FSCACHE_H */ |