#include <linux/types.h>
#include <linux/fs.h>
#include <linux/seq_file.h>
+#include <linux/mm.h>
#include <uapi/linux/lustre/lustre_user.h>
extern struct kmem_cache *pcc_inode_slab;
};
struct pcc_inode {
+ struct ll_inode_info *pcci_lli;
/* Cache path on local file system */
- struct path pcci_path;
+ struct path pcci_path;
/*
* If reference count is 0, then the cache is not inited, if 1, then
* no one is using it.
*/
- atomic_t pcci_refcount;
+ atomic_t pcci_refcount;
/* Whether readonly or readwrite PCC */
- enum lu_pcc_type pcci_type;
- /* Whether the inode is cached locally */
- bool pcci_attr_valid;
+ enum lu_pcc_type pcci_type;
+ /* Whether the inode attr is cached locally */
+ bool pcci_attr_valid;
+ /* Layout generation */
+ __u32 pcci_layout_gen;
+ /*
+ * How many IOs are on going on this cached object. Layout can be
+ * changed only if there is no active IO.
+ */
+ atomic_t pcci_active_ios;
+ /* Waitq - wait for PCC I/O completion. */
+ wait_queue_head_t pcci_waitq;
};
struct pcc_file {
void pcc_super_fini(struct pcc_super *super);
int pcc_cmd_handle(char *buffer, unsigned long count,
struct pcc_super *super);
-int
-pcc_super_dump(struct pcc_super *super, struct seq_file *m);
-int pcc_readwrite_attach(struct file *file,
- struct inode *inode, __u32 arch_id);
+int pcc_super_dump(struct pcc_super *super, struct seq_file *m);
+int pcc_readwrite_attach(struct file *file, struct inode *inode,
+ __u32 arch_id);
int pcc_readwrite_attach_fini(struct file *file, struct inode *inode,
- bool lease_broken, int rc, bool attached);
+ __u32 gen, bool lease_broken, int rc,
+ bool attached);
int pcc_ioctl_detach(struct inode *inode);
-int pcc_ioctl_state(struct inode *inode, struct lu_pcc_state *state);
+int pcc_ioctl_state(struct file *file, struct inode *inode,
+ struct lu_pcc_state *state);
void pcc_file_init(struct pcc_file *pccf);
int pcc_file_open(struct inode *inode, struct file *file);
void pcc_file_release(struct inode *inode, struct file *file);
bool *cached);
int pcc_inode_getattr(struct inode *inode, bool *cached);
int pcc_inode_setattr(struct inode *inode, struct iattr *attr, bool *cached);
+ssize_t pcc_file_splice_read(struct file *in_file, loff_t *ppos,
+ struct pipe_inode_info *pipe, size_t count,
+ unsigned int flags, bool *cached);
+int pcc_fsync(struct file *file, loff_t start, loff_t end,
+ int datasync, bool *cached);
+int pcc_file_mmap(struct file *file, struct vm_area_struct *vma, bool *cached);
+void pcc_vm_open(struct vm_area_struct *vma);
+void pcc_vm_close(struct vm_area_struct *vma);
+int pcc_fault(struct vm_area_struct *mva, struct vm_fault *vmf, bool *cached);
+int pcc_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf,
+ bool *cached);
int pcc_inode_create(struct pcc_dataset *dataset, struct lu_fid *fid,
struct dentry **pcc_dentry);
int pcc_inode_create_fini(struct pcc_dataset *dataset, struct inode *inode,
struct dentry *pcc_dentry);
-struct pcc_dataset *
-pcc_dataset_get(struct pcc_super *super, __u32 projid, __u32 archive_id);
+struct pcc_dataset *pcc_dataset_get(struct pcc_super *super, __u32 projid,
+ __u32 archive_id);
void pcc_dataset_put(struct pcc_dataset *dataset);
void pcc_inode_free(struct inode *inode);
+void pcc_layout_invalidate(struct inode *inode);
+
#endif /* LLITE_PCC_H */