1. 索引节点对象(inode object)
文件系统处理文件所需要的所有信息都放在索引节点数据结构中。文件名可以改,但索引节点对文件是唯一的。每个索引节点对象都会复制磁盘索引节点包含的一些数据,比如分配给文件的块数。
1.1 索引节点数据结构
struct inode {
struct hlist_node i_hash; /* 用于散列链表的指针 */
struct list_head i_list; /* 用于描述索引节点当前状态的链表的指针 */
struct list_head i_sb_list; /* 用于超级块的索引节点链表的指针 */
struct list_head i_dentry; /* 引用索引节点的目录项对象链表的头 */
unsigned long i_ino; /* 索引节点号 */
atomic_t i_count; /* 引用计数器 */
unsigned int i_nlink; /* 硬链接数目 */
uid_t i_uid; /* 所有者标识符 */
gid_t i_gid; /* 组标识符 */
dev_t i_rdev; /* 设备标识符 */
unsigned long i_version; /* 版本号(每次使用后自动递增) */
loff_t i_size; /* 文件的字节数 */
seqcount_t i_size_seqcount;/* SMP系统为i_size字段获取一致值时使用的顺序计数器 */
struct timespec i_atime; /* 上次访问的时间 */
struct timespec i_mtime; /* 上次写文件的时间 */
struct timespec i_ctime; /* 上次修改索引节点的时间 */
unsigned int i_blkbits; /* 块的位数 */
blkcnt_t i_blocks; /* 文件的块数 */
unsigned short i_bytes; /* 文件中最后一个块的字节数 */
umode_t i_mode; /* 文件类型与访问权限 */
spinlock_t i_lock; /* 保护索引节点一些字段的自旋锁 */
struct mutex i_mutex;
struct rw_semaphore i_alloc_sem;/* 在直接I/O文件操作中避免出现竞争条件的读/写信号量 */
const struct inode_operations *i_op; /* 索引节点的操作 */
const struct file_operations *i_fop; /* 缺省文件操作 */
struct super_block *i_sb; /* 指向超级块对象的指针 */
struct file_lock *i_flock; /* 指向文件锁链表的指针 */
struct address_space *i_mapping; /* 指向address_space对象的指针 */
struct address_space i_data; /* 文件的address_space对象 */
struct dquot *i_dquot[MAXQUOTAS];/* 索引节点磁盘限额 */
struct list_head i_devices; /* 用于具体的字符或块设备索引节点链表的指针 */
union {
struct pipe_inode_info *i_pipe; /* 如果文件是一个管道则使用它 */
struct block_device *i_bdev; /* 指向块设备驱动程序的指针 */
struct cdev *i_cdev; /* 指向字符设备驱动程序的指针 */
};
int i_cindex; /* 拥有一组次设备号的设备文件的索引 */
__u32 i_generation; /* 索引节点版本号(由某些文件系统使用) */
unsigned long