专栏首页悟空被FFmpeg玩Linux中文件系统注册及mount过程分析5

Linux中文件系统注册及mount过程分析5

通过这个fill_super来进行读读块设备

2545 static int ext4_fill_super(struct super_block *sb, void *data, intsilent)2546 __releases(kernel_lock)2547 __acquires(kernel_lock)2548 {2549 char *orig_data = kstrdup(data, GFP_KERNEL);2550 struct buffer_head *bh;2551 struct ext4_super_block *es = NULL;2552 struct ext4_sb_info *sbi;2553 ext4_fsblk_t block;2554 ext4_fsblk_t sb_block = get_sb_block(&data);2555 ext4_fsblk_t logical_sb_block;2556 unsigned long offset = 0;……2580 }2581 sb->s_fs_info = sbi;2582 sbi->s_mount_opt = 0;2583 sbi->s_resuid = EXT4_DEF_RESUID;2584 sbi->s_resgid = EXT4_DEF_RESGID;2585 sbi->s_inode_readahead_blks = EXT4_DEF_INODE_READAHEAD_BLKS;2586 sbi->s_sb_block = sb_block;2587 if (sb->s_bdev->bd_part)2588 sbi->s_sectors_written_start =2589 part_stat_read(sb->s_bdev->bd_part, sectors[1]);25902591 unlock_kernel();25922593 /* Cleanup superblock name */2594 for (cp = sb->s_id; (cp = strchr(cp, '/'));)2595 *cp = '!';25962597 ret = -EINVAL;2598 blocksize = sb_min_blocksize(sb, EXT4_MIN_BLOCK_SIZE);2599 if (!blocksize) {2600 ext4_msg(sb, KERN_ERR, "unable to set blocksize");2601 goto out_fail;2602 }26032604 /*2605 * The ext4 superblock will not be buffer aligned for other than 1kB2606 * block sizes. We need to calculate the offset from buffer start.2607 */2608 if (blocksize != EXT4_MIN_BLOCK_SIZE) {2609 logical_sb_block = sb_block * EXT4_MIN_BLOCK_SIZE;2610 offset = do_div(logical_sb_block, blocksize);2611 } else {2612 logical_sb_block = sb_block;2613 }26142615 if (!(bh = sb_bread(sb, logical_sb_block))) {2616 ext4_msg(sb, KERN_ERR, "unable to read superblock");2617 goto out_fail;2618 }……2649 if ((def_mount_opts & EXT4_DEFM_JMODE) == EXT4_DEFM_JMODE_DATA)2650 set_opt(sbi->s_mount_opt, JOURNAL_DATA);2651 else if ((def_mount_opts & EXT4_DEFM_JMODE) == EXT4_DEFM_JMODE_ORDERED)2652 set_opt(sbi->s_mount_opt, ORDERED_DATA);2653 else if ((def_mount_opts & EXT4_DEFM_JMODE) == EXT4_DEFM_JMODE_WBACK)2654 set_opt(sbi->s_mount_opt, WRITEBACK_DATA);26552656 if (le16_to_cpu(sbi->s_es->s_errors) == EXT4_ERRORS_PANIC)2657 set_opt(sbi->s_mount_opt, ERRORS_PANIC);2658 else if (le16_to_cpu(sbi->s_es->s_errors) == EXT4_ERRORS_CONTINUE)2659 set_opt(sbi->s_mount_opt, ERRORS_CONT);2660 else2661 set_opt(sbi->s_mount_opt, ERRORS_RO);2662 if (def_mount_opts & EXT4_DEFM_BLOCK_VALIDITY)2663 set_opt(sbi->s_mount_opt, BLOCK_VALIDITY);2664 if (def_mount_opts & EXT4_DEFM_DISCARD)2665 set_opt(sbi->s_mount_opt, DISCARD);……2931 * set up enough so that it can read an inode2932 */2933 if (!test_opt(sb, NOLOAD) &&2934 EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_HAS_JOURNAL))2935 sb->s_op = &ext4_sops;2936 else2937 sb->s_op = &ext4_nojournal_sops;2938 sb->s_export_op = &ext4_export_ops;2939 sb->s_xattr = ext4_xattr_handlers;2940 #ifdef CONFIG_QUOTA2941 sb->s_qcop = &ext4_qctl_operations;2942 sb->dq_op = &ext4_quota_operations;2943 #endif……3052 root = ext4_iget(sb, EXT4_ROOT_INO);3053 if (IS_ERR(root)) {3054 ext4_msg(sb, KERN_ERR, "get root inode failed");3055 ret = PTR_ERR(root);3056 goto failed_mount4;3057 }3058 if (!S_ISDIR(root->i_mode) || !root->i_blocks || !root->i_size) {3059 iput(root);3060 ext4_msg(sb, KERN_ERR, "corrupt root inode, run e2fsck");3061 goto failed_mount4;3062 }3063 sb->s_root = d_alloc_root(root);3064 if (!sb->s_root) {3065 ext4_msg(sb, KERN_ERR, "get root dentry failed");3066 iput(root);3067 ret = -ENOMEM;3068 goto failed_mount4;3069 }30703071 ext4_setup_super(sb, es, sb->s_flags & MS_RDONLY);3072

