读情景分析文件系统一章文件读写处有疑问,请教各位
我在看情景分析文件读写一节时有问题,书中代码在607页
static int ext2_alloc_branch(struct inode *inode,
int num,
unsigned long goal,
int *offsets,
Indirect *branch)
{
int blocksize = inode->i_sb->s_blocksize;
int n = 0;
int err;
int i;
int parent = ext2_alloc_block(inode, goal, &err);
branch[0].key = cpu_to_le32(parent);
if (parent) for (n = 1; n < num; n++) {
struct buffer_head *bh;
/* Allocate the next block */
int nr = ext2_alloc_block(inode, parent, &err);//此处申请一磁盘块若是中间的映射 块则通过getblk()申请一缓冲区
if (!nr)
break;
branch[n].key = cpu_to_le32(nr);
/*
* Get buffer_head for parent block, zero it out and set
* the pointer to new one, then send parent to disk.
*/
bh = getblk(inode->i_dev, parent, blocksize);//为磁盘上起映射作用的块申请缓冲区
if (!buffer_uptodate(bh))
wait_on_buffer(bh);
memset(bh->b_data, 0, blocksize);//将缓冲区清0
branch[n].bh = bh;//情景分析上说从这开始的三行是设置缓冲区,可明明是设置Indirect结构,并没有设置缓冲区啊
branch[n].p = (u32*) bh->b_data + offsets[n];
*branch[n].p = branch[n].key;
mark_buffer_uptodate(bh, 1);
mark_buffer_dirty_inode(bh, inode);//标志为脏,准备写入磁盘,可我觉得这时候缓冲区还是空的啊 !!!
if (IS_SYNC(inode) || inode->u.ext2_i.i_osync) {
ll_rw_block (WRITE, 1, &bh);
wait_on_buffer (bh);
}
parent = nr;
}
if (n == num)
return 0;
/* Allocation failed, free what we already allocated */
for (i = 1; i < n; i++)
bforget(branch[i].bh);
for (i = 0; i < n; i++)
ext2_free_blocks(inode, le32_to_cpu(branch[i].key), 1);
return err;
}
不知道我的意思说明白没有,我觉得在这段代码里,缓冲区和磁盘块的确是申请了,可缓冲区的内容并没有得到设置,最终写入磁盘的页不是添上正确映射表的缓冲区内容。请各位指点!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
已经知道了,刚才看的太马虎了
branch[n].p = (u32*) bh->b_data + offsets[n]; 这里设置的