Skip to content

Commit

Permalink
修复严重bug: 格式化时未建立根目录
Browse files Browse the repository at this point in the history
  • Loading branch information
frapples committed Dec 20, 2016
1 parent 284ec55 commit 35d6a22
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 8 deletions.
7 changes: 7 additions & 0 deletions fulfs/file_dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -409,6 +409,13 @@ fulfs_dir_t* fulfs_opendir(device_handle_t device, fulfs_filesystem_t* fs, const

bool fulfs_readdir(fulfs_dir_t* dir, char* name)
{
assert(base_file_size(&dir->base_file) % DIR_ITEM_SIZE == 0);

if (base_file_tell(&dir->base_file) >= base_file_size(&dir->base_file)) {
name[0] = '\0';
return true;
}

char buf[DIR_ITEM_SIZE];
int count = base_file_read(&dir->base_file, buf, DIR_ITEM_SIZE);
if (count != DIR_ITEM_SIZE) {
Expand Down
17 changes: 15 additions & 2 deletions fulfs/filesystem.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include "inode.h"
#include "superblock.h"
#include "data_block.h"
#include "base_file.h"

#include "../utils/math.h"
#include "../utils/log.h"
Expand Down Expand Up @@ -49,11 +50,23 @@ fulfs_errcode_t fulfs_format(device_handle_t device, int sectors_per_block)
return FULFS_FAIL;
}

/* 建立根目录 */
superblock_t temp_sb;
superblock_create(&temp_sb, device_section_count(device), sectors_per_block,
inode_table, data_block, data_block_free_stack, 0);
inode_no_t root_dir;
success = base_file_create(device, &temp_sb, MODE_DIR, &root_dir);
if (!success) {
return FULFS_FAIL;
}



/* 写入superblock */
superblock_t sb;
superblock_create(&sb, device_section_count(device), sectors_per_block,
inode_table, data_block, data_block_free_stack);
inode_table, data_block, data_block_free_stack, root_dir);

/* 写入superblock */
if (!superblock_dump(device, &sb)) {
log_debug("superblock写入失败: %d号设备", device);
return FULFS_FAIL;
Expand Down
4 changes: 2 additions & 2 deletions fulfs/superblock.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,15 +26,15 @@ void superblock_load_from_bin(const char* bin, superblock_t* sb)
}

void superblock_create(superblock_t* sb, sector_no_t sectors, int sectors_per_block,
block_no_t inode_table, block_no_t data_block, block_no_t data_block_free_stack)
block_no_t inode_table, block_no_t data_block, block_no_t data_block_free_stack, inode_no_t root_inode)
{
sb->sectors = sectors;
sb->sectors_per_block = sectors_per_block;

sb->total_size = ((sb->sectors / sb->sectors_per_block) - data_block) * (BYTES_PER_SECTOR * sb->sectors_per_block);
sb->used_size = 0;

sb->root_dir = 0;
sb->root_dir = root_inode;
sb->inode_table_block = inode_table;
sb->data_block = data_block;
sb->data_block_free_stack = data_block_free_stack;
Expand Down
2 changes: 1 addition & 1 deletion fulfs/superblock.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ void superblock_load_from_bin(const char* bin, superblock_t* sb);

/* 给一个新的文件系统初始化superblock */
void superblock_create(superblock_t* sb, sector_no_t sectors, int sectors_per_block,
block_no_t inode_table, block_no_t data_block, block_no_t data_block_free_stack);
block_no_t inode_table, block_no_t data_block, block_no_t data_block_free_stack, inode_no_t root_inode);


/* 从磁盘加载superblock */
Expand Down
22 changes: 19 additions & 3 deletions test.c
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,11 @@ bool test_format(void)
dev_inode_ctrl_t dev_inode_ctrl;
dev_inode_ctrl_init_from_superblock(&dev_inode_ctrl, device, &sb);
inode_t inode;
for (inode_no_t i = 0; i < INODE_MAX_COUNT; i++) {

TEST_ASSERT(inode_load(&dev_inode_ctrl, 0, &inode));
TEST_ASSERT(inode.mode == MODE_DIR);

for (inode_no_t i = 1; i < INODE_MAX_COUNT; i++) {
TEST_ASSERT(inode_load(&dev_inode_ctrl, i, &inode));
TEST_ASSERT(inode.mode == 0);
}
Expand Down Expand Up @@ -166,10 +170,22 @@ bool test_fs(void)
TEST_ASSERT(fd != FS_ERROR);
fs_close(fd);


fd = fs_open("A:/text2.txt");
TEST_ASSERT(fd != FS_ERROR);
fs_close(fd);

fd = fs_open("A:/text3.txt");
TEST_ASSERT(fd != FS_ERROR);
fs_close(fd);

FS_DIR* dir = fs_opendir("A:/");
char name[30];
fs_readdir(dir, name);
printf("%s\n", name);
do {
fs_readdir(dir, name);
printf("%s\n", name);
}while (name[0] != '\0');

fs_closedir(dir);


Expand Down

0 comments on commit 35d6a22

Please sign in to comment.