EXT2文件系统的一点思考和小结
来源:互联网 发布:禁止安装程序的软件 编辑:程序博客网 时间:2024/05/19 10:39
static const struct super_operations ext2_sops = {.alloc_inode= ext2_alloc_inode,.destroy_inode= ext2_destroy_inode,.write_inode= ext2_write_inode,.delete_inode= ext2_delete_inode,.put_super= ext2_put_super,.write_super= ext2_write_super,.sync_fs= ext2_sync_fs,.statfs= ext2_statfs,.remount_fs= ext2_remount,.clear_inode= ext2_clear_inode,.show_options= ext2_show_options,#ifdef CONFIG_QUOTA.quota_read= ext2_quota_read,.quota_write= ext2_quota_write,#endif};==== reg file ======const struct inode_operations ext2_dir_inode_operations = {.create= ext2_create,.lookup= ext2_lookup,.link= ext2_link,.unlink= ext2_unlink,.symlink= ext2_symlink,.mkdir= ext2_mkdir,.rmdir= ext2_rmdir,.mknod= ext2_mknod,.rename= ext2_rename,#ifdef CONFIG_EXT2_FS_XATTR.setxattr= generic_setxattr,.getxattr= generic_getxattr,.listxattr= ext2_listxattr,.removexattr= generic_removexattr,#endif.setattr= ext2_setattr,.check_acl= ext2_check_acl,};const struct file_operations ext2_file_operations = {.llseek= generic_file_llseek,.read= do_sync_read,.write= do_sync_write,.aio_read= generic_file_aio_read,.aio_write= generic_file_aio_write,.unlocked_ioctl = ext2_ioctl,#ifdef CONFIG_COMPAT.compat_ioctl= ext2_compat_ioctl,#endif.mmap= generic_file_mmap,.open= dquot_file_open,.release= ext2_release_file,.fsync= ext2_fsync,.splice_read= generic_file_splice_read,.splice_write= generic_file_splice_write,};==== dir file ======const struct file_operations ext2_dir_operations = {.llseek= generic_file_llseek,.read= generic_read_dir,.readdir= ext2_readdir,.unlocked_ioctl = ext2_ioctl,#ifdef CONFIG_COMPAT.compat_ioctl= ext2_compat_ioctl,#endif.fsync= ext2_fsync,};==== symlink ======const struct inode_operations ext2_symlink_inode_operations = {.readlink= generic_readlink,.follow_link= page_follow_link_light,.put_link= page_put_link,.setattr= ext2_setattr,#ifdef CONFIG_EXT2_FS_XATTR.setxattr= generic_setxattr,.getxattr= generic_getxattr,.listxattr= ext2_listxattr,.removexattr= generic_removexattr,#endif}; const struct inode_operations ext2_fast_symlink_inode_operations = {.readlink= generic_readlink,.follow_link= ext2_follow_link,.setattr= ext2_setattr,#ifdef CONFIG_EXT2_FS_XATTR.setxattr= generic_setxattr,.getxattr= generic_getxattr,.listxattr= ext2_listxattr,.removexattr= generic_removexattr,#endif};
ext理论上每个group应该都有一个super block的备份, 但实际上不是这样的, 是逢3/5/7这3个数字的幂次方的group才有super block, 其他的group是没有的.
int ext2_bg_has_super(struct super_block *sb, int group)
{
//如果有super稀少属性,那么就进一步测试哪些组有,哪些组没有
// 0-1000中
// 0,1, 3^0=1,5^0=1,7^0=1
// 3,5,7, 3^1=3,5^1=5,7^1=7
// 9,25,27,49,81 3^2=9,5^2=25,3^3=27,7^2=49,3^4=81
// 125,243,343,625,729有 5^3=125,3^5=243,7^3=343,5^4=625,3^6=729
if (EXT2_HAS_RO_COMPAT_FEATURE(sb,EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER)&&
!ext2_group_sparse(group))
return 0;
return 1;
}
static inline int test_root(int a, int b)
{
int num = b;
while (a > num)
num *= b;
return num == a;
}
static int ext2_group_sparse(int group)
{
if (group <= 1)
return 1;
return (test_root(group, 3) || test_root(group, 5) ||
test_root(group, 7));
}
Q: symlink的name不超过60个字符的话, 直接保存在inode里面, 不再占用额外的block保存, 否则要占一个block去保存
Q: xattr的属性, 需要额外的block去保存(这样不是很浪费?)
A: 不是一个文件就对应一个block去保存xattr, 而是将xattr按链表的方式放在有限个(是1个吗?)block中, 相同xattr属性的文件共享xattr, 见ULK 18.2.4
Q: ext2的目录项的大小有限制吗? 存储位置在哪里? 和FAT32的有什么区别?
A: 目录也是inode, 就有相应的存储的block, block里面的数据就是存储的目录项, 大小限制和普通文件的限制是一样的.
FAT32同理, 目录项就是存储在相应的簇里面, 由簇链维护.
文件夹的创建分配策略:
1.根目录下的文件(夹)应该分散在各个group中,需要新增的话,则看哪个group里面剩余的inode数超过平均inode数, 有的话就选这个group,
如果inode都不多了, 就看哪个group剩余的block比较多
2.文件尽可能创建在所在文件夹的group里面, 除非
a.group里面已经有太多的目录(>best_ndir)
b.group里面的free inode数目小于平均值
c.group里面的free block数目小于平均值
3.如果2不满足的话,退一步,从父目录所在的group开始找,找到剩余inode数大于平均剩余inode数的group就停止
文件的分配策略:
1.只要父目录所在group有剩余inode,就放在这个group里面
2.如果1不符合,就从父目录所在group(假设x)开始,执行对数查找(x+1+2+4 mod n),只要有剩余的inode就ok
3.如果对数查找失败,就线性查找,每个group挨个搜索过去,有free inode的就返回
相关数据结构图(图片来自网络, 以上文字属于原创)
0 0
- EXT2文件系统的一点思考和小结
- Linux ext2文件系统小结
- 关于程序员的一点思考和近期学习小结
- ext2和ext3文件系统
- 看《现代操作系统》文件系统的一点思考
- EXT4文件系统代码阅读的一点思考
- Linux的Ext2文件系统
- Linux的Ext2文件系统
- Linux的Ext2文件系统
- linux的Ext2文件系统
- ext2和ext3文件系统知识
- Linux中的文件系统以及ext2和ext3的区别
- Ext2 文件系统的硬盘布局
- Ext2 文件系统的硬盘布局
- Ext2 文件系统的硬盘布局
- ext2文件系统的super操作方法
- Linux的标准文件系统----EXT2
- Ext2 文件系统的硬盘布
- java单例模式
- C++中引用与指针的区别(详细介绍)
- BarbuttonItem 图片颜色蓝色
- 2015大型互联网公司校招都开始了,薪资你准备好了嘛?
- 做程序员要明白的一个道理.
- EXT2文件系统的一点思考和小结
- cuda的计时技术
- 大牛讲解信号与系统
- 业务监控
- 如何编写Linux设备驱动程序
- 刘强东:京东不是快递公司 但物流作用显而易见
- Java包的概念及访问修饰符
- STL源码剖析---红黑树原理详解上(hackbutter)
- Android之Handler用法总结