⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 super.c.txt

📁 linux内核学习笔记 希望想看的人可以很快下载到
💻 TXT
字号:
any problems,send mails to sindybear@163.com


相关文件

//这是超级块的基本处理函数集,主要处理超级块的读,写,和相应的inode的读写
static struct super_operations ext2_sops = {
        read_inode:     ext2_read_inode,	//主要处理从磁盘的相应位置读出inode
        write_inode:    ext2_write_inode,
        put_inode:      ext2_put_inode,
        delete_inode:   ext2_delete_inode,
        put_super:      ext2_put_super,
        write_super:    ext2_write_super,
        statfs:         ext2_statfs,
        remount_fs:     ext2_remount,
};

	

***************************基本数据结构*************************************
(1)struct super_block * ext2_read_super (struct super_block * sb, void * data,int silent)

	unsigned long sb_block = 1;	//这是读超级块的开始位置,因为0块是引导纪录

        blocksize = get_hardsect_size(dev);	//从设备读出块大小
        if(blocksize < BLOCK_SIZE )		//如果设备上的必默认的块大小小	
            blocksize = BLOCK_SIZE;		//就是用默认的值

	bh = sb_bread(sb, logic_sb_block)	//从磁盘上读出ext2文件系统的超级块
	es = (struct ext2_super_block *) (((char *)bh->b_data) + offset);//转变成超级块
	sb->u.ext2_sb.s_es = es;		//存到vfs超级块中u域中的相应位置,并没有把buffer都放在这里
	……					//对vfs的超级块sb进行设置
	
	sb->s_blocksize_bits =			//大小以1K来计算。
                le32_to_cpu(EXT2_SB(sb)->s_es->s_log_block_size) + 10;
        sb->s_blocksize = 1 << sb->s_blocksize_bits;	
	sb->s_maxbytes = ext2_max_size(sb->s_blocksize_bits);	//文件的最大长度
	
	if (sb->s_blocksize != blocksize)	//如果设备的块不符合的话,重新读(?)
		……				//重新对sb->u.ext2_sb.s_es进行设置

	……	//使用从磁盘上读出来的超级块(存在es中)对vfs中的u域中的ext2_sb_info进行设置

	sb->u.ext2_sb.s_groups_count = (le32_to_cpu(es->s_blocks_count) -
                                        le32_to_cpu(es->s_first_data_block) +
                                       EXT2_BLOCKS_PER_GROUP(sb) - 1) /
                                       EXT2_BLOCKS_PER_GROUP(sb);
        db_count = (sb->u.ext2_sb.s_groups_count + EXT2_DESC_PER_BLOCK(sb) - 1) / EXT2_DESC_PER_BLOCK(sb);
	for (i = 0; i < db_count; i++) {
                sb->u.ext2_sb.s_group_desc[i] = sb_bread(sb, logic_sb_block + i + 1);
	}	//计算组的数目,对ext2文件系统中的组进行设置

	//清空inode等数据结构
	for (i = 0; i < EXT2_MAX_GROUP_LOADED; i++) {
	 sb->u.ext2_sb.s_inode_bitmap_number[i] = 0;
	 sb->u.ext2_sb.s_inode_bitmap[i] = NULL;
	 sb->u.ext2_sb.s_block_bitmap_number[i] = 0;
                sb->u.ext2_sb.s_block_bitmap[i] = NULL;
        }
        sb->u.ext2_sb.s_loaded_inode_bitmaps = 0;
        sb->u.ext2_sb.s_loaded_block_bitmaps = 0;
        sb->u.ext2_sb.s_gdb_count = db_count;

        ext2_setup_super (sb, es, sb->s_flags & MS_RDONLY);//进行监测,如果必要的话写回到磁盘
	return sb;	//返回生成的vfs超级块
	

(2)static loff_t ext2_max_size(int bits)
	//计算返回一个文件最大的长度,按照一级,二级,三级指针来进行计算,但ext2还有一些别的限制
	

(3)static int ext2_setup_super (struct super_block * sb,
                              struct ext2_super_block * es,
                              int read_only)
	……	//对sb进行检测
	
	ext2_write_super(sb);	//

(4)void ext2_write_super (struct super_block * sb)
	if (le16_to_cpu(es->s_state) & EXT2_VALID_FS)	//如果状态是有效的
		es->s_state = cpu_to_le16(le16_to_cpu(es->s_state) & ~EXT2_VALID_FS);	//把超级块的valid属性设置为0
		ext2_sync_super(sb, es);
	else
		ext2_commit_super (sb, es);
	
	sb->s_dirt = 0;		//设置脏属性

(5)static void ext2_sync_super(struct super_block *sb, struct ext2_super_block *es)
	mark_buffer_dirty(EXT2_SB(sb)->s_sbh);		//对超级块所在的buffer标志为脏
        ll_rw_block(WRITE, 1, &EXT2_SB(sb)->s_sbh);	//把这个buffer写到磁盘上
	

(6)static void ext2_commit_super (struct super_block * sb,struct ext2_super_block * es)
	mark_buffer_dirty(sb->u.ext2_sb.s_sbh);		//只把这个buffer标志为脏,由系统来决定什么时候写

****************************************************************************


*****************************初始化函数*************************************
//声明一个文件系统类型,其中很重要的就一个超级块的读取函数,这个函数负责把超级块从设备上读到内存
static DECLARE_FSTYPE_DEV(ext2_fs_type, "ext2", ext2_read_super);

(1)static int __init init_ext2_fs(void)
	return register_filesystem(&ext2_fs_type);	//象系统注册一个文件系统

(2)static void __exit exit_ext2_fs(void)
	//注销一个文件系统
****************************************************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -