113 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*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#include <linux/ceph/ceph_debug.h>10 11#include <linux/fs_context.h>12#include "super.h"13#include "cache.h"14 15void ceph_fscache_register_inode_cookie(struct inode *inode)16{17 struct ceph_inode_info *ci = ceph_inode(inode);18 struct ceph_fs_client *fsc = ceph_inode_to_fs_client(inode);19 20 /* No caching for filesystem? */21 if (!fsc->fscache)22 return;23 24 /* Regular files only */25 if (!S_ISREG(inode->i_mode))26 return;27 28 /* Only new inodes! */29 if (!(inode->i_state & I_NEW))30 return;31 32 WARN_ON_ONCE(ci->netfs.cache);33 34 ci->netfs.cache =35 fscache_acquire_cookie(fsc->fscache, 0,36 &ci->i_vino, sizeof(ci->i_vino),37 &ci->i_version, sizeof(ci->i_version),38 i_size_read(inode));39 if (ci->netfs.cache)40 mapping_set_release_always(inode->i_mapping);41}42 43void ceph_fscache_unregister_inode_cookie(struct ceph_inode_info *ci)44{45 fscache_relinquish_cookie(ceph_fscache_cookie(ci), false);46}47 48void ceph_fscache_use_cookie(struct inode *inode, bool will_modify)49{50 struct ceph_inode_info *ci = ceph_inode(inode);51 52 fscache_use_cookie(ceph_fscache_cookie(ci), will_modify);53}54 55void ceph_fscache_unuse_cookie(struct inode *inode, bool update)56{57 struct ceph_inode_info *ci = ceph_inode(inode);58 59 if (update) {60 loff_t i_size = i_size_read(inode);61 62 fscache_unuse_cookie(ceph_fscache_cookie(ci),63 &ci->i_version, &i_size);64 } else {65 fscache_unuse_cookie(ceph_fscache_cookie(ci), NULL, NULL);66 }67}68 69void ceph_fscache_update(struct inode *inode)70{71 struct ceph_inode_info *ci = ceph_inode(inode);72 loff_t i_size = i_size_read(inode);73 74 fscache_update_cookie(ceph_fscache_cookie(ci), &ci->i_version, &i_size);75}76 77void ceph_fscache_invalidate(struct inode *inode, bool dio_write)78{79 struct ceph_inode_info *ci = ceph_inode(inode);80 81 fscache_invalidate(ceph_fscache_cookie(ci),82 &ci->i_version, i_size_read(inode),83 dio_write ? FSCACHE_INVAL_DIO_WRITE : 0);84}85 86int ceph_fscache_register_fs(struct ceph_fs_client* fsc, struct fs_context *fc)87{88 const struct ceph_fsid *fsid = &fsc->client->fsid;89 const char *fscache_uniq = fsc->mount_options->fscache_uniq;90 size_t uniq_len = fscache_uniq ? strlen(fscache_uniq) : 0;91 char *name;92 int err = 0;93 94 name = kasprintf(GFP_KERNEL, "ceph,%pU%s%s", fsid, uniq_len ? "," : "",95 uniq_len ? fscache_uniq : "");96 if (!name)97 return -ENOMEM;98 99 fsc->fscache = fscache_acquire_volume(name, NULL, NULL, 0);100 if (IS_ERR_OR_NULL(fsc->fscache)) {101 errorfc(fc, "Unable to register fscache cookie for %s", name);102 err = fsc->fscache ? PTR_ERR(fsc->fscache) : -EOPNOTSUPP;103 fsc->fscache = NULL;104 }105 kfree(name);106 return err;107}108 109void ceph_fscache_unregister_fs(struct ceph_fs_client* fsc)110{111 fscache_relinquish_volume(fsc->fscache, NULL, false);112}113