blob: c6ca49ac33d42921aeb715120c2d107093ff0187 [file] [log] [blame]
Steve French929be902021-06-18 00:31:49 -05001/* SPDX-License-Identifier: LGPL-2.1 */
Suresh Jayaramanf579cf32010-07-05 18:11:50 +05302/*
Steve French099dd782021-09-13 14:51:10 -05003 * CIFS filesystem cache interface definitions
Suresh Jayaramanf579cf32010-07-05 18:11:50 +05304 *
5 * Copyright (c) 2010 Novell, Inc.
6 * Authors(s): Suresh Jayaraman (sjayaraman@suse.de>
7 *
Suresh Jayaramanf579cf32010-07-05 18:11:50 +05308 */
9#ifndef _CIFS_FSCACHE_H
10#define _CIFS_FSCACHE_H
11
12#include <linux/fscache.h>
13
Suresh Jayaraman488f1d2d2010-07-05 18:12:15 +053014#include "cifsglob.h"
15
David Howells402cb8d2018-04-04 13:41:28 +010016/*
David Howells70431bf2020-11-17 15:56:59 +000017 * Coherency data attached to CIFS volume within the cache
Steve French58659852020-06-05 17:19:46 -050018 */
David Howells70431bf2020-11-17 15:56:59 +000019struct cifs_fscache_volume_coherency_data {
20 __le64 resource_id; /* unique server resource id */
Steve French58659852020-06-05 17:19:46 -050021 __le64 vol_create_time;
David Howells70431bf2020-11-17 15:56:59 +000022 __le32 vol_serial_number;
Steve French58659852020-06-05 17:19:46 -050023} __packed;
24
25/*
David Howells70431bf2020-11-17 15:56:59 +000026 * Coherency data attached to CIFS inode within the cache.
David Howells402cb8d2018-04-04 13:41:28 +010027 */
David Howells70431bf2020-11-17 15:56:59 +000028struct cifs_fscache_inode_coherency_data {
29 __le64 last_write_time_sec;
30 __le64 last_change_time_sec;
31 __le32 last_write_time_nsec;
32 __le32 last_change_time_nsec;
David Howells402cb8d2018-04-04 13:41:28 +010033};
34
David Howells70431bf2020-11-17 15:56:59 +000035#ifdef CONFIG_CIFS_FSCACHE
Suresh Jayaramanf579cf32010-07-05 18:11:50 +053036
Suresh Jayaraman488f1d2d2010-07-05 18:12:15 +053037/*
38 * fscache.c
39 */
David Howells70431bf2020-11-17 15:56:59 +000040extern int cifs_fscache_get_super_cookie(struct cifs_tcon *);
Steve French96daf2b2011-05-27 04:34:02 +000041extern void cifs_fscache_release_super_cookie(struct cifs_tcon *);
Suresh Jayaraman488f1d2d2010-07-05 18:12:15 +053042
David Howells70431bf2020-11-17 15:56:59 +000043extern void cifs_fscache_get_inode_cookie(struct inode *inode);
Suresh Jayaraman9451a9a2010-07-05 18:12:45 +053044extern void cifs_fscache_release_inode_cookie(struct inode *);
David Howells70431bf2020-11-17 15:56:59 +000045extern void cifs_fscache_unuse_inode_cookie(struct inode *inode, bool update);
Suresh Jayaraman9451a9a2010-07-05 18:12:45 +053046
David Howells70431bf2020-11-17 15:56:59 +000047static inline
48void cifs_fscache_fill_coherency(struct inode *inode,
49 struct cifs_fscache_inode_coherency_data *cd)
50{
51 struct cifsInodeInfo *cifsi = CIFS_I(inode);
52
53 memset(cd, 0, sizeof(*cd));
54 cd->last_write_time_sec = cpu_to_le64(cifsi->vfs_inode.i_mtime.tv_sec);
55 cd->last_write_time_nsec = cpu_to_le32(cifsi->vfs_inode.i_mtime.tv_nsec);
56 cd->last_change_time_sec = cpu_to_le64(cifsi->vfs_inode.i_ctime.tv_sec);
57 cd->last_change_time_nsec = cpu_to_le32(cifsi->vfs_inode.i_ctime.tv_nsec);
58}
59
60
Suresh Jayaraman85f2d6b2010-07-05 18:13:00 +053061extern int cifs_fscache_release_page(struct page *page, gfp_t gfp);
Suresh Jayaraman566982362010-07-05 18:13:25 +053062extern int __cifs_readpage_from_fscache(struct inode *, struct page *);
63extern int __cifs_readpages_from_fscache(struct inode *,
64 struct address_space *,
65 struct list_head *,
66 unsigned *);
Suresh Jayaraman9dc06552010-07-05 18:13:11 +053067extern void __cifs_readpage_to_fscache(struct inode *, struct page *);
68
David Howells70431bf2020-11-17 15:56:59 +000069static inline struct fscache_cookie *cifs_inode_cookie(struct inode *inode)
Suresh Jayaraman85f2d6b2010-07-05 18:13:00 +053070{
David Howells70431bf2020-11-17 15:56:59 +000071 return CIFS_I(inode)->fscache;
Suresh Jayaraman85f2d6b2010-07-05 18:13:00 +053072}
73
David Howells70431bf2020-11-17 15:56:59 +000074static inline void cifs_invalidate_cache(struct inode *inode, unsigned int flags)
Shyam Prasad N18d04062021-08-10 10:22:28 +000075{
David Howells70431bf2020-11-17 15:56:59 +000076 struct cifs_fscache_inode_coherency_data cd;
Shyam Prasad N18d04062021-08-10 10:22:28 +000077
David Howells70431bf2020-11-17 15:56:59 +000078 cifs_fscache_fill_coherency(inode, &cd);
79 fscache_invalidate(cifs_inode_cookie(inode), &cd,
80 i_size_read(inode), flags);
Shyam Prasad N18d04062021-08-10 10:22:28 +000081}
82
Suresh Jayaraman566982362010-07-05 18:13:25 +053083static inline int cifs_readpage_from_fscache(struct inode *inode,
84 struct page *page)
85{
86 if (CIFS_I(inode)->fscache)
87 return __cifs_readpage_from_fscache(inode, page);
88
89 return -ENOBUFS;
90}
91
92static inline int cifs_readpages_from_fscache(struct inode *inode,
93 struct address_space *mapping,
94 struct list_head *pages,
95 unsigned *nr_pages)
96{
97 if (CIFS_I(inode)->fscache)
98 return __cifs_readpages_from_fscache(inode, mapping, pages,
99 nr_pages);
100 return -ENOBUFS;
101}
102
Suresh Jayaraman9dc06552010-07-05 18:13:11 +0530103static inline void cifs_readpage_to_fscache(struct inode *inode,
104 struct page *page)
105{
106 if (PageFsCache(page))
107 __cifs_readpage_to_fscache(inode, page);
108}
109
Suresh Jayaramanf579cf32010-07-05 18:11:50 +0530110#else /* CONFIG_CIFS_FSCACHE */
David Howells70431bf2020-11-17 15:56:59 +0000111static inline
112void cifs_fscache_fill_coherency(struct inode *inode,
113 struct cifs_fscache_inode_coherency_data *cd)
Suresh Jayaraman85f2d6b2010-07-05 18:13:00 +0530114{
Suresh Jayaraman85f2d6b2010-07-05 18:13:00 +0530115}
Suresh Jayaraman9451a9a2010-07-05 18:12:45 +0530116
David Howells70431bf2020-11-17 15:56:59 +0000117static inline int cifs_fscache_get_super_cookie(struct cifs_tcon *tcon) { return 0; }
118static inline void cifs_fscache_release_super_cookie(struct cifs_tcon *tcon) {}
119
120static inline void cifs_fscache_get_inode_cookie(struct inode *inode) {}
121static inline void cifs_fscache_release_inode_cookie(struct inode *inode) {}
122static inline void cifs_fscache_unuse_inode_cookie(struct inode *inode, bool update) {}
123static inline struct fscache_cookie *cifs_inode_cookie(struct inode *inode) { return NULL; }
124static inline void cifs_invalidate_cache(struct inode *inode, unsigned int flags) {}
Shyam Prasad N18d04062021-08-10 10:22:28 +0000125
Suresh Jayaraman566982362010-07-05 18:13:25 +0530126static inline int
127cifs_readpage_from_fscache(struct inode *inode, struct page *page)
128{
129 return -ENOBUFS;
130}
131
132static inline int cifs_readpages_from_fscache(struct inode *inode,
133 struct address_space *mapping,
134 struct list_head *pages,
135 unsigned *nr_pages)
136{
137 return -ENOBUFS;
138}
139
Suresh Jayaraman9dc06552010-07-05 18:13:11 +0530140static inline void cifs_readpage_to_fscache(struct inode *inode,
141 struct page *page) {}
Suresh Jayaraman9451a9a2010-07-05 18:12:45 +0530142
Suresh Jayaramanf579cf32010-07-05 18:11:50 +0530143#endif /* CONFIG_CIFS_FSCACHE */
144
145#endif /* _CIFS_FSCACHE_H */