这些介绍了从读超级快,获得磁盘的块的属性,然后进行了sops注册,然后进入ext4_iget进行了文件操作,目录操作,链接操作等函数的注册,比如读文件

然后回到do_new_mount,将挂载点添加到列表里就可以了,这个列表在/proc中可以展现出来

[root@T-bagwell ~]# cat /proc/mountsrootfs / rootfs rw 0 0/dev/root / ext4 rw,relatime,barrier=1,data=ordered 0 0/dev /dev tmpfs rw,relatime,mode=755 0 0/proc /proc proc rw,relatime 0 0/sys /sys sysfs rw,relatime 0 0/proc/bus/usb /proc/bus/usb usbfs rw,relatime 0 0devpts /dev/pts devpts rw,relatime,gid=5,mode=620,ptmxmode=000 0 0none /proc/sys/fs/binfmt_misc binfmt_misc rw,relatime 0 0sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw,relatime 0 0/dev/sdb1 /media/android ext4 rw,relatime,barrier=1,data=ordered 0 0[root@T-bagwell ~]#

到这里文件系统的注册和磁盘的挂载完成

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • LPI学习-----3

    用户3765803
  • git pull遇到了一个问题

    [root@1jjk ext4]# git pull You are in the middle of a conflicted merge. [root@1j...

    用户3765803
  • 使用git加管道操作

    #   (use "git add ..." to update what will be committed)

    用户3765803
  • excel数据分析工具库系列四|假设检验

    今天要跟大家分享的是excel数据分析工具库系列四——假设检验! 一共会讲到关于假设检验的5个知识点: Z-检验:双样本均值差检验 T-检验:平均值的成对二样本...

    数据小磨坊
  • Leetcode 98 Validate Binary Search Tree

    Given a binary tree, determine if it is a valid binary search tree (BST). Assu...

    triplebee
  • 3.shell编程-文件查找之find命令

    搜索/home/shell_learn/下的文件,文件名以.sh结尾,且修改时间在一个星期之内的,然后将其删除

    zhang_derek
  • 数据结构与算法-树

    cwl_java
  • Filebeat自定义pipeline,完美处理自定义日志字段

    filebeat是本地文件日志数据采集器,通常用作ELK中的日志采集,将采集的日志数据传输到elasticsearch,当需要进行数据处理时,先传入logsta...

    李俊鹏
  • Open3d 学习计划—9(ICP配准)

    Open3D是一个开源库,支持快速开发和处理3D数据。Open3D在c++和Python中公开了一组精心选择的数据结构和算法。后端是高度优化的,并且是为并行化而...

    点云PCL博主
  • SQL优化器简介

    我们在工作中经常会听到这样的声音:“SQL查询慢?你给数据库加个索引啊”。虽然加索引并不一定能解决问题,但是这初步的体现了SQL优化的思想。

    叁金

扫码关注云+社区

领取腾讯云代金券