/* * Copyright (C) 2005-2016 Junjiro R. Okajima */ /* * directory operations */ #ifndef __AUFS_DIR_H__ #define __AUFS_DIR_H__ #ifdef __KERNEL__ #include /* ---------------------------------------------------------------------- */ /* need to be faster and smaller */ struct au_nhash { unsigned int nh_num; struct hlist_head *nh_head; }; struct au_vdir_destr { unsigned char len; unsigned char name[0]; } __packed; struct au_vdir_dehstr { struct hlist_node hash; struct au_vdir_destr *str; } ____cacheline_aligned_in_smp; struct au_vdir_de { ino_t de_ino; unsigned char de_type; /* caution: packed */ struct au_vdir_destr de_str; } __packed; struct au_vdir_wh { struct hlist_node wh_hash; #ifdef CONFIG_AUFS_SHWH ino_t wh_ino; aufs_bindex_t wh_bindex; unsigned char wh_type; #else aufs_bindex_t wh_bindex; #endif /* caution: packed */ struct au_vdir_destr wh_str; } __packed; union au_vdir_deblk_p { unsigned char *deblk; struct au_vdir_de *de; }; struct au_vdir { unsigned char **vd_deblk; unsigned long vd_nblk; struct { unsigned long ul; union au_vdir_deblk_p p; } vd_last; unsigned long vd_version; unsigned int vd_deblk_sz; unsigned long vd_jiffy; } ____cacheline_aligned_in_smp; /* ---------------------------------------------------------------------- */ /* dir.c */ extern const struct file_operations aufs_dir_fop; void au_add_nlink(struct inode *dir, struct inode *h_dir); void au_sub_nlink(struct inode *dir, struct inode *h_dir); loff_t au_dir_size(struct file *file, struct dentry *dentry); void au_dir_ts(struct inode *dir, aufs_bindex_t bsrc); int au_test_empty_lower(struct dentry *dentry); int au_test_empty(struct dentry *dentry, struct au_nhash *whlist); /* vdir.c */ unsigned int au_rdhash_est(loff_t sz); int au_nhash_alloc(struct au_nhash *nhash, unsigned int num_hash, gfp_t gfp); void au_nhash_wh_free(struct au_nhash *whlist); int au_nhash_test_longer_wh(struct au_nhash *whlist, aufs_bindex_t btgt, int limit); int au_nhash_test_known_wh(struct au_nhash *whlist, char *name, int nlen); int au_nhash_append_wh(struct au_nhash *whlist, char *name, int nlen, ino_t ino, unsigned int d_type, aufs_bindex_t bindex, unsigned char shwh); void au_vdir_free(struct au_vdir *vdir); int au_vdir_init(struct file *file); int au_vdir_fill_de(struct file *file, struct dir_context *ctx); /* ioctl.c */ long aufs_ioctl_dir(struct file *file, unsigned int cmd, unsigned long arg); #ifdef CONFIG_AUFS_RDU /* rdu.c */ long au_rdu_ioctl(struct file *file, unsigned int cmd, unsigned long arg); #ifdef CONFIG_COMPAT long au_rdu_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg); #endif #else AuStub(long, au_rdu_ioctl, return -EINVAL, struct file *file, unsigned int cmd, unsigned long arg) #ifdef CONFIG_COMPAT AuStub(long, au_rdu_compat_ioctl, return -EINVAL, struct file *file, unsigned int cmd, unsigned long arg) #endif #endif #endif /* __KERNEL__ */ #endif /* __AUFS_DIR_H__ */