慢慢欣赏linux ext3文件系统 理解buffer_head域成员b_size

在分析ext2_get_block的时候,发现里面使用一个变量bh_result->b_size,这个值是多少呢,注释很简单:size of mapping

int ext2_get_block(struct inode *inode, sector_t iblock, struct buffer_head *bh_result, int create)
{
	unsigned max_blocks = bh_result->b_size >> inode->i_blkbits;
	int ret = ext2_get_blocks(inode, iblock, max_blocks,
			      bh_result, create);
	if (ret > 0) {
		bh_result->b_size = (ret << inode->i_blkbits);
		ret = 0;
	}
	return ret;

}

下面从函数流程分析这个值是怎么来的,实际代码是从最后追溯到第一个函数

struct buffer_head *
sb_bread(struct super_block *sb, sector_t block)
{
	/*sb->s_blocksize是超级块里面定义,也就是extX文件系统数据块的大小*/
	return __bread(sb->s_bdev, block, sb->s_blocksize);
	=>struct buffer_head *
	__bread(struct block_device *bdev, sector_t block, unsigned size)
	{
		struct buffer_head *bh = __getblk(bdev, block, size);
		=>struct buffer_head *
		__getblk(struct block_device *bdev, sector_t block, unsigned size)
		{
			bh = __getblk_slow(bdev, block, size);
			=>struct buffer_head *
			__getblk_slow(struct block_device *bdev, sector_t block, int size)
			{
				/*这里定义了size必须至少大于等于512字节,小于4K一个页面大小
				  更加坐实了就是文件系统数据块*/
				/* Size must be multiple of hard sectorsize */
				if (unlikely(size & (bdev_logical_block_size(bdev)-1) ||
						(size < 512 || size > PAGE_SIZE))) {
					printk(KERN_ERR "getblk(): invalid block size %d requested\n",
								size);
					printk(KERN_ERR "logical block size: %d\n",
								bdev_logical_block_size(bdev));

					dump_stack();
					return NULL;
				}
				
				ret = grow_buffers(bdev, block, size);
				=>int
				grow_buffers(struct block_device *bdev, sector_t block, int size)
				{
					/* Create a page with the proper size buffers.. */
					page = grow_dev_page(bdev, block, index, size);
					=>struct page *
					grow_dev_page(struct block_device *bdev, sector_t block,
							pgoff_t index, int size)
					{
						/*
						 * Allocate some buffers for this page
						 */
						bh = alloc_page_buffers(page, size, 0);
						=>struct buffer_head *alloc_page_buffers(struct page *page, unsigned long size,
							int retry)
						{
							bh->b_size = size;//将文件系统块的大小赋值给buffer_head的域成员size
						}
					}
				}
			}
		}
	}
}


对通用日志层JBD的理解
http://blog.chinaunix.net/uid-7494944-id-3833306.html

journal block device (jbd)源代码分析——ext3日志机制分析
http://bbs.chinaunix.net/thread-1922346-1-1.html

LINUX 文件系统JBD ----深入理解Fsync
https://www.cnblogs.com/zengkefu/p/5634898.html


ext2读取并产生间接块和数据块
https://blog.csdn.net/zouxiaoting/article/details/8943091

ext2_get_branch解析   好文
https://blog.csdn.net/kai_ding/article/details/9744091

EXT2 文件系统
https://www.cnblogs.com/alantu2018/p/8459905.html

寻找数据块【ext2_get_bloks】
https://blog.csdn.net/onlyg/article/details/6835022

Linux下磁盘保留空间的调整,解决df看到的空间和实际磁盘大小不一致的问题
http://blog.itpub.net/28904215/viewspace-1251725

Ext3文件系统 
http://blog.sina.com.cn/s/blog_879e61a00102vyj1.html

EXT2文件系统实现原理
https://blog.csdn.net/chenying126/article/details/77921542

Ext2文件系统详解
https://blog.csdn.net/guidao13/article/details/53862906/

ext2文件系统详解
https://blog.csdn.net/gongjiwei/article/details/82025142

ext2文件系统  文章不错
https://blog.csdn.net/Ajay666/article/details/75100538

ext2文件系统学习(一) 文章不错
https://www.cnblogs.com/sduzh/p/7056933.html

ext2文件系统读写过程解析
https://blog.csdn.net/gongjiwei/article/details/82154703

Ext3 mount过程分析
https://blog.51cto.com/alanwu/1105681

Ext3 mount过程分析
https://blog.51cto.com/alanwu/1105681

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值