rCore-Tutorial-Book-v3 icon indicating copy to clipboard operation
rCore-Tutorial-Book-v3 copied to clipboard

rCore-Tutorial-Book-v3/chapter7/2fs-implementation

Open utterances-bot opened this issue 4 years ago • 7 comments

简易文件系统 easy-fs — rCore-Tutorial-Book-v3 0.1 文档

https://rcore-os.github.io/rCore-Tutorial-Book-v3/chapter7/2fs-implementation.html

utterances-bot avatar Mar 12 '21 13:03 utterances-bot

改指针会被拷贝并传递给下层的数据结构

笔误了

每个目录项是目录下面的一个文件或子目录的文件名或目录名和它们所在的索引节点编号构成的二元组

这样的长难句理解起来非常困难...强烈建议多用短句,多用逗号

zhanghx0905 avatar Mar 12 '21 13:03 zhanghx0905

@zhanghx0905 多谢提醒,现在已经改成:

在我们的实现中,它可以看成一个目录项的序列,每个目录项都是一个二元组,二元组的首个元素是目录下面的一个文件(或子目录)的文件名(或目录名),另一个元素则是文件(或子目录)所在的索引节点编号。

wyfcyx avatar Mar 12 '21 13:03 wyfcyx

我理解的是文件索引 的find方法 就想对 fs 上锁,但是 _ 不会绑定右值的,不明白这样写目的何在?

参考依据 playground The Book

StrayLittlePunk avatar Apr 14 '21 10:04 StrayLittlePunk

@kaifoon 这里确实是我疏忽了,多谢指出!我验证了一下,单单用 _ 进行绑定的话,确实根本没有上锁。后续会将一系列的 _ 换成 _fs,之后修复。

wyfcyx avatar Apr 14 '21 11:04 wyfcyx

原文“为了实现 easy-fs-fuse 和 os/user 的解藕”应该是“解耦”。

yinhaoxuan avatar Apr 18 '21 11:04 yinhaoxuan

感觉EasyFileSystem::create这里有点问题:

let inode_area_blocks =
    ((inode_num * core::mem::size_of::<DiskInode>() + BLOCK_SZ - 1) / BLOCK_SZ) as u32;

这里看上去好像在说DiskInode可以跨块存储, 但是从

pub fn get_disk_inode_pos(&self, inode_id: u32) -> (u32, usize) {
        let inode_size = core::mem::size_of::<DiskInode>();
        let inodes_per_block = (BLOCK_SZ / inode_size) as u32;
        let block_id = self.inode_area_start_block + inode_id / inodes_per_block;
        (block_id, (inode_id % inodes_per_block) as usize * inode_size)
    }

来看, 并不能跨块存储

如果DiskInode的大小是512的因数, 就像目前的实现这样, 当然没问题, 而且DiskInode大小本来也应该是512的约数. 但我感觉EasyFileSystem::create这些写得不够严谨, 应该是:

let inode_size = core::mem::size_of::<DiskInode>();
let inodes_per_block = (BLOCK_SZ / inode_size) as u32;
let inode_area_blocks = (inode_num +  inodes_per_block - 1)/ inodes_per_block;

Tokubara avatar Apr 29 '21 01:04 Tokubara

@Tokubara 看上去确实如此,可以提个PR。不过需要等这学期结束之后才能合并了。

wyfcyx avatar Apr 29 '21 01:04 wyfcyx