11f327613SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only 299ccbd22SMilosz Tanski /* 399ccbd22SMilosz Tanski * Ceph cache definitions. 499ccbd22SMilosz Tanski * 599ccbd22SMilosz Tanski * Copyright (C) 2013 by Adfin Solutions, Inc. All Rights Reserved. 699ccbd22SMilosz Tanski * Written by Milosz Tanski (milosz@adfin.com) 799ccbd22SMilosz Tanski */ 899ccbd22SMilosz Tanski 948f930eaSIlya Dryomov #include <linux/ceph/ceph_debug.h> 1048f930eaSIlya Dryomov 1182995cc6SDavid Howells #include <linux/fs_context.h> 1299ccbd22SMilosz Tanski #include "super.h" 1399ccbd22SMilosz Tanski #include "cache.h" 1499ccbd22SMilosz Tanski 15400e1286SJeff Layton void ceph_fscache_register_inode_cookie(struct inode *inode) 1699ccbd22SMilosz Tanski { 17400e1286SJeff Layton struct ceph_inode_info *ci = ceph_inode(inode); 18400e1286SJeff Layton struct ceph_fs_client *fsc = ceph_inode_to_client(inode); 19400e1286SJeff Layton 20400e1286SJeff Layton /* No caching for filesystem? */ 21400e1286SJeff Layton if (!fsc->fscache) 22400e1286SJeff Layton return; 23400e1286SJeff Layton 24400e1286SJeff Layton /* Regular files only */ 25400e1286SJeff Layton if (!S_ISREG(inode->i_mode)) 26400e1286SJeff Layton return; 27400e1286SJeff Layton 28400e1286SJeff Layton /* Only new inodes! */ 29400e1286SJeff Layton if (!(inode->i_state & I_NEW)) 30400e1286SJeff Layton return; 31400e1286SJeff Layton 32874c8ca1SDavid Howells WARN_ON_ONCE(ci->netfs.cache); 33400e1286SJeff Layton 34874c8ca1SDavid Howells ci->netfs.cache = 35bc899ee1SDavid Howells fscache_acquire_cookie(fsc->fscache, 0, 36400e1286SJeff Layton &ci->i_vino, sizeof(ci->i_vino), 37400e1286SJeff Layton &ci->i_version, sizeof(ci->i_version), 38400e1286SJeff Layton i_size_read(inode)); 39*b4fa966fSDavid Howells if (ci->netfs.cache) 40*b4fa966fSDavid Howells mapping_set_release_always(inode->i_mapping); 4199ccbd22SMilosz Tanski } 4299ccbd22SMilosz Tanski 43400e1286SJeff Layton void ceph_fscache_unregister_inode_cookie(struct ceph_inode_info *ci) 4499ccbd22SMilosz Tanski { 45bc899ee1SDavid Howells fscache_relinquish_cookie(ceph_fscache_cookie(ci), false); 46400e1286SJeff Layton } 47400e1286SJeff Layton 48400e1286SJeff Layton void ceph_fscache_use_cookie(struct inode *inode, bool will_modify) 49400e1286SJeff Layton { 50400e1286SJeff Layton struct ceph_inode_info *ci = ceph_inode(inode); 51400e1286SJeff Layton 52bc899ee1SDavid Howells fscache_use_cookie(ceph_fscache_cookie(ci), will_modify); 53400e1286SJeff Layton } 54400e1286SJeff Layton 55400e1286SJeff Layton void ceph_fscache_unuse_cookie(struct inode *inode, bool update) 56400e1286SJeff Layton { 57400e1286SJeff Layton struct ceph_inode_info *ci = ceph_inode(inode); 58400e1286SJeff Layton 59400e1286SJeff Layton if (update) { 60400e1286SJeff Layton loff_t i_size = i_size_read(inode); 61400e1286SJeff Layton 62bc899ee1SDavid Howells fscache_unuse_cookie(ceph_fscache_cookie(ci), 63bc899ee1SDavid Howells &ci->i_version, &i_size); 64400e1286SJeff Layton } else { 65bc899ee1SDavid Howells fscache_unuse_cookie(ceph_fscache_cookie(ci), NULL, NULL); 66400e1286SJeff Layton } 67400e1286SJeff Layton } 68400e1286SJeff Layton 69400e1286SJeff Layton void ceph_fscache_update(struct inode *inode) 70400e1286SJeff Layton { 71400e1286SJeff Layton struct ceph_inode_info *ci = ceph_inode(inode); 72400e1286SJeff Layton loff_t i_size = i_size_read(inode); 73400e1286SJeff Layton 74bc899ee1SDavid Howells fscache_update_cookie(ceph_fscache_cookie(ci), &ci->i_version, &i_size); 75400e1286SJeff Layton } 76400e1286SJeff Layton 77400e1286SJeff Layton void ceph_fscache_invalidate(struct inode *inode, bool dio_write) 78400e1286SJeff Layton { 79400e1286SJeff Layton struct ceph_inode_info *ci = ceph_inode(inode); 80400e1286SJeff Layton 81bc899ee1SDavid Howells fscache_invalidate(ceph_fscache_cookie(ci), 82400e1286SJeff Layton &ci->i_version, i_size_read(inode), 83400e1286SJeff Layton dio_write ? FSCACHE_INVAL_DIO_WRITE : 0); 8499ccbd22SMilosz Tanski } 8599ccbd22SMilosz Tanski 8682995cc6SDavid Howells int ceph_fscache_register_fs(struct ceph_fs_client* fsc, struct fs_context *fc) 8799ccbd22SMilosz Tanski { 881d8f8360SYan, Zheng const struct ceph_fsid *fsid = &fsc->client->fsid; 891d8f8360SYan, Zheng const char *fscache_uniq = fsc->mount_options->fscache_uniq; 901d8f8360SYan, Zheng size_t uniq_len = fscache_uniq ? strlen(fscache_uniq) : 0; 91400e1286SJeff Layton char *name; 921d8f8360SYan, Zheng int err = 0; 931d8f8360SYan, Zheng 94400e1286SJeff Layton name = kasprintf(GFP_KERNEL, "ceph,%pU%s%s", fsid, uniq_len ? "," : "", 95400e1286SJeff Layton uniq_len ? fscache_uniq : ""); 96400e1286SJeff Layton if (!name) 97400e1286SJeff Layton return -ENOMEM; 981d8f8360SYan, Zheng 99400e1286SJeff Layton fsc->fscache = fscache_acquire_volume(name, NULL, NULL, 0); 100400e1286SJeff Layton if (IS_ERR_OR_NULL(fsc->fscache)) { 101400e1286SJeff Layton errorfc(fc, "Unable to register fscache cookie for %s", name); 102400e1286SJeff Layton err = fsc->fscache ? PTR_ERR(fsc->fscache) : -EOPNOTSUPP; 103400e1286SJeff Layton fsc->fscache = NULL; 1041d8f8360SYan, Zheng } 105400e1286SJeff Layton kfree(name); 1061d8f8360SYan, Zheng return err; 10799ccbd22SMilosz Tanski } 10899ccbd22SMilosz Tanski 10999ccbd22SMilosz Tanski void ceph_fscache_unregister_fs(struct ceph_fs_client* fsc) 11099ccbd22SMilosz Tanski { 111400e1286SJeff Layton fscache_relinquish_volume(fsc->fscache, NULL, false); 11299ccbd22SMilosz Tanski } 113