1/* 2 * fs/cifs/fscache.h - CIFS filesystem cache interface definitions 3 * 4 * Copyright (c) 2010 Novell, Inc. 5 * Authors(s): Suresh Jayaraman (sjayaraman@suse.de> 6 * 7 * This library is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU Lesser General Public License as published 9 * by the Free Software Foundation; either version 2.1 of the License, or 10 * (at your option) any later version. 11 * 12 * This library is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 15 * the GNU Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public License 18 * along with this library; if not, write to the Free Software 19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20 */ 21#ifndef _CIFS_FSCACHE_H 22#define _CIFS_FSCACHE_H 23 24#include <linux/fscache.h> 25 26#include "cifsglob.h" 27 28#ifdef CONFIG_CIFS_FSCACHE 29 30/* 31 * Auxiliary data attached to CIFS superblock within the cache 32 */ 33struct cifs_fscache_super_auxdata { 34 u64 resource_id; /* unique server resource id */ 35 __le64 vol_create_time; 36 u32 vol_serial_number; 37} __packed; 38 39/* 40 * Auxiliary data attached to CIFS inode within the cache 41 */ 42struct cifs_fscache_inode_auxdata { 43 u64 last_write_time_sec; 44 u64 last_change_time_sec; 45 u32 last_write_time_nsec; 46 u32 last_change_time_nsec; 47 u64 eof; 48}; 49 50/* 51 * cache.c 52 */ 53extern struct fscache_netfs cifs_fscache_netfs; 54extern const struct fscache_cookie_def cifs_fscache_server_index_def; 55extern const struct fscache_cookie_def cifs_fscache_super_index_def; 56extern const struct fscache_cookie_def cifs_fscache_inode_object_def; 57 58extern int cifs_fscache_register(void); 59extern void cifs_fscache_unregister(void); 60extern char *extract_sharename(const char *); 61 62/* 63 * fscache.c 64 */ 65extern void cifs_fscache_get_client_cookie(struct TCP_Server_Info *); 66extern void cifs_fscache_release_client_cookie(struct TCP_Server_Info *); 67extern void cifs_fscache_get_super_cookie(struct cifs_tcon *); 68extern void cifs_fscache_release_super_cookie(struct cifs_tcon *); 69 70extern void cifs_fscache_release_inode_cookie(struct inode *); 71extern void cifs_fscache_set_inode_cookie(struct inode *, struct file *); 72extern void cifs_fscache_reset_inode_cookie(struct inode *); 73 74extern void __cifs_fscache_invalidate_page(struct page *, struct inode *); 75extern int cifs_fscache_release_page(struct page *page, gfp_t gfp); 76extern int __cifs_readpage_from_fscache(struct inode *, struct page *); 77extern int __cifs_readpages_from_fscache(struct inode *, 78 struct address_space *, 79 struct list_head *, 80 unsigned *); 81extern void __cifs_fscache_readpages_cancel(struct inode *, struct list_head *); 82 83extern void __cifs_readpage_to_fscache(struct inode *, struct page *); 84 85static inline void cifs_fscache_invalidate_page(struct page *page, 86 struct inode *inode) 87{ 88 if (PageFsCache(page)) 89 __cifs_fscache_invalidate_page(page, inode); 90} 91 92static inline int cifs_readpage_from_fscache(struct inode *inode, 93 struct page *page) 94{ 95 if (CIFS_I(inode)->fscache) 96 return __cifs_readpage_from_fscache(inode, page); 97 98 return -ENOBUFS; 99} 100 101static inline int cifs_readpages_from_fscache(struct inode *inode, 102 struct address_space *mapping, 103 struct list_head *pages, 104 unsigned *nr_pages) 105{ 106 if (CIFS_I(inode)->fscache) 107 return __cifs_readpages_from_fscache(inode, mapping, pages, 108 nr_pages); 109 return -ENOBUFS; 110} 111 112static inline void cifs_readpage_to_fscache(struct inode *inode, 113 struct page *page) 114{ 115 if (PageFsCache(page)) 116 __cifs_readpage_to_fscache(inode, page); 117} 118 119static inline void cifs_fscache_readpages_cancel(struct inode *inode, 120 struct list_head *pages) 121{ 122 if (CIFS_I(inode)->fscache) 123 return __cifs_fscache_readpages_cancel(inode, pages); 124} 125 126#else /* CONFIG_CIFS_FSCACHE */ 127static inline int cifs_fscache_register(void) { return 0; } 128static inline void cifs_fscache_unregister(void) {} 129 130static inline void 131cifs_fscache_get_client_cookie(struct TCP_Server_Info *server) {} 132static inline void 133cifs_fscache_release_client_cookie(struct TCP_Server_Info *server) {} 134static inline void cifs_fscache_get_super_cookie(struct cifs_tcon *tcon) {} 135static inline void 136cifs_fscache_release_super_cookie(struct cifs_tcon *tcon) {} 137 138static inline void cifs_fscache_release_inode_cookie(struct inode *inode) {} 139static inline void cifs_fscache_set_inode_cookie(struct inode *inode, 140 struct file *filp) {} 141static inline void cifs_fscache_reset_inode_cookie(struct inode *inode) {} 142static inline int cifs_fscache_release_page(struct page *page, gfp_t gfp) 143{ 144 return 1; /* May release page */ 145} 146 147static inline void cifs_fscache_invalidate_page(struct page *page, 148 struct inode *inode) {} 149static inline int 150cifs_readpage_from_fscache(struct inode *inode, struct page *page) 151{ 152 return -ENOBUFS; 153} 154 155static inline int cifs_readpages_from_fscache(struct inode *inode, 156 struct address_space *mapping, 157 struct list_head *pages, 158 unsigned *nr_pages) 159{ 160 return -ENOBUFS; 161} 162 163static inline void cifs_readpage_to_fscache(struct inode *inode, 164 struct page *page) {} 165 166static inline void cifs_fscache_readpages_cancel(struct inode *inode, 167 struct list_head *pages) 168{ 169} 170 171#endif /* CONFIG_CIFS_FSCACHE */ 172 173#endif /* _CIFS_FSCACHE_H */ 174