⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wrapfs.h

📁 Solaris操作系统下的过滤驱动程序, C源码程序.
💻 H
字号:
/* * Copyright (c) 1997-2003 Erez Zadok * Copyright (c) 2001-2003 Stony Brook University * Copyright (c) 1997-2000 Columbia University * * For specific licensing information, see the COPYING file distributed with * this package, or get one from ftp://ftp.filesystems.org/pub/fist/COPYING. * * This Copyright notice must be kept intact and distributed with all * fistgen sources INCLUDING sources generated by fistgen. *//* *  $Id: wrapfs.h,v 1.48 2002/12/27 20:19:03 ezk Exp $ */#ifndef __WRAPFS_H_#define __WRAPFS_H_#ifdef __KERNEL__/* * STRUCTURES: *//* Turn this on to include code that counts writes and writes in the middle *//* #undef FIST_COUNT_WRITES */#ifdef FIST_FILTER_SCA#define FIST_FAST_TAILS/* * ON DISK format of index file: * 4 bytes: num_chunks and flags piggybacked * 4 bytes: real_size * Nx4 bytes: num_chunks of 4 bytes for the offsets */struct scafs_header {    unsigned long num_chunks;	/* number of "offset" entries */    off_t real_size;		/* real decoded file size */    off_t **offsets;		/* actual offset entries */    /* the following fields do not get written to disk! */    unsigned long num_alloc;	/* no. of allocated offsets				   0 means hdr is uninitialized/empty */    unsigned long num_pageslots;/* no. of allocated page slots */    unsigned int flags;		/* various flags */};/* flags in memory */#define SCA_FLAG_MODIFIED	0x00000001/* flags on disk */#define SCA_FLAG_FASTTAIL	0x80000000	/* has fast tail */#define SCA_FLAG_HOLES		0x40000000	/* supporting holes *//* we have 12 upper bits to play with */#define SCA_FLAG_MASK		0xfff00000typedef struct encoded_page {    char *data;    struct encoded_page *next;} encoded_pages_t;# define INDEX_EXTENSION	".idx"# define SCA_EXTENSION		".dat"# define INDEX_EXTENSION_LEN	(sizeof(INDEX_EXTENSION))# define SCA_EXTENSION_LEN	(sizeof(SCA_EXTENSION))#endif /* FIST_FILTER_SCA *//* wrapfs inode data in memory */struct wrapfs_inode_info {    inode_t *wii_inode;#ifdef FIST_FILTER_SCA    struct scafs_header hdr;    file_t *idx_file;#endif /* FIST_FILTER_SCA */};/* wrapfs dentry data in memory */struct wrapfs_dentry_info {    dentry_t *wdi_dentry;#ifdef FIST_FILTER_SCA    dentry_t *idx_dentry;#endif /* FIST_FILTER_SCA */};/* wrapfs super-block data in memory */struct wrapfs_sb_info {    super_block_t *wsi_sb;    struct vfsmount *hidden_mnt;#ifdef FIST_FILTER_SCA    unsigned long sca_flags;	/* global SCA flags, see above */#endif /* FIST_FILTER_SCA */    FIST_VFS_FIELDS;};/* * MACROS: */// File TO Hidden File#define ftohf(file) ((file_t *)((file)->private_data))// Inode TO Private Data#define itopd(ino) ((struct wrapfs_inode_info *)(ino)->u.generic_ip)// Inode TO Hidden Inode#define itohi(ino) (itopd(ino)->wii_inode)#define vnode2lower itohi// Superblock TO Private Data#define stopd(super) ((struct wrapfs_sb_info *)(super)->u.generic_sbp)#define vfs2priv stopd// Superblock TO Hidden Superblock#define stohs(super) (stopd(super)->wsi_sb)// Dentry TO Hidden Dentry (and private data --- for the future)#define dtopd(dentry) ((struct wrapfs_dentry_info *)(dentry)->d_fsdata)#define dtohd(dent) (dtopd(dent)->wdi_dentry)#define dir2lower dtohd/* VMArea TO Hidden VMArea */#define vmatohvma(vma) ((vm_area_t *)((vma)->vm_private_data))#define sbt(sb) ((sb)->s_type->name)/* macros to simplify non-SCA code */#ifdef FIST_FILTER_SCA#define FIST_SCA_CHUNKSIZE PAGE_SIZE#define MALLOC_PAGE_POINTERS(hidden_pages, num_hidden_pages) \  hidden_pages = (page_t **)kmalloc(sizeof(page_t *) * num_hidden_pages, GFP_KERNEL)#define MALLOC_PAGEDATA_POINTERS(hidden_pages_data, num_hidden_pages) \  hidden_pages_data = (char **)kmalloc(sizeof(char *) * num_hidden_pages, GFP_KERNEL)#define FREE_PAGE_POINTERS(hidden_pages, num) kfree_s(hidden_pages, sizeof(page_t *) * num)#define FREE_PAGEDATA_POINTERS(hidden_pages_data, num) kfree_s(hidden_pages_data, sizeof(char *) * num)#define FOR_EACH_PAGE \    for (i = 0; i < num_hidden_pages; i++)#define CURRENT_HIDDEN_PAGE hidden_pages[i]#define CURRENT_HIDDEN_PAGEDATA hidden_pages_data[i]#define CURRENT_HIDDEN_PAGEINDEX (hidden_page_index + i)#define IS_FASTTAIL_PAGE(pageno, inode) \  ((pageno == itopd(inode)->hdr.num_chunks - 1) && \   (itopd(inode)->hdr.flags & SCA_FLAG_FASTTAIL))#define CAN_BE_FASTTAIL_PAGE(size, inode) \  ((stopd(inode->i_sb)->sca_flags & SCA_FLAG_FASTTAIL) && \   (size < PAGE_CACHE_SIZE))#define HAS_FASTTAIL_PAGE(inode) \  (itopd(inode)->hdr.flags & SCA_FLAG_FASTTAIL == SCA_FLAG_FASTTAIL)#if (BITS_PER_LONG == 32)# define INDEX_ENTRIES_PER_PAGE	(PAGE_CACHE_SIZE >> 2)# define OFFSET_SHIFT (PAGE_CACHE_SHIFT - 2)#else  /* BITS_PER_LONG == 64 */# define INDEX_ENTRIES_PER_PAGE	(PAGE_CACHE_SIZE >> 3)# define OFFSET_MASK (PAGE_CACHE_SHIFT - 3)#endif /* BITS_PER_LONG == 64 */#define OFFSET_MASK (INDEX_ENTRIES_PER_PAGE - 1)#define SCA_OFFSET(hdr, pageno) \  ((hdr)->offsets[(pageno) >> OFFSET_SHIFT][(pageno) & OFFSET_MASK])/* Current byte offset within a file of a given encoded page */static inline off_tHIDDEN_PAGE_STARTING_OFFSET(unsigned int pageno, inode_t *inode){    struct scafs_header *hdr;    off_t ret;    hdr = &itopd(inode)->hdr;    if (hdr->num_chunks == 0 || pageno == 0)	ret = 0;    else {	if (pageno >= hdr->num_chunks)	    ret = SCA_OFFSET(hdr, hdr->num_chunks - 1);	else	    ret = SCA_OFFSET(hdr, pageno - 1);    }    return ret;}/* Current length of an encoded page */static inline intHIDDEN_PAGE_LENGTH(unsigned int pageno, inode_t *inode){    struct scafs_header *hdr;    off_t ret;    hdr = &itopd(inode)->hdr;    if (pageno >= hdr->num_chunks)	ret = 0;    else {	if (pageno == 0)	    ret = SCA_OFFSET(hdr, 0);	else	    ret = SCA_OFFSET(hdr, pageno) - SCA_OFFSET(hdr, pageno - 1);    }    return ret;}static inline intIS_HOLE(unsigned int pageno, inode_t *inode){    struct scafs_header *hdr;    int ret;    hdr = &itopd(inode)->hdr;    if (pageno == 0)	ret = (hdr->num_chunks == 0 || hdr->offsets[0] == 0);    else	ret = (hdr->offsets[pageno] == hdr->offsets[pageno - 1]);    return ret;}#else  /* not FIST_FILTER_SCA */#define MALLOC_PAGE_POINTERS(hidden_pages, num_hidden_pages)#define MALLOC_PAGEDATA_POINTERS(hidden_pages_data, num_hidden_pages)#define FREE_PAGE_POINTERS(hidden_pages, num)#define FREE_PAGEDATA_POINTERS(hidden_pages_data, num)#define FOR_EACH_PAGE#define CURRENT_HIDDEN_PAGE hidden_page#define CURRENT_HIDDEN_PAGEDATA hidden_page_data#define CURRENT_HIDDEN_PAGEINDEX page->index#endif /* not FIST_FILTER_SCA */#ifdef FIST_FILTER_NAME/* * Flags for wrapfs_{en,de}code_filename * DO_DOTS means the special entries . and .. should be encoded (for symlink) * SKIP_DOTS means they should be preserved intact */#define DO_DOTS   0#define SKIP_DOTS 1#endif /* FIST_FILTER_NAME *//* * EXTERNALS: */extern struct file_operations wrapfs_fops;extern struct inode_operations wrapfs_iops;extern struct inode_operations wrapfs_iops_symlink;extern struct super_operations wrapfs_sops;extern struct dentry_operations wrapfs_dops;extern struct vm_operations_struct wrapfs_shared_vmops;extern struct vm_operations_struct wrapfs_private_vmops;extern struct address_space_operations wrapfs_aops;extern int wrapfs_interpose(dentry_t *hidden_dentry, dentry_t *this_dentry, super_block_t *sb, int flag);#ifdef FIST_FILTER_DATAextern int wrapfs_decode_block(const char *from, char *to, int len, const vnode_t *vp, const vfs_t *vfsp);extern int wrapfs_encode_block(const char *from, char *to, int len, const vnode_t *vp, const vfs_t *vfsp);#endif /* FIST_FILTER_DATA */#ifdef FIST_FILTER_NAMEextern int wrapfs_decode_filename(const char *name, int length, char **decoded_name, int skip_dots, const vnode_t *vp, const vfs_t *vfsp);extern int wrapfs_encode_filename(const char *name, int length, char **encoded_name, int skip_dots, const vnode_t *vp, const vfs_t *vfsp);#endif /* FIST_FILTER_NAME */#ifdef FIST_DEBUG# define wrapfs_hidden_dentry(d) __wrapfs_hidden_dentry(__FILE__,__FUNCTION__,__LINE__,(d))extern dentry_t *__wrapfs_hidden_dentry(char *file, char *func, int line, dentry_t *this_dentry);#else /* not FIST_DEBUG */# define wrapfs_hidden_dentry(dentry) dtohd(dentry)#endif /* not FIST_DEBUG */#ifdef FIST_USE_AUX_SRCextern int wrapfs_read_file(const char *filename, void *buf, int len);extern int wrapfs_write_file(const char *filename, void *buf, int len);extern dentry_t *fist_lookup(dentry_t *dir, const char *name, vnode_t **out, uid_t uid, gid_t gid);#endif /* FIST_USE_AUX_SRC */#ifdef FIST_FILTER_SCAextern dentry_t *wrapfs_idx_lookup(dentry_t *hidden_dentry);extern int wrapfs_idx_create(inode_t *hidden_dir, dentry_t *dentry, int mode);extern int wrapfs_idx_open(dentry_t *dentry, mode_t mode, unsigned int flags);extern int wrapfs_idx_read(inode_t *inode);extern int wrapfs_idx_write(inode_t *inode);extern void wrapfs_idx_update(struct scafs_header *hdr, unsigned long entry, int delta);#define wrapfs_idx_release(inode) \do { \    fput(itopd(inode)->idx_file); \    itopd(inode)->idx_file = NULL; \} while (0)extern int wrapfs_idx_set_entry(struct scafs_header *hdr, int chunk_idx, off_t encoded_chunk_size);extern int wrapfs_count_hidden_pages(unsigned long page_index, inode_t *inode,				     int *hidden_page_index, void **opaque);extern int wrapfs_decode_buffers(int num_hidden_pages, char **hidden_pages_data, char *page_data, inode_t *inode, vfs_t *vfs, void *opaque);extern int wrapfs_encode_buffers(char *hidden_pages_data, char *page_data, int *need_to_call, unsigned to, inode_t *inode, vfs_t *vfs, void **opaque);extern void * wrapfs_krealloc(void *oldptr, size_t oldsize, size_t newsize);extern page_t * wrapfs_get1page(file_t *file, int index);extern int wrapfs_copy_encoded_data(file_t *file, off_t dst_offset, encoded_pages_t *encoded_pages, off_t total_bytes_to_shift);# ifdef FIST_DEBUGextern void fist_print_scafs_header(const char *str, const struct scafs_header *hdr);# else /* not FIST_DEBUG */#  define fist_print_scafs_header(a, b)# endif /* not FIST_DEBUG */#endif /* FIST_FILTER_SCA */#ifdef FIST_FILTER_SCA        /* XXX must be updated for fast tails when we do writing */#define copy_inode_size(dst, src) \    if (itopd(dst)->hdr.num_alloc > 0) { \        dst->i_size = itopd(dst)->hdr.real_size; \	/* XXX by casting to unsigned we screw up LARGEFILE support */ \	fist_dprint(8, "file size is %d\n", dst->i_size); \        dst->i_blocks = ((unsigned)(dst->i_size) + 1023) / 512; \    } else { \        dst->i_size = src->i_size; \        dst->i_blocks = src->i_blocks; \    }#else  /* not FIST_FILTER_SCA */#define copy_inode_size(dst, src) \    dst->i_size = src->i_size; \    dst->i_blocks = src->i_blocks;#endif /* not FIST_FILTER_SCA */static inline voidfist_copy_attr_atime(inode_t *dest, const inode_t *src){    ASSERT(dest != NULL);    ASSERT(src != NULL);    dest->i_atime = src->i_atime;}static inline voidfist_copy_attr_times(inode_t *dest, const inode_t *src){    ASSERT(dest != NULL);    ASSERT(src != NULL);    dest->i_atime = src->i_atime;    dest->i_mtime = src->i_mtime;    dest->i_ctime = src->i_ctime;}static inline voidfist_copy_attr_timesizes(inode_t *dest, const inode_t *src){    ASSERT(dest != NULL);    ASSERT(src != NULL);    dest->i_atime = src->i_atime;    dest->i_mtime = src->i_mtime;    dest->i_ctime = src->i_ctime;    copy_inode_size(dest, src);}static inline voidfist_copy_attr_all(inode_t *dest, const inode_t *src){    print_entry_location();    ASSERT(dest != NULL);    ASSERT(src != NULL);    dest->i_mode = src->i_mode;    dest->i_nlink = src->i_nlink;    dest->i_uid = src->i_uid;    dest->i_gid = src->i_gid;    // NO WAY   dest->i_rdev = src->i_rdev;    dest->i_atime = src->i_atime;    dest->i_mtime = src->i_mtime;    dest->i_ctime = src->i_ctime;    dest->i_blksize = src->i_blksize;    copy_inode_size(dest, src);    dest->i_attr_flags = src->i_attr_flags;    print_exit_location();}/* auto-generated extern definitions */FIST_AUTO_GENERATED_EXTERNS#endif /* __KERNEL__ *//* * Definitions for user and kernel code *//* ioctls */FIST_IOCTL_DEFS#endif	/* not __WRAPFS_H_ *//* * Local variables: * c-basic-offset: 4 * End: */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -