在分析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