#define LPROCFS_WR_PCC_MAX_CMD 4096
+/* User/Group/Project ID */
+struct pcc_match_id {
+ __u32 pmi_id;
+ struct list_head pmi_linkage;
+};
+
+/* wildcard file name */
+struct pcc_match_fname {
+ char *pmf_name;
+ struct list_head pmf_linkage;
+};
+
+enum pcc_field {
+ PCC_FIELD_UID,
+ PCC_FIELD_GID,
+ PCC_FIELD_PROJID,
+ PCC_FIELD_FNAME,
+ PCC_FIELD_MAX
+};
+
+struct pcc_expression {
+ enum pcc_field pe_field;
+ struct list_head pe_cond;
+ struct list_head pe_linkage;
+};
+
+struct pcc_conjunction {
+ /* link to disjunction */
+ struct list_head pc_linkage;
+ /* list of logical conjunction */
+ struct list_head pc_expressions;
+};
+
+/**
+ * Match rule for auto PCC-cached files.
+ */
+struct pcc_match_rule {
+ char *pmr_conds_str;
+ struct list_head pmr_conds;
+};
+
+struct pcc_matcher {
+ __u32 pm_uid;
+ __u32 pm_gid;
+ __u32 pm_projid;
+ struct qstr *pm_name;
+};
+
+enum pcc_dataset_flags {
+ PCC_DATASET_NONE = 0x0,
+ /* Try auto attach at open, disabled by default */
+ PCC_DATASET_OPEN_ATTACH = 0x1,
+ /* PCC backend is only used for RW-PCC */
+ PCC_DATASET_RWPCC = 0x2,
+ /* PCC backend is only used for RO-PCC */
+ PCC_DATASET_ROPCC = 0x4,
+ /* 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_id; /* Archive ID */
- __u32 pccd_projid; /* Project ID */
+ __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 */
char pccd_pathname[PATH_MAX]; /* full path */
struct path pccd_path; /* Root path */
struct list_head pccd_linkage; /* Linked to pccs_datasets */
- atomic_t pccd_refcount; /* reference count */
+ atomic_t pccd_refcount; /* Reference count */
};
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 */
char *pccc_pathname;
union {
struct pcc_cmd_add {
- __u32 pccc_id;
- __u32 pccc_projid;
+ __u32 pccc_rwid;
+ __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;
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);
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_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);