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

📄 affs.h

📁 linux 内核源代码
💻 H
字号:
#include <linux/types.h>#include <linux/fs.h>#include <linux/buffer_head.h>#include <linux/amigaffs.h>/* AmigaOS allows file names with up to 30 characters length. * Names longer than that will be silently truncated. If you * want to disallow this, comment out the following #define. * Creating filesystem objects with longer names will then * result in an error (ENAMETOOLONG). *//*#define AFFS_NO_TRUNCATE *//* Ugly macros make the code more pretty. */#define GET_END_PTR(st,p,sz)		 ((st *)((char *)(p)+((sz)-sizeof(st))))#define AFFS_GET_HASHENTRY(data,hashkey) be32_to_cpu(((struct dir_front *)data)->hashtable[hashkey])#define AFFS_BLOCK(sb, bh, blk)		(AFFS_HEAD(bh)->table[AFFS_SB(sb)->s_hashsize-1-(blk)])#ifdef __LITTLE_ENDIAN#define BO_EXBITS	0x18UL#elif defined(__BIG_ENDIAN)#define BO_EXBITS	0x00UL#else#error Endianness must be known for affs to work.#endif#define AFFS_HEAD(bh)		((struct affs_head *)(bh)->b_data)#define AFFS_TAIL(sb, bh)	((struct affs_tail *)((bh)->b_data+(sb)->s_blocksize-sizeof(struct affs_tail)))#define AFFS_ROOT_HEAD(bh)	((struct affs_root_head *)(bh)->b_data)#define AFFS_ROOT_TAIL(sb, bh)	((struct affs_root_tail *)((bh)->b_data+(sb)->s_blocksize-sizeof(struct affs_root_tail)))#define AFFS_DATA_HEAD(bh)	((struct affs_data_head *)(bh)->b_data)#define AFFS_DATA(bh)		(((struct affs_data_head *)(bh)->b_data)->data)#define AFFS_CACHE_SIZE		PAGE_SIZE#define AFFS_MAX_PREALLOC	32#define AFFS_LC_SIZE		(AFFS_CACHE_SIZE/sizeof(u32)/2)#define AFFS_AC_SIZE		(AFFS_CACHE_SIZE/sizeof(struct affs_ext_key)/2)#define AFFS_AC_MASK		(AFFS_AC_SIZE-1)struct affs_ext_key {	u32	ext;				/* idx of the extended block */	u32	key;				/* block number */};/* * affs fs inode data in memory */struct affs_inode_info {	u32	 i_opencnt;	struct semaphore i_link_lock;		/* Protects internal inode access. */	struct semaphore i_ext_lock;		/* Protects internal inode access. */#define i_hash_lock i_ext_lock	u32	 i_blkcnt;			/* block count */	u32	 i_extcnt;			/* extended block count */	u32	*i_lc;				/* linear cache of extended blocks */	u32	 i_lc_size;	u32	 i_lc_shift;	u32	 i_lc_mask;	struct affs_ext_key *i_ac;		/* associative cache of extended blocks */	u32	 i_ext_last;			/* last accessed extended block */	struct buffer_head *i_ext_bh;		/* bh of last extended block */	loff_t	 mmu_private;	u32	 i_protect;			/* unused attribute bits */	u32	 i_lastalloc;			/* last allocated block */	int	 i_pa_cnt;			/* number of preallocated blocks */	struct inode vfs_inode;};/* short cut to get to the affs specific inode data */static inline struct affs_inode_info *AFFS_I(struct inode *inode){	return list_entry(inode, struct affs_inode_info, vfs_inode);}/* * super-block data in memory * * Block numbers are adjusted for their actual size * */struct affs_bm_info {	u32 bm_key;			/* Disk block number */	u32 bm_free;			/* Free blocks in here */};struct affs_sb_info {	int s_partition_size;		/* Partition size in blocks. */	int s_reserved;			/* Number of reserved blocks. */	//u32 s_blksize;			/* Initial device blksize */	u32 s_data_blksize;		/* size of the data block w/o header */	u32 s_root_block;		/* FFS root block number. */	int s_hashsize;			/* Size of hash table. */	unsigned long s_flags;		/* See below. */	uid_t s_uid;			/* uid to override */	gid_t s_gid;			/* gid to override */	umode_t s_mode;			/* mode to override */	struct buffer_head *s_root_bh;	/* Cached root block. */	struct semaphore s_bmlock;	/* Protects bitmap access. */	struct affs_bm_info *s_bitmap;	/* Bitmap infos. */	u32 s_bmap_count;		/* # of bitmap blocks. */	u32 s_bmap_bits;		/* # of bits in one bitmap blocks */	u32 s_last_bmap;	struct buffer_head *s_bmap_bh;	char *s_prefix;			/* Prefix for volumes and assigns. */	int s_prefix_len;		/* Length of prefix. */	char s_volume[32];		/* Volume prefix for absolute symlinks. */};#define SF_INTL		0x0001		/* International filesystem. */#define SF_BM_VALID	0x0002		/* Bitmap is valid. */#define SF_IMMUTABLE	0x0004		/* Protection bits cannot be changed */#define SF_QUIET	0x0008		/* chmod errors will be not reported */#define SF_SETUID	0x0010		/* Ignore Amiga uid */#define SF_SETGID	0x0020		/* Ignore Amiga gid */#define SF_SETMODE	0x0040		/* Ignore Amiga protection bits */#define SF_MUFS		0x0100		/* Use MUFS uid/gid mapping */#define SF_OFS		0x0200		/* Old filesystem */#define SF_PREFIX	0x0400		/* Buffer for prefix is allocated */#define SF_VERBOSE	0x0800		/* Talk about fs when mounting *//* short cut to get to the affs specific sb data */static inline struct affs_sb_info *AFFS_SB(struct super_block *sb){	return sb->s_fs_info;}/* amigaffs.c */extern int	affs_insert_hash(struct inode *inode, struct buffer_head *bh);extern int	affs_remove_hash(struct inode *dir, struct buffer_head *rem_bh);extern int	affs_remove_header(struct dentry *dentry);extern u32	affs_checksum_block(struct super_block *sb, struct buffer_head *bh);extern void	affs_fix_checksum(struct super_block *sb, struct buffer_head *bh);extern void	secs_to_datestamp(time_t secs, struct affs_date *ds);extern mode_t	prot_to_mode(u32 prot);extern void	mode_to_prot(struct inode *inode);extern void	affs_error(struct super_block *sb, const char *function, const char *fmt, ...);extern void	affs_warning(struct super_block *sb, const char *function, const char *fmt, ...);extern int	affs_check_name(const unsigned char *name, int len);extern int	affs_copy_name(unsigned char *bstr, struct dentry *dentry);/* bitmap. c */extern u32	affs_count_free_blocks(struct super_block *s);extern void	affs_free_block(struct super_block *sb, u32 block);extern u32	affs_alloc_block(struct inode *inode, u32 goal);extern int	affs_init_bitmap(struct super_block *sb, int *flags);extern void	affs_free_bitmap(struct super_block *sb);/* namei.c */extern int	affs_hash_name(struct super_block *sb, const u8 *name, unsigned int len);extern struct dentry *affs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *);extern int	affs_unlink(struct inode *dir, struct dentry *dentry);extern int	affs_create(struct inode *dir, struct dentry *dentry, int mode, struct nameidata *);extern int	affs_mkdir(struct inode *dir, struct dentry *dentry, int mode);extern int	affs_rmdir(struct inode *dir, struct dentry *dentry);extern int	affs_link(struct dentry *olddentry, struct inode *dir,			  struct dentry *dentry);extern int	affs_symlink(struct inode *dir, struct dentry *dentry,			     const char *symname);extern int	affs_rename(struct inode *old_dir, struct dentry *old_dentry,			    struct inode *new_dir, struct dentry *new_dentry);/* inode.c */extern unsigned long		 affs_parent_ino(struct inode *dir);extern struct inode		*affs_new_inode(struct inode *dir);extern int			 affs_notify_change(struct dentry *dentry, struct iattr *attr);extern void			 affs_put_inode(struct inode *inode);extern void			 affs_drop_inode(struct inode *inode);extern void			 affs_delete_inode(struct inode *inode);extern void			 affs_clear_inode(struct inode *inode);extern void			 affs_read_inode(struct inode *inode);extern int			 affs_write_inode(struct inode *inode, int);extern int			 affs_add_entry(struct inode *dir, struct inode *inode, struct dentry *dentry, s32 type);/* file.c */void		affs_free_prealloc(struct inode *inode);extern void	affs_truncate(struct inode *);/* dir.c */extern void   affs_dir_truncate(struct inode *);/* jump tables */extern const struct inode_operations	 affs_file_inode_operations;extern const struct inode_operations	 affs_dir_inode_operations;extern const struct inode_operations   affs_symlink_inode_operations;extern const struct file_operations	 affs_file_operations;extern const struct file_operations	 affs_file_operations_ofs;extern const struct file_operations	 affs_dir_operations;extern const struct address_space_operations	 affs_symlink_aops;extern const struct address_space_operations	 affs_aops;extern const struct address_space_operations	 affs_aops_ofs;extern struct dentry_operations	 affs_dentry_operations;extern struct dentry_operations	 affs_dentry_operations_intl;static inline voidaffs_set_blocksize(struct super_block *sb, int size){	sb_set_blocksize(sb, size);}static inline struct buffer_head *affs_bread(struct super_block *sb, int block){	pr_debug("affs_bread: %d\n", block);	if (block >= AFFS_SB(sb)->s_reserved && block < AFFS_SB(sb)->s_partition_size)		return sb_bread(sb, block);	return NULL;}static inline struct buffer_head *affs_getblk(struct super_block *sb, int block){	pr_debug("affs_getblk: %d\n", block);	if (block >= AFFS_SB(sb)->s_reserved && block < AFFS_SB(sb)->s_partition_size)		return sb_getblk(sb, block);	return NULL;}static inline struct buffer_head *affs_getzeroblk(struct super_block *sb, int block){	struct buffer_head *bh;	pr_debug("affs_getzeroblk: %d\n", block);	if (block >= AFFS_SB(sb)->s_reserved && block < AFFS_SB(sb)->s_partition_size) {		bh = sb_getblk(sb, block);		lock_buffer(bh);		memset(bh->b_data, 0 , sb->s_blocksize);		set_buffer_uptodate(bh);		unlock_buffer(bh);		return bh;	}	return NULL;}static inline struct buffer_head *affs_getemptyblk(struct super_block *sb, int block){	struct buffer_head *bh;	pr_debug("affs_getemptyblk: %d\n", block);	if (block >= AFFS_SB(sb)->s_reserved && block < AFFS_SB(sb)->s_partition_size) {		bh = sb_getblk(sb, block);		wait_on_buffer(bh);		set_buffer_uptodate(bh);		return bh;	}	return NULL;}static inline voidaffs_brelse(struct buffer_head *bh){	if (bh)		pr_debug("affs_brelse: %lld\n", (long long) bh->b_blocknr);	brelse(bh);}static inline voidaffs_adjust_checksum(struct buffer_head *bh, u32 val){	u32 tmp = be32_to_cpu(((__be32 *)bh->b_data)[5]);	((__be32 *)bh->b_data)[5] = cpu_to_be32(tmp - val);}static inline voidaffs_adjust_bitmapchecksum(struct buffer_head *bh, u32 val){	u32 tmp = be32_to_cpu(((__be32 *)bh->b_data)[0]);	((__be32 *)bh->b_data)[0] = cpu_to_be32(tmp - val);}static inline voidaffs_lock_link(struct inode *inode){	down(&AFFS_I(inode)->i_link_lock);}static inline voidaffs_unlock_link(struct inode *inode){	up(&AFFS_I(inode)->i_link_lock);}static inline voidaffs_lock_dir(struct inode *inode){	down(&AFFS_I(inode)->i_hash_lock);}static inline voidaffs_unlock_dir(struct inode *inode){	up(&AFFS_I(inode)->i_hash_lock);}static inline voidaffs_lock_ext(struct inode *inode){	down(&AFFS_I(inode)->i_ext_lock);}static inline voidaffs_unlock_ext(struct inode *inode){	up(&AFFS_I(inode)->i_ext_lock);}

⌨️ 快捷键说明

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