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

📄 sysv_fs.h

📁 LINUX1.0内核源代码,学习LINUX编程的一定要看。
💻 H
📖 第 1 页 / 共 2 页
字号:
struct sysv_inode {	unsigned short i_mode;	unsigned short i_nlink;	unsigned short i_uid;	unsigned short i_gid;	unsigned long  i_size;	union { /* directories, regular files, ... */		char i_addb[3*(10+1+1+1)+1]; /* zone numbers: max. 10 data blocks,					      * then 1 indirection block,					      * then 1 double indirection block,					      * then 1 triple indirection block.					      * Then maybe a "file generation number" ??					      */		/* devices */		dev_t i_rdev;		/* named pipes on Coherent */		struct {			char p_addp[30];			short p_pnc;			short p_prx;			short p_pwx;		} i_p;	} i_a;	unsigned long i_atime;	/* time of last access */	unsigned long i_mtime;	/* time of last modification */	unsigned long i_ctime;	/* time of creation */};/* The admissible values for i_mode are listed in <linux/stat.h> : * #define S_IFMT  00170000  mask for type * #define S_IFREG  0100000  type = regular file * #define S_IFBLK  0060000  type = block device * #define S_IFDIR  0040000  type = directory * #define S_IFCHR  0020000  type = character device * #define S_IFIFO  0010000  type = named pipe * #define S_ISUID  0004000  set user id * #define S_ISGID  0002000  set group id * #define S_ISVTX  0001000  save swapped text even after use * Additionally for SystemV: * #define S_IFLNK  0120000  type = symbolic link * #define S_IFNAM  0050000  type = XENIX special named file ?? * Additionally for Coherent: * #define S_IFMPB  0070000  type = multiplexed block device ?? * #define S_IFMPC  0030000  type = multiplexed character device ?? * * Since Coherent doesn't know about symbolic links, we use a kludgey * implementation of symbolic links: i_mode = COH_KLUDGE_SYMLINK_MODE * denotes a symbolic link. When a regular file should get this mode by * accident, it is automatically converted to COH_KLUDGE_NOT_SYMLINK. * We use S_IFREG because only regular files (and Coherent pipes...) can have * data blocks with arbitrary contents associated with them, and S_ISVTX * ("save swapped text after use") because it is unused on both Linux and * Coherent: Linux does much more intelligent paging, and Coherent hasn't * virtual memory at all. * Same trick for Xenix. */#define COH_KLUDGE_SYMLINK_MODE	(S_IFREG | S_ISVTX)#define COH_KLUDGE_NOT_SYMLINK	(S_IFREG | S_ISVTX | S_IRUSR) /* force read access */extern inline mode_t from_coh_imode(unsigned short mode){	if (mode == COH_KLUDGE_SYMLINK_MODE)		return (S_IFLNK | 0777);	else		return mode;}extern inline unsigned short to_coh_imode(mode_t mode){	if (S_ISLNK(mode))		return COH_KLUDGE_SYMLINK_MODE;	else if (mode == COH_KLUDGE_SYMLINK_MODE)		return COH_KLUDGE_NOT_SYMLINK;	else		return mode;}/* Admissible values for i_nlink: 0.._LINK_MAX */#define XENIX_LINK_MAX	126	/* ?? */#define SYSV_LINK_MAX	126	/* 127? 251? */#define COH_LINK_MAX	10000	/* max number of hard links to an inode *//* The number of inodes per block is   sb->sv_inodes_per_block = block_size / sizeof(struct sysv_inode) *//* The number of indirect pointers per block is   sb->sv_ind_per_block = block_size / sizeof(unsigned long) *//* SystemV/Coherent directory entry on disk */#define SYSV_NAMELEN	14	/* max size of name in struct sysv_dir_entry */struct sysv_dir_entry {	sysv_ino_t inode;	char name[SYSV_NAMELEN]; /* up to 14 characters, the rest are zeroes */};#define SYSV_DIRSIZE	sizeof(struct sysv_dir_entry)	/* size of every directory entry *//* Operations *//* ========== *//* identify the FS in memory */#define FSTYPE_XENIX	1#define FSTYPE_SYSV4	2#define FSTYPE_SYSV2	3#define FSTYPE_COH	4#define SYSV_MAGIC_BASE		0x012FF7B3#define XENIX_SUPER_MAGIC	(SYSV_MAGIC_BASE+FSTYPE_XENIX)#define SYSV4_SUPER_MAGIC	(SYSV_MAGIC_BASE+FSTYPE_SYSV4)#define SYSV2_SUPER_MAGIC	(SYSV_MAGIC_BASE+FSTYPE_SYSV2)#define COH_SUPER_MAGIC		(SYSV_MAGIC_BASE+FSTYPE_COH)/* Because the block size may be smaller than 1024 (which is the unit used by   the disk drivers and the buffer code), many functions must return a pointer   to the buffer data additionally to the buffer head pointer.*/#if 0struct bh_data {	struct buffer_head * bh;	char * bh_data;};#endif/* sysv_bread(sb,dev,block,...) would be equivalent to   bread(dev,block,BLOCK_SIZE)   if the block size were always 1024, which is the only one bread() supports.*/static inline struct buffer_head *sysv_bread (struct super_block *sb, int dev, unsigned int block, char* * data){	struct buffer_head *bh;	if (!(bh = bread (dev, (block >> sb->sv_block_size_ratio_bits) + sb->sv_block_base, BLOCK_SIZE)))		return NULL;	*data = bh->b_data + ((block & sb->sv_block_size_ratio_1) << sb->sv_block_size_bits);	return bh;}/* locks - protect against simultaneous write and truncate */extern void _coh_wait_on_inode (struct inode * inode);extern inline void coh_wait_on_inode (struct inode * inode){	if (inode->u.sysv_i.i_lock)		_coh_wait_on_inode(inode);}extern inline void coh_lock_inode (struct inode * inode){	if (inode->u.sysv_i.i_lock)		_coh_wait_on_inode(inode);	inode->u.sysv_i.i_lock = 1;}extern inline void coh_unlock_inode (struct inode * inode){	inode->u.sysv_i.i_lock = 0;	wake_up(&inode->u.sysv_i.i_wait);}/* * Function prototypes */extern int sysv_lookup(struct inode * dir,const char * name, int len,	struct inode ** result);extern int sysv_create(struct inode * dir,const char * name, int len, int mode,	struct inode ** result);extern int sysv_mkdir(struct inode * dir, const char * name, int len, int mode);extern int sysv_rmdir(struct inode * dir, const char * name, int len);extern int sysv_unlink(struct inode * dir, const char * name, int len);extern int sysv_symlink(struct inode * inode, const char * name, int len,	const char * symname);extern int sysv_link(struct inode * oldinode, struct inode * dir, const char * name, int len);extern int sysv_mknod(struct inode * dir, const char * name, int len, int mode, int rdev);extern int sysv_rename(struct inode * old_dir, const char * old_name, int old_len,	struct inode * new_dir, const char * new_name, int new_len);extern struct inode * sysv_new_inode(const struct inode * dir);extern void sysv_free_inode(struct inode * inode);extern unsigned long sysv_count_free_inodes(struct super_block *sb);extern int sysv_new_block(struct super_block * sb);extern void sysv_free_block(struct super_block * sb, unsigned int block);extern unsigned long sysv_count_free_blocks(struct super_block *sb);extern int sysv_bmap(struct inode *,int);extern struct buffer_head * sysv_getblk(struct inode *, unsigned int, int, char* *);extern struct buffer_head * sysv_file_bread(struct inode *, int, int, char* *);extern void sysv_truncate(struct inode *);extern void sysv_put_super(struct super_block *);extern struct super_block *sysv_read_super(struct super_block *,void *,int);extern void sysv_write_super(struct super_block *);extern void sysv_read_inode(struct inode *);extern int sysv_notify_change(int,struct inode *);extern void sysv_write_inode(struct inode *);extern void sysv_put_inode(struct inode *);extern void sysv_statfs(struct super_block *, struct statfs *);extern int sysv_sync_inode(struct inode *);extern int sysv_sync_file(struct inode *, struct file *);#if 0extern int sysv_mmap(struct inode *, struct file *, unsigned long, size_t, int, unsigned long);#endifextern struct inode_operations sysv_file_inode_operations;extern struct inode_operations sysv_file_inode_operations_with_bmap;extern struct inode_operations sysv_dir_inode_operations;extern struct inode_operations sysv_symlink_inode_operations;#endif

⌨️ 快捷键说明

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