};
enum pcc_dataset_flags {
- PCC_DATASET_NONE = 0x0,
- /* Try auto attach at open, disabled by default */
- PCC_DATASET_OPEN_ATTACH = 0x1,
+ PCC_DATASET_INVALID = 0x0,
+ /* Indicate that known the file is not in PCC. */
+ PCC_DATASET_NONE = 0x01,
+ /* Try auto attach at open, enabled by default */
+ PCC_DATASET_OPEN_ATTACH = 0x02,
+ /* Try auto attach during IO when layout refresh, enabled by default */
+ PCC_DATASET_IO_ATTACH = 0x04,
+ /* Try auto attach at stat */
+ PCC_DATASET_STAT_ATTACH = 0x08,
+ PCC_DATASET_AUTO_ATTACH = PCC_DATASET_OPEN_ATTACH |
+ PCC_DATASET_IO_ATTACH |
+ PCC_DATASET_STAT_ATTACH,
/* PCC backend is only used for RW-PCC */
- PCC_DATASET_RWPCC = 0x2,
+ PCC_DATASET_RWPCC = 0x10,
/* PCC backend is only used for RO-PCC */
- PCC_DATASET_ROPCC = 0x4,
+ PCC_DATASET_ROPCC = 0x20,
/* PCC backend provides caching services for both RW-PCC and RO-PCC */
PCC_DATASET_PCC_ALL = PCC_DATASET_RWPCC | PCC_DATASET_ROPCC,
};
__u32 pccd_rwid; /* Archive ID */
__u32 pccd_roid; /* Readonly ID */
struct pcc_match_rule pccd_rule; /* Match rule */
- enum pcc_dataset_flags pccd_flags; /* flags of PCC backend */
+ enum pcc_dataset_flags pccd_flags; /* Flags of PCC backend */
char pccd_pathname[PATH_MAX]; /* full path */
struct path pccd_path; /* Root path */
struct list_head pccd_linkage; /* Linked to pccs_datasets */
struct list_head pccs_datasets;
/* creds of process who forced instantiation of super block */
const struct cred *pccs_cred;
+ /*
+ * Gobal PCC Generation: it will be increased once the configuration
+ * for PCC is changed, i.e. add or delete a PCC backend, modify the
+ * parameters for PCC.
+ */
+ __u64 pccs_generation;
};
struct pcc_inode {
enum lu_pcc_type pccf_type;
};
+enum pcc_io_type {
+ /* read system call */
+ PIT_READ = 1,
+ /* write system call */
+ PIT_WRITE,
+ /* truncate, utime system calls */
+ PIT_SETATTR,
+ /* stat system call */
+ PIT_GETATTR,
+ /* mmap write handling */
+ PIT_PAGE_MKWRITE,
+ /* page fault handling */
+ PIT_FAULT,
+ /* fsync system call handling */
+ PIT_FSYNC,
+#ifdef HAVE_DEFAULT_FILE_SPLICE_READ_EXPORT
+ /* splice_read system call */
+ PIT_SPLICE_READ,
+#endif
+ /* open system call */
+ PIT_OPEN
+};
+
enum pcc_cmd_type {
PCC_ADD_DATASET = 0,
PCC_DEL_DATASET,
} u;
};
+struct pcc_create_attach {
+ struct pcc_dataset *pca_dataset;
+ struct dentry *pca_dentry;
+};
+
int pcc_super_init(struct pcc_super *super);
void pcc_super_fini(struct pcc_super *super);
int pcc_cmd_handle(char *buffer, unsigned long count,
bool *cached);
ssize_t pcc_file_write_iter(struct kiocb *iocb, struct iov_iter *iter,
bool *cached);
-int pcc_inode_getattr(struct inode *inode, bool *cached);
+int pcc_inode_getattr(struct inode *inode, u32 request_mask,
+ unsigned int flags, bool *cached);
int pcc_inode_setattr(struct inode *inode, struct iattr *attr, bool *cached);
+#ifdef HAVE_DEFAULT_FILE_SPLICE_READ_EXPORT
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);
+ unsigned int flags);
+#endif
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);
bool *cached);
int pcc_inode_create(struct super_block *sb, 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);
+int pcc_inode_create_fini(struct inode *inode, struct pcc_create_attach *pca);
+void pcc_create_attach_cleanup(struct super_block *sb,
+ struct pcc_create_attach *pca);
struct pcc_dataset *pcc_dataset_match_get(struct pcc_super *super,
struct pcc_matcher *matcher);
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 */