1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * V9FS cache definitions. 4 * 5 * Copyright (C) 2009 by Abhishek Kulkarni <adkulkar@umail.iu.edu> 6 */ 7 8 #include <linux/jiffies.h> 9 #include <linux/file.h> 10 #include <linux/slab.h> 11 #include <linux/stat.h> 12 #include <linux/sched.h> 13 #include <linux/fs.h> 14 #include <net/9p/9p.h> 15 16 #include "v9fs.h" 17 #include "cache.h" 18 19 int v9fs_cache_session_get_cookie(struct v9fs_session_info *v9ses, 20 const char *dev_name) 21 { 22 struct fscache_volume *vcookie; 23 char *name, *p; 24 25 name = kasprintf(GFP_KERNEL, "9p,%s,%s", 26 dev_name, v9ses->cachetag ?: v9ses->aname); 27 if (!name) 28 return -ENOMEM; 29 30 for (p = name; *p; p++) 31 if (*p == '/') 32 *p = ';'; 33 34 vcookie = fscache_acquire_volume(name, NULL, NULL, 0); 35 p9_debug(P9_DEBUG_FSC, "session %p get volume %p (%s)\n", 36 v9ses, vcookie, name); 37 if (IS_ERR(vcookie)) { 38 if (vcookie != ERR_PTR(-EBUSY)) { 39 kfree(name); 40 return PTR_ERR(vcookie); 41 } 42 pr_err("Cache volume key already in use (%s)\n", name); 43 vcookie = NULL; 44 } 45 v9ses->fscache = vcookie; 46 kfree(name); 47 return 0; 48 } 49 50 void v9fs_cache_inode_get_cookie(struct inode *inode) 51 { 52 struct v9fs_inode *v9inode = V9FS_I(inode); 53 struct v9fs_session_info *v9ses; 54 __le32 version; 55 __le64 path; 56 57 if (!S_ISREG(inode->i_mode)) 58 return; 59 if (WARN_ON(v9fs_inode_cookie(v9inode))) 60 return; 61 62 version = cpu_to_le32(v9inode->qid.version); 63 path = cpu_to_le64(v9inode->qid.path); 64 v9ses = v9fs_inode2v9ses(inode); 65 v9inode->netfs.cache = 66 fscache_acquire_cookie(v9fs_session_cache(v9ses), 67 0, 68 &path, sizeof(path), 69 &version, sizeof(version), 70 i_size_read(&v9inode->netfs.inode)); 71 if (v9inode->netfs.cache) 72 mapping_set_release_always(inode->i_mapping); 73 74 p9_debug(P9_DEBUG_FSC, "inode %p get cookie %p\n", 75 inode, v9fs_inode_cookie(v9inode)); 76 } 77