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
原创粉丝点击