z41013774的专栏

每天进步一点点。

linux VFS数据结构(一)

VFS的数据结构
超级块对象
记录已安装文件系统的整体信息,由于具体的文件系统来实现,它对应于具体文件系统的超级块或控制块,存储在磁盘的特定扇区上,如果不是基于磁盘的文件系统,比如sysfs,会生成临时的超级块,保存在内存当中。

01struct super_block {
02 struct list_head s_list;  /* Keep this first */
03 dev_t   s_dev;  /* search index; _not_ kdev_t */
04 unsigned long  s_blocksize;
05 unsigned char  s_blocksize_bits;
06 unsigned char  s_dirt;
07 unsigned long long s_maxbytes; /* Max file size */
08 struct file_system_type *s_type;
09 const struct super_operations *s_op;
10 struct dquot_operations *dq_op;
11  struct quotactl_ops *s_qcop;
12 const struct export_operations *s_export_op;
13 unsigned long  s_flags;
14 unsigned long  s_magic;
15 struct dentry  *s_root;
16 struct rw_semaphore s_umount;
17 struct mutex  s_lock;
18 int   s_count;
19 int   s_need_sync_fs;
20 atomic_t  s_active;
21#ifdef CONFIG_SECURITY
22 void                    *s_security;
23#endif
24 struct xattr_handler **s_xattr;
25
26 struct list_head s_inodes; /* all inodes */
27 struct list_head s_dirty; /* dirty inodes */
28 struct list_head s_io;  /* parked for writeback */
29 struct list_head s_more_io; /* parked for more writeback */
30 struct hlist_head s_anon;  /* anonymous dentries for (nfs) exporting */
31 struct list_head s_files;
32 /* s_dentry_lru and s_nr_dentry_unused are protected by dcache_lock */
33 struct list_head s_dentry_lru; /* unused dentry lru */
34 int   s_nr_dentry_unused; /* # of dentry on lru */
35
36 struct block_device *s_bdev;
37 struct mtd_info  *s_mtd;
38 struct list_head s_instances;
39 struct quota_info s_dquot; /* Diskquota specific options */
40
41 int   s_frozen;
42 wait_queue_head_t s_wait_unfrozen;
43
44 char s_id[32];    /* Informational name */
45
46 void    *s_fs_info; /* Filesystem private info */
47 fmode_t   s_mode;
48 struct mutex s_vfs_rename_mutex; /* Kludge */
49
50 /* Granularity of c/m/atime in ns.
51    Cannot be worse than a second */
52 u32     s_time_gran;
53
54 char *s_subtype;
55
56 char *s_options;
57 struct list_head s_async_list;
58};

第2行指向超级块链表的指针
第3行设备标识符
第4行以字节为单位的块大小
第5行以位为单位的块大小
第6行修改标志
第7行文件的最长长度
第8行文件系统类型
第9行超级块方法
第10行磁盘限额处理方法
第11行磁盘限额管理方法
第12行网络文件系统使用的输出操作
第13行安装标志
第14行文件系统的魔数
第15行文件系统根目录的目录项对象
第16行卸载所用的信号量
第17行超级块信息量
第18行引用计数器
第19行对超级块的已安装文件系统进行同步的标志
第20行次级引用计数器
第22行指向超级块安全数据结构的指针
第24行指向超级块扩展属性结构的指针
第26行所有索引节点的链表
第27行改进型索引节点的链表
第28行等待被写入磁盘的索引节点的链表
第30行用于处理远程网络文件系统的匿名目录项的链表
第31行文件对象的链表
第36行指向块设备驱动程序描述符的指针
第38行用于给定文件系统类型的超级块对象链表的指针
第39行磁盘限额的描述符
第41行冻结文件系统时使用的标志
第42行进程挂起的等待队列,直到文件系统被解冻
第46行指向特定文件的超级块信息的指针
第52行时间戳的粒度
超级块的操作方法

