读情景分析文件系统一章文件读写处有疑问,请教各位

发布于 2022-07-24 15:56:47 字数 4256 浏览 11 评论 1

我在看情景分析文件读写一节时有问题,书中代码在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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

要走干脆点 2022-07-24 18:35:15

已经知道了,刚才看的太马虎了
branch[n].p = (u32*) bh->b_data + offsets[n]; 这里设置的

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文