前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux中文件系统注册及mount过程分析5

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

作者头像
用户3765803
发布2019-03-05 10:03:33
2K0
发布2019-03-05 10:03:33
举报
文章被收录于专栏:悟空被FFmpeg玩

通过这个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 ~]#

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2010/08/13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档