01struct super_operations {
02    struct inode *(*alloc_inode)(struct super_block *sb);
03 void (*destroy_inode)(struct inode *);
04
05    void (*dirty_inode) (struct inode *);
06 int (*write_inode) (struct inode *, int);
07 void (*drop_inode) (struct inode *);
08 void (*delete_inode) (struct inode *);
09 void (*put_super) (struct super_block *);
10 void (*write_super) (struct super_block *);
11 int (*sync_fs)(struct super_block *sb, int wait);
12 int (*freeze_fs) (struct super_block *);
13 int (*unfreeze_fs) (struct super_block *);
14 int (*statfs) (struct dentry *, struct kstatfs *);
15 int (*remount_fs) (struct super_block *, int *, char *);
16 void (*clear_inode) (struct inode *);
17 void (*umount_begin) (struct super_block *);
18
19 int (*show_options)(struct seq_file *, struct vfsmount *);
20 int (*show_stats)(struct seq_file *, struct vfsmount *);
21#ifdef CONFIG_QUOTA
22 ssize_t (*quota_read)(struct super_block *, int, char *, size_t, loff_t);
23 ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t);
24#endif
25 int (*bdev_try_to_free_page)(struct super_block*, struct page*, gfp_t);
26};

第2行为索引节点对象分配空间,包括具体文件系统的数据所需要的空间。
第3行撤消索引节点对象。
第5行当索引节点标记为修改(脏)时调用。
第6行用通过传递参数指定的索引节点对象的内容更新一个文件系统的索引节点。索引节点对象的i_ino字段标识所涉及磁盘上文件系统的索引节点。flag参数表示I/O操作是否应当同步。
第7行撤消索引节点时调用
第8行在必须撤消索引节点时调用。删除内存中的VFS索引节点和磁盘上的文件数据及元数据
第9行释放通过传递的参数指定的超级块对象
第10行用指定对象的内容更新文件系统的超级块
第11行在清除文件系统来更新磁盘上的具体文件系统数据时调用。
第14行将文件系统的统计信息返回,填写在buf缓存区中。
第15行用新选项重新安装文件系统
第16行当撤消磁盘索引节点执行具体文件操作时调用。
第17行中断一个安装操作
第19行用来显示特定文件系统的选项
第22行限额系统使用该方法从文件中读取数据。
第23行限额系统使用该方法将数据写入文件中
索引节点对象
存放关于具体文件的一般信息。对基于磁盘的文件系统,通常对应于存放在磁盘上的文件控制块。每个索引节点对象都有一个索引节点号,这个节点号唯一的标识文件系统中的文件。。

01struct inode {
02 struct hlist_node i_hash;
03 struct list_head i_list;
04 struct list_head i_sb_list;
05 struct list_head i_dentry;
06 unsigned long  i_ino;
07 atomic_t  i_count;
08 unsigned int  i_nlink;
09 uid_t   i_uid;
10 gid_t   i_gid;
11 dev_t   i_rdev;
12 u64   i_version;
13 loff_t   i_size;
14#ifdef __NEED_I_SIZE_ORDERED
15 seqcount_t  i_size_seqcount;
16#endif
17 struct timespec  i_atime;
18 struct timespec  i_mtime;
19 struct timespec  i_ctime;
20 unsigned int  i_blkbits;
21 blkcnt_t  i_blocks;
22 unsigned short          i_bytes;
23 umode_t   i_mode;
24 spinlock_t  i_lock; /* i_blocks, i_bytes, maybe i_size */
25 struct mutex  i_mutex;
26 struct rw_semaphore i_alloc_sem;
27 const struct inode_operations *i_op;
28 const struct file_operations *i_fop; /* former ->i_op->default_file_ops */
29 struct super_block *i_sb;
30 struct file_lock *i_flock;
31 struct address_space *i_mapping;
32 struct address_space i_data;
33#ifdef CONFIG_QUOTA
34 struct dquot  *i_dquot[MAXQUOTAS];
35#endif
36 struct list_head i_devices;
37 union {
38  struct pipe_inode_info *i_pipe;
39  struct block_device *i_bdev;
40  struct cdev  *i_cdev;
41 };
42 int   i_cindex;
43
44 __u32   i_generation;
45
46#ifdef CONFIG_DNOTIFY
47 unsigned long  i_dnotify_mask; /* Directory notify events */
48 struct dnotify_struct *i_dnotify; /* for directory notifications */
49#endif
50
51#ifdef CONFIG_INOTIFY
52 struct list_head inotify_watches; /* watches on this inode */
53 struct mutex  inotify_mutex; /* protects the watches list */
54#endif
55
56 unsigned long  i_state;
57 unsigned long  dirtied_when; /* jiffies of first dirtying */
58
59 unsigned int  i_flags;
60
61 atomic_t  i_writecount;
62#ifdef CONFIG_SECURITY
63 void   *i_security;
64#endif
65 void   *i_private; /* fs or device private pointer */
66};

