struct qstr *pm_name;
};
+enum pcc_dataset_flags {
+ 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 = 0x10,
+ /* PCC backend is only used for RO-PCC */
+ 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,
+};
+
struct pcc_dataset {
__u32 pccd_rwid; /* Archive ID */
__u32 pccd_roid; /* Readonly ID */
struct pcc_match_rule pccd_rule; /* Match rule */
- __u32 pccd_rwonly:1, /* Only use as RW-PCC */
- pccd_roonly:1; /* Only use as RO-PCC */
+ 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 pcc_super {
/* Protect pccs_datasets */
- spinlock_t pccs_lock;
+ struct rw_semaphore pccs_rw_sem;
/* List of 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,
+ /* splice_read system call */
+ PIT_SPLICE_READ,
+ /* open system call */
+ PIT_OPEN
+};
+
enum pcc_cmd_type {
PCC_ADD_DATASET = 0,
PCC_DEL_DATASET,
__u32 pccc_roid;
struct list_head pccc_conds;
char *pccc_conds_str;
+ enum pcc_dataset_flags pccc_flags;
} pccc_add;
struct pcc_cmd_del {
__u32 pccc_pad;
} 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,
int pcc_readwrite_attach_fini(struct file *file, struct inode *inode,
__u32 gen, bool lease_broken, int rc,
bool attached);
-int pcc_ioctl_detach(struct inode *inode);
+int pcc_ioctl_detach(struct inode *inode, __u32 opt);
int pcc_ioctl_state(struct file *file, struct inode *inode,
struct lu_pcc_state *state);
void pcc_file_init(struct pcc_file *pccf);
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);
ssize_t pcc_file_splice_read(struct file *in_file, loff_t *ppos,
struct pipe_inode_info *pipe, size_t count,
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 */