1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * Ceph cache definitions. 4 * 5 * Copyright (C) 2013 by Adfin Solutions, Inc. All Rights Reserved. 6 * Written by Milosz Tanski (milosz@adfin.com) 7 */ 8 9 #ifndef _CEPH_CACHE_H 10 #define _CEPH_CACHE_H 11 12 #include <linux/netfs.h> 13 14 #ifdef CONFIG_CEPH_FSCACHE 15 #include <linux/fscache.h> 16 17 int ceph_fscache_register_fs(struct ceph_fs_client* fsc, struct fs_context *fc); 18 void ceph_fscache_unregister_fs(struct ceph_fs_client* fsc); 19 20 void ceph_fscache_register_inode_cookie(struct inode *inode); 21 void ceph_fscache_unregister_inode_cookie(struct ceph_inode_info* ci); 22 23 void ceph_fscache_use_cookie(struct inode *inode, bool will_modify); 24 void ceph_fscache_unuse_cookie(struct inode *inode, bool update); 25 26 void ceph_fscache_update(struct inode *inode); 27 void ceph_fscache_invalidate(struct inode *inode, bool dio_write); 28 29 static inline void ceph_fscache_inode_init(struct ceph_inode_info *ci) 30 { 31 ci->fscache = NULL; 32 } 33 34 static inline struct fscache_cookie *ceph_fscache_cookie(struct ceph_inode_info *ci) 35 { 36 return ci->fscache; 37 } 38 39 static inline void ceph_fscache_resize(struct inode *inode, loff_t to) 40 { 41 struct ceph_inode_info *ci = ceph_inode(inode); 42 struct fscache_cookie *cookie = ceph_fscache_cookie(ci); 43 44 if (cookie) { 45 ceph_fscache_use_cookie(inode, true); 46 fscache_resize_cookie(cookie, to); 47 ceph_fscache_unuse_cookie(inode, true); 48 } 49 } 50 51 static inline void ceph_fscache_unpin_writeback(struct inode *inode, 52 struct writeback_control *wbc) 53 { 54 fscache_unpin_writeback(wbc, ceph_fscache_cookie(ceph_inode(inode))); 55 } 56 57 static inline int ceph_fscache_set_page_dirty(struct page *page) 58 { 59 struct inode *inode = page->mapping->host; 60 struct ceph_inode_info *ci = ceph_inode(inode); 61 62 return fscache_set_page_dirty(page, ceph_fscache_cookie(ci)); 63 } 64 65 static inline int ceph_begin_cache_operation(struct netfs_read_request *rreq) 66 { 67 struct fscache_cookie *cookie = ceph_fscache_cookie(ceph_inode(rreq->inode)); 68 69 return fscache_begin_read_operation(&rreq->cache_resources, cookie); 70 } 71 72 static inline bool ceph_is_cache_enabled(struct inode *inode) 73 { 74 return fscache_cookie_enabled(ceph_fscache_cookie(ceph_inode(inode))); 75 } 76 77 static inline void ceph_fscache_note_page_release(struct inode *inode) 78 { 79 struct ceph_inode_info *ci = ceph_inode(inode); 80 81 fscache_note_page_release(ceph_fscache_cookie(ci)); 82 } 83 #else /* CONFIG_CEPH_FSCACHE */ 84 static inline int ceph_fscache_register_fs(struct ceph_fs_client* fsc, 85 struct fs_context *fc) 86 { 87 return 0; 88 } 89 90 static inline void ceph_fscache_unregister_fs(struct ceph_fs_client* fsc) 91 { 92 } 93 94 static inline void ceph_fscache_inode_init(struct ceph_inode_info *ci) 95 { 96 } 97 98 static inline void ceph_fscache_register_inode_cookie(struct inode *inode) 99 { 100 } 101 102 static inline void ceph_fscache_unregister_inode_cookie(struct ceph_inode_info* ci) 103 { 104 } 105 106 static inline void ceph_fscache_use_cookie(struct inode *inode, bool will_modify) 107 { 108 } 109 110 static inline void ceph_fscache_unuse_cookie(struct inode *inode, bool update) 111 { 112 } 113 114 static inline void ceph_fscache_update(struct inode *inode) 115 { 116 } 117 118 static inline void ceph_fscache_invalidate(struct inode *inode, bool dio_write) 119 { 120 } 121 122 static inline struct fscache_cookie *ceph_fscache_cookie(struct ceph_inode_info *ci) 123 { 124 return NULL; 125 } 126 127 static inline void ceph_fscache_resize(struct inode *inode, loff_t to) 128 { 129 } 130 131 static inline void ceph_fscache_unpin_writeback(struct inode *inode, 132 struct writeback_control *wbc) 133 { 134 } 135 136 static inline int ceph_fscache_set_page_dirty(struct page *page) 137 { 138 return __set_page_dirty_nobuffers(page); 139 } 140 141 static inline bool ceph_is_cache_enabled(struct inode *inode) 142 { 143 return false; 144 } 145 146 static inline int ceph_begin_cache_operation(struct netfs_read_request *rreq) 147 { 148 return -ENOBUFS; 149 } 150 151 static inline void ceph_fscache_note_page_release(struct inode *inode) 152 { 153 } 154 #endif /* CONFIG_CEPH_FSCACHE */ 155 156 #endif 157