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, fmt: "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(volume_key: name, NULL, NULL, coherency_len: 0); |
35 | p9_debug(P9_DEBUG_FSC, "session %p get volume %p (%s)\n" , |
36 | v9ses, vcookie, name); |
37 | if (IS_ERR(ptr: vcookie)) { |
38 | if (vcookie != ERR_PTR(error: -EBUSY)) { |
39 | kfree(objp: name); |
40 | return PTR_ERR(ptr: vcookie); |
41 | } |
42 | pr_err("Cache volume key already in use (%s)\n" , name); |
43 | vcookie = NULL; |
44 | } |
45 | v9ses->fscache = vcookie; |
46 | kfree(objp: 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(volume: v9fs_session_cache(v9ses), |
67 | advice: 0, |
68 | index_key: &path, index_key_len: sizeof(path), |
69 | aux_data: &version, aux_data_len: sizeof(version), |
70 | object_size: i_size_read(inode: &v9inode->netfs.inode)); |
71 | if (v9inode->netfs.cache) |
72 | mapping_set_release_always(mapping: inode->i_mapping); |
73 | |
74 | p9_debug(P9_DEBUG_FSC, "inode %p get cookie %p\n" , |
75 | inode, v9fs_inode_cookie(v9inode)); |
76 | } |
77 | |