Linux 虚拟文件系统四大对象:超级块、inode、dentry、file之间关系 (4)

一般文件系统中很少有文件小于2KB的,所以预定按照2KB分,一般inode是用不完的。所以inode在文件系统安装的时候会有一个默认数量,后期会根据实际的需要发生变化。

注意inode号:inode号是唯一的,表示不同的文件。其实在Linux内部的时候,访问文件都是通过inode号来进行的,所谓文件名仅仅是给用户容易使用的。

当我们打开一个文件的时候,首先,系统找到这个文件名对应的inode号;然后,通过inode号,得到inode信息,最后,由inode找到文件数据所在的block,现在可以处理文件数据了。

inode和文件的关系?

当创建一个文件的时候,就给文件分配了一个inode。一个inode只对应一个实际文件,一个文件也会只有一个inode。inodes最大数量就是文件的最大数量。

527 struct inode { 528 umode_t i_mode; /* 访问权限控制 */ 529 unsigned short i_opflags; 530 kuid_t i_uid; /* 使用者的id */ 531 kgid_t i_gid; /* 使用组id */ 532 unsigned int i_flags; /* 文件系统标志 */ 533 534 #ifdef CONFIG_FS_POSIX_ACL 535 struct posix_acl *i_acl; 536 struct posix_acl *i_default_acl; 537 #endif 538 539 const struct inode_operations *i_op; /*索引节点操作表*/ 540 struct super_block *i_sb; /* 相关的超级块 */ 541 struct address_space *i_mapping; /* 相关的地址映射 */ 542 543 #ifdef CONFIG_SECURITY 544 void *i_security; 545 #endif 546 547 /* Stat data, not accessed from path walking */ 548 unsigned long i_ino; /* 索引节点号 */ 549 /* 550 * Filesystems may only read i_nlink directly. They shall use the 551 * following functions for modification: 552 * 553 * (set|clear|inc|drop)_nlink 554 * inode_(inc|dec)_link_count 555 */ 556 union { 557 const unsigned int i_nlink; 558 unsigned int __i_nlink; /* 硬连接数 */ 559 }; 560 dev_t i_rdev; /* 实际设备标识符号 */ 561 loff_t i_size; 562 struct timespec i_atime; /* 最后访问时间 */ 563 struct timespec i_mtime; /* 最后修改时间 */ 564 struct timespec i_ctime; /* 最后改变时间 */ 565 spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */ 566 unsigned short i_bytes; /* 使用的字节数 */ 567 unsigned int i_blkbits; 568 blkcnt_t i_blocks; /* 文件的块数 */ 569 570 #ifdef __NEED_I_SIZE_ORDERED 571 seqcount_t i_size_seqcount; 572 #endif 573 574 /* Misc */ 575 unsigned long i_state; 576 struct mutex i_mutex; 577 578 unsigned long dirtied_when; /* jiffies of first dirtying 首次修改时间*/ 579 580 struct hlist_node i_hash; /* hash值,提高查找效率 */ 581 struct list_head i_wb_list; /* backing dev IO list */ 582 struct list_head i_lru; /* inode LRU list 未使用的inode*/ 583 struct list_head i_sb_list; /* 链接一个文件系统中所有inode的链表 */ 584 union { 585 struct hlist_head i_dentry; /* 目录项链表 */ 586 struct rcu_head i_rcu; 587 }; 588 u64 i_version; 589 atomic_t i_count; /* 引用计数 */ 590 atomic_t i_dio_count; 591 atomic_t i_writecount; /* 写者计数 */ 592 const struct file_operations *i_fop; /* former ->i_op->default_file_ops 文件操作*/ 593 struct file_lock *i_flock; /* 文件锁链表 */ 594 struct address_space i_data; /* 表示被inode读写的页面 */ 595 #ifdef CONFIG_QUOTA 596 struct dquot *i_dquot[MAXQUOTAS];/* 节点的磁盘限额 */ 597 #endif 598 struct list_head i_devices; /* 设备链表(共用同一个驱动程序的设备形成的链表。) */ 599 union { 600 struct pipe_inode_info *i_pipe; /* 管道信息 */ 601 struct block_device *i_bdev; /* 块设备驱动节点 */ 602 struct cdev *i_cdev; /* 字符设备驱动节点 */ 603 }; 604 605 __u32 i_generation; /* 索引节点版本号 */ 606 607 #ifdef CONFIG_FSNOTIFY 608 __u32 i_fsnotify_mask; /* all events this inode cares about */ 609 struct hlist_head i_fsnotify_marks; 610 #endif 611 612 #ifdef CONFIG_IMA 613 atomic_t i_readcount; /* struct files open RO */ 614 #endif 615 void *i_private; /* fs or device private pointer 用户私有数据*/ 616 };

注意管理inode的四个链表:

static struct hlist_head *inode_hashtable __read_mostly; 节点方法 struct inode_operations { struct dentry * (*lookup) (struct inode *,struct dentry *, unsigned int); void * (*follow_link) (struct dentry *, struct nameidata *); int (*permission) (struct inode *, int); struct posix_acl * (*get_acl)(struct inode *, int); int (*readlink) (struct dentry *, char __user *,int); void (*put_link) (struct dentry *, struct nameidata *, void *); int (*create) (struct inode *,struct dentry *, umode_t, bool); int (*link) (struct dentry *,struct inode *,struct dentry *); int (*unlink) (struct inode *,struct dentry *); int (*symlink) (struct inode *,struct dentry *,const char *); int (*mkdir) (struct inode *,struct dentry *,umode_t); int (*rmdir) (struct inode *,struct dentry *); int (*mknod) (struct inode *,struct dentry *,umode_t,dev_t); int (*rename) (struct inode *, struct dentry *, struct inode *, struct dentry *); int (*rename2) (struct inode *, struct dentry *, struct inode *, struct dentry *, unsigned int); int (*setattr) (struct dentry *, struct iattr *); int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *); int (*setxattr) (struct dentry *, const char *,const void *,size_t,int); ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t); ssize_t (*listxattr) (struct dentry *, char *, size_t); int (*removexattr) (struct dentry *, const char *); int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start, u64 len); int (*update_time)(struct inode *, struct timespec *, int); int (*atomic_open)(struct inode *, struct dentry *, struct file *, unsigned open_flag, umode_t create_mode, int *opened); int (*tmpfile) (struct inode *, struct dentry *, umode_t); int (*set_acl)(struct inode *, struct posix_acl *, int); } ____cacheline_aligned;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wssgzj.html