第2行用于散列链表的指针
第3行用于描述索引节点当前状态的链表的指针
第4行用于超级块的索引节点链表的指针
第5行引用索引节点的目录项对象链表的头
第6行索引节点号
第7行引用计数器
第8行硬链接数目
第9行所有者标识符
第10行组标识符
第11行实设备标识符
第13行文件的字节数
第17行上次访问文件的时间
第18行上次写文件的时间
第19行上次修改索引节点的时间
第20行块的字节数
第21行文件的块数
第26行在直接I/O文件操作中避免出现竞争条件的读/写信号量
第27行索引节点的操作
第28行缺省文件操作
第29行指向超级块对象的指针
第30行指向文件锁链表的指针
第31行指向address_space对象
第32行文件的address_space对象
第34行索引节点磁盘限额
第36行用于具体的字符或块设备索引节点链表的指针
第38行管道文件使用
第39行指向块设备驱动程序的指针
第40行指向字符设备驱动程序的指针
第42行拥有一组次设备号的设备文件的索引
第44行索引节点版本号
第47行目录通知事件的位掩码
第48行用于目录通知
第56行索引节点的状态标志
第57行索引节点的弄脏时间
第59行文件系统的安装标志
第61行用于写进程的引用计数器
第63行指向索引节点安全结构的指针

索引结点的操作方法

01struct inode_operations {
02 int (*create) (struct inode *,struct dentry *,int, struct nameidata *);
03 struct dentry * (*lookup) (struct inode *,struct dentry *, struct nameidata *);
04 int (*link) (struct dentry *,struct inode *,struct dentry *);
05 int (*unlink) (struct inode *,struct dentry *);
06 int (*symlink) (struct inode *,struct dentry *,const char *);
07 int (*mkdir) (struct inode *,struct dentry *,int);
08 int (*rmdir) (struct inode *,struct dentry *);
09 int (*mknod) (struct inode *,struct dentry *,int,dev_t);
10 int (*rename) (struct inode *, struct dentry *,
11   struct inode *, struct dentry *);
12 int (*readlink) (struct dentry *, char __user *,int);
13 void * (*follow_link) (struct dentry *, struct nameidata *);
14 void (*put_link) (struct dentry *, struct nameidata *, void *);
15 void (*truncate) (struct inode *);
16 int (*permission) (struct inode *, int);
17 int (*setattr) (struct dentry *, struct iattr *);
18 int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *);
19 int (*setxattr) (struct dentry *, const char *,const void *,size_t,int);
20 ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t);
21 ssize_t (*listxattr) (struct dentry *, char *, size_t);
22 int (*removexattr) (struct dentry *, const char *);
23 void (*truncate_range)(struct inode *, loff_t, loff_t);
24 long (*fallocate)(struct inode *inode, int mode, loff_t offset,
25     loff_t len);
26 int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start,
27        u64 len);
28};

第2行为与目录项对象相关的普通文件创建一个新的磁盘索引节点
第3行为包含在一个目录项对象中的文件名对应的索引节点查找目录
第4行创建一个新的名为new_dentry的硬链接,它指向dir目录下名为old_dentry的文件。
第5行从一个目录中删除目录项对象所指定文件的硬链接
第6行在某个目录下,为与目录项对象相关的符号链接创建一个新的索引节点
第7行在某个目录下,为与目录项对象相关的目录创建一个新的索引节点
第8行从一个目录删除子目录,子目录的名称包含在目录项对象中。
第9行在某个目录中,为与目录项对象相关的特定文件创建一个新磁盘索引节点。
第10行将old_dir目录下由old_entry标识的文件移动new_dir目录下。
第12行将目录项所指定的符号链接中对应的文件路径名拷贝到buffer所指定的用户态内存区
第13行解析索引节点对象所指定的符号链接
第14行释放由follow_link方法分配的用于解析符号链接的所有临时数据结构
第15行修改与索引节点相关的文件长度
第16行检查是否允许对索引节点所指的文件进行指定模式的访问。
第17行在触及索引节点属性后通知一个”修改事件”
第18行由一些文件系统用于读取索引节点属性
第19行获取扩展属性名称的整个链表
第20行删除索引节点的扩展属性。

 

阅读更多
个人分类: linux 虚拟文件系统
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