diff --git a/delog/common.cpp b/delog/common.cpp index e7bdc6d..28d7afd 100644 --- a/delog/common.cpp +++ b/delog/common.cpp @@ -2,7 +2,7 @@ std::vector split(const std::string& s, char sp) { - int i = 0, l = 0; + size_t i = 0, l = 0; std::vector res; while (i < s.size()) { if (s[i] == sp) { diff --git a/delog/delog.cpp b/delog/delog.cpp index 7e6f17b..ff0d351 100644 --- a/delog/delog.cpp +++ b/delog/delog.cpp @@ -253,7 +253,7 @@ _print_debug_CON: default: fprintf(stderr, "Unknown fmt %c\n", fmt[0]); } -_print_debug_END: +// _print_debug_END: return ; } @@ -323,7 +323,7 @@ _I print_bin(_s s, _I size, _u8 *p, _I len) { if ((i & _BITS_MASK(LINEBSIZE)) == 0) { last_i = LINENUM; if (j > 0 && j < LINENUM + 1) { - for (int t = 0; t < LINENUM - j; t++) + for (_u32 t = 0; t < LINENUM - j; t++) fmt_dot(s, n); last_i = j; } @@ -348,7 +348,7 @@ _I print_bin(_s s, _I size, _u8 *p, _I len) { if (len) { last_i = LINENUM; if (j > 0 && j < LINENUM + 1) { - for (int t = 0; t < LINENUM - j; t++) + for (_u32 t = 0; t < LINENUM - j; t++) fmt_dot(s, n); last_i = j; } diff --git a/fs/ext2/ext2_dentry.cpp b/fs/ext2/ext2_dentry.cpp index 70a1dde..c02403e 100644 --- a/fs/ext2/ext2_dentry.cpp +++ b/fs/ext2/ext2_dentry.cpp @@ -49,7 +49,7 @@ void EXT2_DEntry::load_children() { dev->read(buf, data_block_pos, ext2_fs->block_size); // _sa(buf.data, ext2_fs->block_size); _u32 s_pos = 0; - _u32 next_length = 12; + // _u32 next_length = 12; while (all_length < ext2_inode->size) { // _sa(buf.data + s_pos, 20); memmove(temp_str, buf.data + s_pos, sizeof(DirEntry)); @@ -397,5 +397,9 @@ VFS::DEntry *EXT2_DEntry::follow() { EXT2_DEntry::~EXT2_DEntry() { delete inode; + for (auto x: children) { + if (x->name != ".." && x->name != ".") + delete x; + } } diff --git a/fs/ext2/ext2_file.cpp b/fs/ext2/ext2_file.cpp index b73eb4b..3f1e516 100644 --- a/fs/ext2/ext2_file.cpp +++ b/fs/ext2/ext2_file.cpp @@ -66,7 +66,7 @@ int EXT2_File::read(char *buf, int len) { ext2_fs->dev->read(buff, pos_in_fs, block_size); // 从第一个块读入数据,每次都读出一整块 memcpy(buf, buff.data + byte_in_block, std::min((_u32)len, block_size - byte_in_block)); read_len = std::min((_u32)len, block_size - byte_in_block); - while (read_len < len && pos + read_len < size) { + while (read_len < (_u32)len && pos + read_len < (_u32)size) { it++; // 指向下一个块 block_n = *it; // 下一个块号 pos_in_fs = ext2_fs->block_to_pos(block_n); // 下一个块的位置 @@ -95,7 +95,7 @@ int EXT2_File::write(const char *buf, int len) { memcpy(buff.data, buf, this_write_len); ext2_fs->dev->write(buff, pos_in_fs + byte_in_block, this_write_len); // 向第一个块写数据 write_len = this_write_len; - while (write_len < len) { + while (write_len < (_u32)len) { it++; // 指向下一个块 block_n = *it; // 下一个块号,其实这里可以自动分配空间,不用resize pos_in_fs = ext2_fs->block_to_pos(block_n); // 下一个块的位置 diff --git a/fs/ext2/ext2_fs.cpp b/fs/ext2/ext2_fs.cpp index 5621885..31f3fc7 100644 --- a/fs/ext2/ext2_fs.cpp +++ b/fs/ext2/ext2_fs.cpp @@ -99,7 +99,7 @@ void EXT2_FS::mount() { // dev->seek(block_size + 1024); // 指向GDT _u32 read_pos = block_size + 1024; group_cnt = sb->inodes_count / sb->inodes_per_group; - for (int i = 0; i < group_cnt; i++) { + for (_u32 i = 0; i < group_cnt; i++) { GroupDescriptor* gtp = new GroupDescriptor(); dev->read(sb_buf, read_pos, sizeof(GroupDescriptor)); memmove(gtp, sb_buf.data, sizeof(GroupDescriptor)); @@ -118,7 +118,7 @@ void EXT2_FS::mount() { // dev->read(sb_buf, sizeof(Inode)); // Inode* root_inode = new Inode(); // memmove(root_inode, sb_buf.data, sizeof(Inode)); - _u32 root_inode_pos = gdt_list.front()->get_gd()->inode_table; + // _u32 root_inode_pos = gdt_list.front()->get_gd()->inode_table; EXT2_DEntry* ext2_entry = new EXT2_DEntry(this, nullptr, 2, VFS::Directory, "/"); root = ext2_entry; // ext2_entry->inflate(); @@ -183,7 +183,7 @@ void EXT2_FS::write_super() { _u32 super_pos = 1; // super block MM::Buf buf(sizeof(SuperBlock)); memcpy(buf.data, sb, sizeof(SuperBlock)); - for (EXT2_GD *x: gdt_list) { + for (size_t i = 0; i < gdt_list.size(); i++) { dev->write(buf, block_to_pos(super_pos), sizeof(SuperBlock)); super_pos += sb->blocks_per_group; } @@ -201,7 +201,7 @@ void EXT2_FS::write_gdt() { x->write_inode_bitmap(); x->write_block_bitmap(); } - for (EXT2_GD *x: gdt_list) { + for (size_t i = 0; i < gdt_list.size(); i++) { dev->write(buf, block_to_pos(super_pos), sizeof(GroupDescriptor)); super_pos += sb->blocks_per_group; } @@ -222,4 +222,5 @@ EXT2_FS::~EXT2_FS() { delete x; } delete sb; + delete root; } diff --git a/fs/ext2/ext2_group_descriptor.cpp b/fs/ext2/ext2_group_descriptor.cpp index 016c8d2..05fe8c2 100644 --- a/fs/ext2/ext2_group_descriptor.cpp +++ b/fs/ext2/ext2_group_descriptor.cpp @@ -49,7 +49,7 @@ _u32 EXT2_GD::alloc_inode() { if (gd->free_inodes_count == 0) return 0; get_inode_bitmap(); - for (int i = 0; i < fs->block_size; i++) { + for (_u32 i = 0; i < fs->block_size; i++) { if (inode_bitmap[i] != (_u8)0xff) { int t = lowest_0(inode_bitmap[i]); _set_bit(inode_bitmap[i], t); @@ -65,7 +65,7 @@ _u32 EXT2_GD::alloc_block() { if (gd->free_blocks_count == 0) return 0; get_block_bitmap(); - for (int i = 0; i < fs->block_size; i++) { + for (_u32 i = 0; i < fs->block_size; i++) { if (block_bitmap[i] != (_u8)0xff) { int t = lowest_0(block_bitmap[i]); _set_bit(block_bitmap[i], t); diff --git a/fs/ext2/ext2_inode.cpp b/fs/ext2/ext2_inode.cpp index 14e9831..4e68b53 100644 --- a/fs/ext2/ext2_inode.cpp +++ b/fs/ext2/ext2_inode.cpp @@ -26,7 +26,7 @@ void EXT2_Inode::print() { cerr << "目录访问控制列表 " << i->dir_acl << endl; cerr << "片地址 " << i->faddr << endl; cerr << "数据块指针 "; - for (int j = 0; j < min(blocks, (_u32)15); j++) + for (_u32 j = 0; j < min(blocks, (_u32)15); j++) cerr << i->block[j] << " "; cerr << endl; } @@ -317,7 +317,7 @@ EXT2_Inode::iterator::operator==(const iterator& ano) const { _error(inode != ano.inode); if (ano.index_cnt != index_cnt || ano.level != level) return false; - for (_u32 i = 0; i < level; i++) { + for (int i = 0; i < level; i++) { if (indexs[i] != ano.indexs[i]) return false; } diff --git a/fs/test_fs.cpp b/fs/test_fs.cpp index 05a1936..b798fe4 100644 --- a/fs/test_fs.cpp +++ b/fs/test_fs.cpp @@ -251,6 +251,7 @@ VFS::DEntry *mount(VFS::DEntry *cwd, const std::vector& cmdd) { FS* new_fs = new EXT2::EXT2_FS(d); new_fs->mount(); new_fs->root->load_children(); + new_fs->root->parent = mnt_e->parent; // mnt_e->inode = new_fs->root->inode; // mnt_e->children = new_fs->root->children; new_fs->root->name = mnt_e->name; @@ -259,6 +260,22 @@ VFS::DEntry *mount(VFS::DEntry *cwd, const std::vector& cmdd) { return cwd; } +VFS::DEntry *umount(VFS::DEntry *cwd, const std::vector& cmdd) { + using namespace VFS; + NameI *dir = VFS::NameI::from_str(cmdd[cmdd.size() - 1]); + DEntry *mnt_e = cwd->get_child(dir); + if (mnt_e == nullptr) { + std::cout << "no such diectory " << cmdd[cmdd.size() - 1] << std::endl; + return cwd; + } + DEntry *t = mnt_e->parent; + t->children.clear(); + t->load_children(); + mnt_e->fs->dev->close(); + delete mnt_e->fs; + return cwd; +} + OP ops[] = { {"ls", ls}, {"cd", cd}, @@ -271,6 +288,7 @@ OP ops[] = { {"cp", cp}, {"ln", symlink}, {"mount", mount}, + {"umount", umount}, {"unknown", nullptr} }; diff --git a/fs/vfs.cpp b/fs/vfs.cpp index 8e00b67..6c43bba 100644 --- a/fs/vfs.cpp +++ b/fs/vfs.cpp @@ -138,9 +138,6 @@ VFS::NameI *VFS::NameI::from_str(const std::string& path) { } _pos(); return ans; -error: - delete ans; - return nullptr; } _u8 VFS::mode_to_type(_u8 mode) { diff --git a/fs/vfs.h b/fs/vfs.h index ded27c1..2b21b29 100644 --- a/fs/vfs.h +++ b/fs/vfs.h @@ -98,6 +98,9 @@ namespace VFS DEntry *get_path(const NameI *namei, std::string* fname=nullptr); std::string printed_path(); + + + virtual ~DEntry() {} }; enum { @@ -107,7 +110,7 @@ namespace VFS class FS { public: - Dev::BlockDevice* dev; // 设备 + Dev::BlockDevice* dev=nullptr; // 设备 // _u32 flag; // 安装标志 _u32 magic; // 文件系统标志 @@ -142,11 +145,12 @@ namespace VFS _u8 sock; // 如果文件是一个socket则为0 int lock; // 自旋锁 - FS* fs; + FS* fs=nullptr; public: - Inode(FS* fs1):fs(fs1), dev(fs1->dev) {} + Inode(FS* fs1):dev(fs1->dev), fs(fs1) {} // 将Inode标记为脏,找时机写回设备 virtual void dirty()=0; + virtual ~Inode() {} }; @@ -164,6 +168,9 @@ namespace VFS virtual int read(char*, int size)=0; virtual int write(const char*, int size)=0; virtual void close(); + + virtual ~File() {} + }; _u8 mode_to_type(_u8 mode); diff --git a/include/bits.h b/include/bits.h index 567b2b8..2db56d7 100644 --- a/include/bits.h +++ b/include/bits.h @@ -12,7 +12,7 @@ #define _lshf(a, n) ((a) >> (n)) #define _Lclr(a, n) ((a) & (~(_BITS_MASK(n)))) #define _Hclr(a, n) _rshf(_lshf(a, n), n) -#define _LNclr(a, n) ((a & (_BITS_MASK(n)))) +#define _LNclr(a, n) (((a) & (_BITS_MASK(n)))) #include "types.h" diff --git a/makefile b/makefile index 4ac346d..fbcd015 100644 --- a/makefile +++ b/makefile @@ -14,7 +14,9 @@ INC_FLAG = $(addprefix -I, $(INC_PATH)) DEFINES = DEBUG DEF_FLAG = $(addprefix -D, $(DEFINES)) -CC_FLAG = $(INC_FLAG) $(DEF_FLAG) +OTH_FLAG = -Werror -Wall + +CC_FLAG = $(INC_FLAG) $(DEF_FLAG) $(OTH_FLAG) # MAIN_NAME = config/test_config # OBJ_FILE= $(addsuffix .o, $(addprefix $(OBJ_PATH)/, $(SRC_NAME)))