#ifndef __FILTER_H_ #define __FILTER_H_ 1 #ifdef __KERNEL__ /* cachetype.c */ /* * it is important that things like inode, super and file operations * for intermezzo are not defined statically. If methods are NULL * the VFS takes special action based on that. Given that different * cache types have NULL ops at different slots, we must install opeation * talbes for InterMezzo with NULL's in the same spot */ struct filter_ops { struct super_operations filter_sops; struct inode_operations filter_dir_iops; struct inode_operations filter_file_iops; struct inode_operations filter_sym_iops; struct file_operations filter_dir_fops; struct file_operations filter_file_fops; struct file_operations filter_sym_fops; struct dentry_operations filter_dentry_ops; }; struct cache_ops { /* operations on the file store */ struct super_operations *cache_sops; struct inode_operations *cache_dir_iops; struct inode_operations *cache_file_iops; struct inode_operations *cache_sym_iops; struct file_operations *cache_dir_fops; struct file_operations *cache_file_fops; struct file_operations *cache_sym_fops; struct dentry_operations *cache_dentry_ops; }; #define FILTER_DID_SUPER_OPS 0x1 #define FILTER_DID_INODE_OPS 0x2 #define FILTER_DID_FILE_OPS 0x4 #define FILTER_DID_DENTRY_OPS 0x8 #define FILTER_DID_DEV_OPS 0x10 #define FILTER_DID_SYMLINK_OPS 0x20 #define FILTER_DID_DIR_OPS 0x40 struct filter_fs { int o_flags; struct filter_ops o_fops; struct cache_ops o_caops; struct journal_ops *o_trops; struct snapshot_ops *o_snops; }; #define FILTER_FS_TYPES 5 #define FILTER_FS_EXT2 0 #define FILTER_FS_EXT3 1 #define FILTER_FS_REISERFS 2 #define FILTER_FS_XFS 3 #define FILTER_FS_OBDFS 4 extern struct filter_fs filter_oppar[FILTER_FS_TYPES]; struct filter_fs *filter_get_filter_fs(const char *cache_type); void filter_setup_journal_ops(struct filter_fs *ops, char *cache_type); inline struct super_operations *filter_c2usops(struct filter_fs *cache); inline struct inode_operations *filter_c2ufiops(struct filter_fs *cache); inline struct inode_operations *filter_c2udiops(struct filter_fs *cache); inline struct inode_operations *filter_c2usiops(struct filter_fs *cache); inline struct file_operations *filter_c2uffops(struct filter_fs *cache); inline struct file_operations *filter_c2udfops(struct filter_fs *cache); inline struct file_operations *filter_c2usfops(struct filter_fs *cache); inline struct super_operations *filter_c2csops(struct filter_fs *cache); inline struct inode_operations *filter_c2cfiops(struct filter_fs *cache); inline struct inode_operations *filter_c2cdiops(struct filter_fs *cache); inline struct inode_operations *filter_c2csiops(struct filter_fs *cache); inline struct file_operations *filter_c2cffops(struct filter_fs *cache); inline struct file_operations *filter_c2cdfops(struct filter_fs *cache); inline struct file_operations *filter_c2csfops(struct filter_fs *cache); inline struct dentry_operations *filter_c2cdops(struct filter_fs *cache); inline struct dentry_operations *filter_c2udops(struct filter_fs *cache); void filter_setup_super_ops(struct filter_fs *cache, struct super_operations *cache_ops, struct super_operations *filter_sops); void filter_setup_dir_ops(struct filter_fs *cache, struct inode *cache_inode, struct inode_operations *filter_iops, struct file_operations *ffops); void filter_setup_file_ops(struct filter_fs *cache, struct inode *cache_inode, struct inode_operations *filter_iops, struct file_operations *filter_op); void filter_setup_symlink_ops(struct filter_fs *cache, struct inode *cache_inode, struct inode_operations *filter_iops, struct file_operations *filter_op); void filter_setup_dentry_ops(struct filter_fs *cache, struct dentry_operations *cache_dop, struct dentry_operations *filter_dop); #define PRESTO_DEBUG #ifdef PRESTO_DEBUG /* debugging masks */ #define D_SUPER 1 /* print results returned by Venus */ #define D_INODE 2 /* print entry and exit into procedure */ #define D_FILE 4 #define D_CACHE 8 /* cache debugging */ #define D_MALLOC 16 /* print malloc, de-alloc information */ #define D_JOURNAL 32 #define D_UPCALL 64 /* up and downcall debugging */ #define D_PSDEV 128 #define D_PIOCTL 256 #define D_SPECIAL 512 #define D_TIMING 1024 #define D_DOWNCALL 2048 #define FDEBUG(mask, format, a...) \ do { \ if (filter_debug & mask) { \ printk("(%s,l. %d): ", __FUNCTION__, __LINE__); \ printk(format, ##a); } \ } while (0) #define FENTRY \ if(filter_print_entry) \ printk("Process %d entered %s\n", current->pid, __FUNCTION__) #define FEXIT \ if(filter_print_entry) \ printk("Process %d leaving %s at %d\n", current->pid, \ __FUNCTION__,__LINE__) #endif #endif #endif