VFS,super_block,inode,dentry—结构体图解


1、super_block
- 相关的数据结构为:
struct super_block{struct list_head s_list;/* Keep this first */// 连接super_block的链表dev_t s_dev;/* search index; _not_ kdev_t */unsignedlong s_blocksize;unsignedlong s_old_blocksize;unsignedchar s_blocksize_bits;unsignedchar s_dirt;unsignedlonglong s_maxbytes;/* Max file size */struct file_system_type *s_type;// 所表示的文件系统的类型struct super_operations *s_op;// 文件相关操作函数集合表struct dquot_operations *dq_op;//struct quotactl_ops *s_qcop;//struct export_operations *s_export_op;//unsignedlong s_flags;//unsignedlong s_magic;//struct dentry *s_root;// Linux文件系统中某个索引节点(inode)的链接struct rw_semaphore s_umount;//struct semaphore s_lock;//int s_count;//int s_syncing;//int s_need_sync_fs;//atomic_t s_active;//void*s_security;//struct xattr_handler **s_xattr;//struct list_head s_inodes;/* all inodes */// 链接文件系统的inodestruct list_head s_dirty;/* dirty inodes */struct list_head s_io;/* parked for writeback */struct hlist_head s_anon;/* anonymous dentries for (nfs) exporting */struct list_head s_files;// 对于每一个打开的文件,由file对象来表示。链接文件系统中filestruct block_device *s_bdev;//struct list_head s_instances;//struct quota_info s_dquot;/* Diskquota specific options */int s_frozen;//wait_queue_head_t s_wait_unfrozen;//char s_id[32];/* Informational name */void*s_fs_info;/* Filesystem private info *//*** The next field is for VFS *only*. No filesystems have any business* even looking at it. You had been warned.*/struct semaphore s_vfs_rename_sem;/* Kludge *//* Granuality of c/m/atime in ns.Cannot be worse than a second */u32 s_time_gran;};
- super_block存在于两个链表中,一个是系统所有super_block的链表, 一个是对于特定的文件系统的super_block链表.

- 对于特定的文件系统(文件系统层的具体文件系统), 该文件系统的所有的super_block 都存在于file_sytem_type中的fs_supers链表中.
而所有的文件系统,都存在于file_systems链表中.这是通过调用register_filesystem接口来注册文件系统的.
int register_filesystem(struct file_system_type * fs)

/** Keep mostly read-only and often accessed (especially for* the RCU path lookup and 'stat' data) fields at the beginning* of the 'struct inode'*/struct inode{umode_t i_mode;unsignedshort i_opflags;kuid_t i_uid;kgid_t i_gid;unsignedint i_flags;#ifdef CONFIG_FS_POSIX_ACLstruct posix_acl *i_acl;struct posix_acl *i_default_acl;#endifconststruct inode_operations *i_op;struct super_block *i_sb;struct address_space *i_mapping;#ifdef CONFIG_SECURITYvoid*i_security;#endif/* Stat data, not accessed from path walking */unsignedlong i_ino;/** Filesystems may only read i_nlink directly. They shall use the* following functions for modification:** (set|clear|inc|drop)_nlink* inode_(inc|dec)_link_count*/union{constunsignedint i_nlink;unsignedint __i_nlink;};dev_t i_rdev;loff_t i_size;struct timespec i_atime;struct timespec i_mtime;struct timespec i_ctime;spinlock_t i_lock;/* i_blocks, i_bytes, maybe i_size */unsignedshort i_bytes;unsignedint i_blkbits;blkcnt_t i_blocks;#ifdef __NEED_I_SIZE_ORDEREDseqcount_t i_size_seqcount;#endif/* Misc */unsignedlong i_state;struct mutex i_mutex;unsignedlong dirtied_when;/* jiffies of first dirtying */unsignedlong dirtied_time_when;struct hlist_node i_hash;struct list_head i_wb_list;/* backing dev IO list */struct list_head i_lru;/* inode LRU list */struct list_head i_sb_list;union{struct hlist_head i_dentry;struct rcu_head i_rcu;};u64 i_version;atomic_t i_count;atomic_t i_dio_count;atomic_t i_writecount;#ifdef CONFIG_IMAatomic_t i_readcount;/* struct files open RO */#endifconststruct file_operations *i_fop;/* former ->i_op->default_file_ops */struct file_lock_context *i_flctx;struct address_space i_data;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_marks;#endifvoid*i_private;/* fs or device private pointer */};
一个是inode所在文件系统的super_block的 s_inodes 链表中
一个是根据inode的使用状态存在于以下三个链表中的某个链表中:
- 未用的: inode_unused 链表
- 正在使用的: inode_in_use 链表
- 脏的: super block中的s_dirty 链表
另外,还有一个重要的链表: inode_hashtable(这个暂不介绍).

struct dentry{/* RCU lookup touched fields */unsignedint d_flags;/* protected by d_lock */seqcount_t d_seq;/* per dentry seqlock */struct hlist_bl_node d_hash;/* lookup hash list */struct dentry *d_parent;/* parent directory */struct qstr d_name;struct inode *d_inode;/* Where the name belongs to - NULL is* negative */unsignedchar d_iname[DNAME_INLINE_LEN];/* small names *//* Ref lookup also touches following */struct lockref d_lockref;/* per-dentry lock and refcount */conststruct dentry_operations *d_op;struct super_block *d_sb;/* The root of the dentry tree */unsignedlong d_time;/* used by d_revalidate */void*d_fsdata;/* fs-specific data */struct list_head d_lru;/* LRU list */struct list_head d_child;/* child of parent list */struct list_head d_subdirs;/* our children *//** d_alias and d_rcu can share memory*/union{struct hlist_node d_alias;/* inode alias list */struct rcu_head d_rcu;} d_u;};
- 所有未用的目录项: dentry_unused 链表
- 正在使用的目录项: 对应inode的 i_dentry 链表
- 表示父子目录结构的链表
另外,还有一个重要的链表: inode_hashtable(这个暂不介绍).

VFS,super_block,inode,dentry—结构体图解的更多相关文章
- 2018.5.2 file结构体
f_flags,File Status Flag f_pos,表示当前读写位置 f_count,表示引用计数(Reference Count): dup.fork等系统调用会导致多个文件描述符指向同一 ...
- inode file 结构
inode位图(inode Bitmap) 和块位图类似,本身占一个块,其中每个bit表示一个inode是否空闲可用. inode表(inode Table) 我们知道,一个文件除了数据需要存储之外, ...
- C语言文件操作 FILE结构体
内存中的数据都是暂时的,当程序结束时,它们都将丢失.为了永久性的保存大量的数据,C语言提供了对文件的操作. 1.文件和流 C将每个文件简单地作为顺序字节流(如下图).每个文件用文件结束符结束,或者在特 ...
- 文件系统系列学习笔记 - inode/dentry/file/super(2)
此篇文章主要介绍下linux 文件系统下的主要对象及他们之间的关系. 1 inode inode结构中主要包含对文件或者目录原信息的描述,原信息包括但不限于文件大小.文件在磁盘块中的位置信息.权限位. ...
- file结构体中private_data指针的疑惑
转:http://www.360doc.com/content/12/0506/19/1299815_209093142.shtml hi all and barry, 最近在学习字符设备驱动,不太明 ...
- file结构体中private_data指针的疑惑【转】
本文转载自:http://www.cnblogs.com/pengdonglin137/p/3328984.html hi all and barry, 最近在学习字符设备驱动,不太明白private ...
- vfs:结构体对象
VFS结构体 super_block 存储一个已安装的文件系统的控制信息,代表一个已安装的文件系统:每次一个实际的文件系统被安装时, 内核会从磁盘的特定位置读取一些控制信息来填充内存中的超级块对象.一 ...
- 文件系统VFS数据结构(超级块 inode dentry file)(收集整理)
Linux虚拟文件系统四大对象: 1)超级块(super block) 2)索引节点(inode) 3)目录项(dentry) 4)文件对象(file) 一个进程在对一个文件进行操作时各种对象的引用过 ...
- Linux字符设备中的两个重要结构体(file、inode)
对于Linux系统中,一般字符设备和驱动之间的函数调用关系如下图所示 上图描述了用户空间应用程序通过系统调用来调用程序的过程.一般而言在驱动程序的设计中,会关系 struct file 和 struc ...
随机推荐
- c语言条件编译和预编译
转自http://www.cnblogs.com/rusty/archive/2011/03/27/1996806.html 一.C语言由源代码生成的各阶段如下: C源程序->编译预处理-> ...
- Struts2的配置文件中, <package>的作用,<action><result>重名?
问:Struts2的配置文件中, <package>的作用是什么? 答:防止action重名啊,例如前台和后台,总会有很多地方起名重复的! 问:可是访问的时候,不也是访问action吗,能 ...
- win8安装配置python2.7
安装python 1.下载python安装包,下载网站https://www.python.org/downloads 2.解压文件,双击python-2.7.13.amd64.msi进行安装pyth ...
- Chapter 8(查找)
1.二分查找和插值查找 //************************Search.h*********************************** #ifndef SEARCH_H # ...
- python基础之模块之序列化
---什么是序列化(picking)? 我们把变量从内存中变成可存储或传输的过程称之为序列化. 序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上. 反过来,把变量内容从序列化的 ...
- js原型解释图
- Java上传文件夹(Jersey)
背景介绍:公司要在CMS系统上为运营人员提供一个功能供运营人员将做好的活动页面上传到阿里云存储上,上传的内容为一个文件夹,文件夹内部有.html网页,JS文件夹下有JS文件,CSS文件夹下有样式表,I ...
- RabbitMQ问题解决:TCP connection succeeded but Erlang distribution failed
说明 本来是要先把Hystrix 仪表盘更完的,但是出现了Turbine.Dashboard.RabbitMQ整合实现监控. 所以先在学RabbitMq的基本操作,在安装过程中出现了 E:\Rabbi ...
- [JQuery代码]超酷鼠标滑过背景高亮效果
1.效果及功能说明 鼠标滑过悬停特效,div css制作产品列表图片布局通过鼠标滑过产品图片背景高亮闪烁显示,产品标题滑动显示或隐藏 2.实现原理 首先定义好一个重复实现效果的方法,然后定义光带出现速 ...
- Windows无法访问局域网内共享文件夹[0x800704cf,0x80070035]解决方案
Windows7系统突然无法访问访问其他windows机器的共享文件夹,出现0x800704cf或者0x80070035错误: 解决方案如下两张图,配置与下面两张图为准,即可解决: 1:window+ ...