您的位置:首页 > 运维架构 > Linux

Linux文件系统

2015-11-19 19:46 351 查看
首先要从fs.h头文件开始,file的定义为:

<span style="font-size:14px;">	/*
* fu_list becomes invalid after file_free is called and queued via
* fu_rcuhead for RCU freeing
*/
union {
struct list_head	fu_list;
struct rcu_head 	fu_rcuhead;
} f_u;
struct path		f_path;
#define f_dentry	f_path.dentry
#define f_vfsmnt	f_path.mnt
const struct file_operations	*f_op;
spinlock_t		f_lock;  /* f_ep_links, f_flags, no IRQ */
atomic_long_t		f_count;
unsigned int 		f_flags;
fmode_t			f_mode;
loff_t			f_pos;
struct fown_struct	f_owner;
const struct cred	*f_cred;
struct file_ra_state	f_ra;

u64			f_version;
#ifdef CONFIG_SECURITY
void			*f_security;
#endif
/* needed for tty driver, and maybe others */
void			*private_data;

#ifdef CONFIG_EPOLL
/* Used by fs/eventpoll.c to link all the hooks to this file */
struct list_head	f_ep_links;
struct list_head	f_tfile_llink;
#endif /* #ifdef CONFIG_EPOLL */
struct address_space	*f_mapping;
#ifdef CONFIG_DEBUG_WRITECOUNT
unsigned long f_mnt_write_state;
#endif
};</span>

其中struct path的定义为:

<span style="font-size:14px;">struct path {
struct vfsmount *mnt;
struct dentry *dentry;
</span><span style="font-family:KaiTi_GB2312;font-size:14px;">};
</span>


dentry的定义为:

<span style="font-size:14px;">struct dentry {
atomic_t d_count;
unsigned int d_flags;		/* protected by d_lock */
spinlock_t d_lock;		/* per dentry lock */
int d_mounted;
struct inode *d_inode;		/* Where the name belongs to - NULL is
* negative */
/*
</span><span style="font-size:14px;">	 * The next three fields are touched by __d_lookup.  Place them here
* so they all fit in a cache line.
*/
struct hlist_node d_hash;	/* lookup hash list */  通过查询哈希表的方式,可以比较快的找到一个inode。
struct dentry *d_parent;	/* parent directory */
struct qstr d_name;

struct list_head d_lru;		/* LRU list */
/*
* d_child and d_rcu can share memory
*/
union {
struct list_head d_child;	/* child of parent list */
struct rcu_head d_rcu;
} d_u;
struct list_head d_subdirs;	/* our children */
struct list_head d_alias;	/* inode alias list */
unsigned long d_time;		/* used by d_revalidate */
const struct dentry_operations *d_op;
struct super_block *d_sb;	/* The root of the dentry tree */
void *d_fsdata;			/* fs-specific data */

unsigned char d_iname[DNAME_INLINE_LEN_MIN];	/* small names */
};
</span>


dentry里有一个结构体inode,记录了file的重要相关信息

<span style="font-size:14px;">struct inode {
struct hlist_node	i_hash;
struct list_head	i_list;		/* backing dev IO list */
struct list_head	i_sb_list;
struct list_head	i_dentry;
unsigned long		i_ino;
atomic_t		i_count;
unsigned int		i_nlink;     //link数
uid_t			i_uid;       //用户,组信息,
gid_t			i_gid;
dev_t			i_rdev;
u64			i_version;
loff_t			i_size;
#ifdef __NEED_I_SIZE_ORDERED
seqcount_t		i_size_seqcount;
#endif
struct timespec		i_atime;
struct timespec		i_mtime;
struct timespec		i_ctime;
blkcnt_t		i_blocks;
unsigned int		i_blkbits;
unsigned short          i_bytes;
umode_t			i_mode;
spinlock_t		i_lock;	/* i_blocks, i_bytes, maybe i_size */
struct mutex		i_mutex;
struct rw_semaphore	i_alloc_sem;
const struct inode_operations	*i_op;            //默认文件操作。
const struct file_operations	*i_fop;	/* former ->i_op->default_file_ops */
struct super_block	*i_sb;
struct file_lock	*i_flock;
struct address_space	*i_mapping;
struct address_space	i_data;
#ifdef CONFIG_QUOTA
struct dquot		*i_dquot[MAXQUOTAS];
#endif
struct list_head	i_devices;
union {
struct pipe_inode_info	*i_pipe;
struct block_device	*i_bdev;
struct cdev		*i_cdev;
};

__u32			i_generation;

#ifdef CONFIG_FSNOTIFY
__u32			i_fsnotify_mask; /* all events this inode cares about */
struct hlist_head	i_fsnotify_mark_entries; /* fsnotify mark entries */
#endif

#ifdef CONFIG_INOTIFY
struct list_head	inotify_watches; /* watches on this inode */
struct mutex		inotify_mutex;	/* protects the watches list */
#endif

unsigned long		i_state;
unsigned long		dirtied_when;	/* jiffies of first dirtying */

unsigned int		i_flags;

atomic_t		i_writecount;
#ifdef CONFIG_SECURITY
void			*i_security;
#endif
#ifdef CONFIG_FS_POSIX_ACL
struct posix_acl	*i_acl;
struct posix_acl	*i_default_acl;
#endif
void			*i_private; /* fs or device private pointer */
};</span>

里面有个关键成员const struct file_operations *i_fop;,定义为:

<span style="font-size:14px;">struct file_operations {
struct module *owner;
loff_t (*llseek) (struct file *, loff_t, int);
ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);
ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t);
int (*readdir) (struct file *, void *, filldir_t);
unsigned int (*poll) (struct file *, struct poll_table_struct *);
int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);
long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
int (*mmap) (struct file *, struct vm_area_struct *);
int (*open) (struct inode *, struct file *);
int (*flush) (struct file *, fl_owner_t id);
int (*release) (struct inode *, struct file *);
int (*fsync) (struct file *, struct dentry *, int datasync);
int (*aio_fsync) (struct kiocb *, int datasync);
int (*fasync) (int, struct file *, int);
int (*lock) (struct file *, int, struct file_lock *);
ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
int (*check_flags)(int);
int (*flock) (struct file *, int, struct file_lock *);
ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);
ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);
int (*setlease)(struct file *, long, struct file_lock **);
};</span>

这些函数就是底层需要实现的部分,当然不需要实现所有的部分,具体看是什么设备,和具体需要的功能,来实现相应的函数。

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: