4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 only,
8 * as published by the Free Software Foundation.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License version 2 for more details (a copy is included
14 * in the LICENSE file that accompanied this code).
16 * You should have received a copy of the GNU General Public License
17 * version 2 along with this program; If not, see
18 * http://www.gnu.org/licenses/gpl-2.0.html
23 * Copyright (c) 2017, DDN Storage Corporation.
27 * Persistent Client Cache
29 * Author: Li Xi <lixi@ddn.com>
35 #include <linux/types.h>
37 #include <linux/seq_file.h>
39 #include <uapi/linux/lustre/lustre_user.h>
41 extern struct kmem_cache *pcc_inode_slab;
43 #define LPROCFS_WR_PCC_MAX_CMD 4096
45 /* User/Group/Project ID */
48 struct list_head pmi_linkage;
51 /* wildcard file name */
52 struct pcc_match_fname {
54 struct list_head pmf_linkage;
65 struct pcc_expression {
66 enum pcc_field pe_field;
67 struct list_head pe_cond;
68 struct list_head pe_linkage;
71 struct pcc_conjunction {
72 /* link to disjunction */
73 struct list_head pc_linkage;
74 /* list of logical conjunction */
75 struct list_head pc_expressions;
79 * Match rule for auto PCC-cached files.
81 struct pcc_match_rule {
83 struct list_head pmr_conds;
94 __u32 pccd_rwid; /* Archive ID */
95 __u32 pccd_roid; /* Readonly ID */
96 struct pcc_match_rule pccd_rule; /* Match rule */
97 __u32 pccd_rwonly:1, /* Only use as RW-PCC */
98 pccd_roonly:1; /* Only use as RO-PCC */
99 char pccd_pathname[PATH_MAX]; /* full path */
100 struct path pccd_path; /* Root path */
101 struct list_head pccd_linkage; /* Linked to pccs_datasets */
102 atomic_t pccd_refcount; /* Reference count */
106 /* Protect pccs_datasets */
107 spinlock_t pccs_lock;
108 /* List of datasets */
109 struct list_head pccs_datasets;
110 /* creds of process who forced instantiation of super block */
111 const struct cred *pccs_cred;
115 struct ll_inode_info *pcci_lli;
116 /* Cache path on local file system */
117 struct path pcci_path;
119 * If reference count is 0, then the cache is not inited, if 1, then
120 * no one is using it.
122 atomic_t pcci_refcount;
123 /* Whether readonly or readwrite PCC */
124 enum lu_pcc_type pcci_type;
125 /* Whether the inode attr is cached locally */
126 bool pcci_attr_valid;
127 /* Layout generation */
128 __u32 pcci_layout_gen;
130 * How many IOs are on going on this cached object. Layout can be
131 * changed only if there is no active IO.
133 atomic_t pcci_active_ios;
134 /* Waitq - wait for PCC I/O completion. */
135 wait_queue_head_t pcci_waitq;
139 /* Opened cache file */
140 struct file *pccf_file;
141 /* Whether readonly or readwrite PCC */
142 enum lu_pcc_type pccf_type;
152 enum pcc_cmd_type pccc_cmd;
158 struct list_head pccc_conds;
159 char *pccc_conds_str;
167 int pcc_super_init(struct pcc_super *super);
168 void pcc_super_fini(struct pcc_super *super);
169 int pcc_cmd_handle(char *buffer, unsigned long count,
170 struct pcc_super *super);
171 int pcc_super_dump(struct pcc_super *super, struct seq_file *m);
172 int pcc_readwrite_attach(struct file *file, struct inode *inode,
174 int pcc_readwrite_attach_fini(struct file *file, struct inode *inode,
175 __u32 gen, bool lease_broken, int rc,
177 int pcc_ioctl_detach(struct inode *inode);
178 int pcc_ioctl_state(struct file *file, struct inode *inode,
179 struct lu_pcc_state *state);
180 void pcc_file_init(struct pcc_file *pccf);
181 int pcc_file_open(struct inode *inode, struct file *file);
182 void pcc_file_release(struct inode *inode, struct file *file);
183 ssize_t pcc_file_read_iter(struct kiocb *iocb, struct iov_iter *iter,
185 ssize_t pcc_file_write_iter(struct kiocb *iocb, struct iov_iter *iter,
187 int pcc_inode_getattr(struct inode *inode, bool *cached);
188 int pcc_inode_setattr(struct inode *inode, struct iattr *attr, bool *cached);
189 ssize_t pcc_file_splice_read(struct file *in_file, loff_t *ppos,
190 struct pipe_inode_info *pipe, size_t count,
191 unsigned int flags, bool *cached);
192 int pcc_fsync(struct file *file, loff_t start, loff_t end,
193 int datasync, bool *cached);
194 int pcc_file_mmap(struct file *file, struct vm_area_struct *vma, bool *cached);
195 void pcc_vm_open(struct vm_area_struct *vma);
196 void pcc_vm_close(struct vm_area_struct *vma);
197 int pcc_fault(struct vm_area_struct *mva, struct vm_fault *vmf, bool *cached);
198 int pcc_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf,
200 int pcc_inode_create(struct super_block *sb, struct pcc_dataset *dataset,
201 struct lu_fid *fid, struct dentry **pcc_dentry);
202 int pcc_inode_create_fini(struct pcc_dataset *dataset, struct inode *inode,
203 struct dentry *pcc_dentry);
204 struct pcc_dataset *pcc_dataset_match_get(struct pcc_super *super,
205 struct pcc_matcher *matcher);
206 void pcc_dataset_put(struct pcc_dataset *dataset);
207 void pcc_inode_free(struct inode *inode);
208 void pcc_layout_invalidate(struct inode *inode);
210 #endif /* LLITE_PCC_H */