diff --git a/source/fs/mufs/dir.c b/source/fs/mufs/dir.c index 9843761..dab058a 100644 --- a/source/fs/mufs/dir.c +++ b/source/fs/mufs/dir.c @@ -226,7 +226,6 @@ size_t read_dirent(struct mufs *fs, struct mufs_tree *tree, size_t write_dirent(struct mufs_tree *tree, uint32_t va, struct mufs_dirent *dirent) { - struct mufs_dtree dtree; struct mufs_dentry entry; entry.type = dirent->type; @@ -242,13 +241,10 @@ size_t write_dirent(struct mufs_tree *tree, if (mufs_tree_write(tree, &entry, va, sizeof entry) == 0) return 0; - tree->file_size = max(tree->file_size, va + sizeof entry + entry.path_len); + va += sizeof entry + entry.path_len; + tree->file_size = max(tree->file_size, va); - dtree.file_size = tree->file_size; - dtree.root = tree->root; - dtree.depth = tree->depth; - - if (flash_write(tree->fs->dev, tree->va, &dtree, sizeof dtree) == 0) + if (tree->file_size <= va && mufs_sync_tree(tree) < 0) return 0; return entry.path_len + sizeof entry; diff --git a/source/fs/mufs/file.c b/source/fs/mufs/file.c index 60a24be..a08beaf 100644 --- a/source/fs/mufs/file.c +++ b/source/fs/mufs/file.c @@ -90,17 +90,8 @@ size_t mufs_write(struct mufs_file *file, const void *data, size_t len) file->va += ret; - if (file->tree->file_size <= file->va) { - struct mufs_dtree dtree; - - dtree.file_size = file->tree->file_size; - dtree.root = file->tree->root; - dtree.depth = file->tree->depth; - - if (flash_write(file->fs->dev, file->tree->va, &dtree, - sizeof dtree) == 0) - return 0; - } + if (file->tree->file_size <= file->va && mufs_sync_tree(file->tree) < 0) + return 0; return ret; } diff --git a/source/fs/mufs/tree.c b/source/fs/mufs/tree.c index ae34a2e..3e31293 100644 --- a/source/fs/mufs/tree.c +++ b/source/fs/mufs/tree.c @@ -9,6 +9,7 @@ #include #include "block.h" +#include "dir.h" #include "tree.h" static int mufs_do_lookup(struct mufs *fs, uint32_t *page, @@ -254,3 +255,19 @@ size_t mufs_tree_write(struct mufs_tree *tree, void *data, return nbytes; } + +int mufs_sync_tree(struct mufs_tree *tree) +{ + struct mufs *fs = tree->fs; + struct flash_dev *dev = fs->dev; + struct mufs_dtree dtree; + + dtree.file_size = tree->file_size; + dtree.root = tree->root; + dtree.depth = tree->depth; + + if (flash_write(dev, tree->va, &dtree, sizeof dtree) == 0) + return -1; + + return 0; +} diff --git a/source/fs/mufs/tree.h b/source/fs/mufs/tree.h index 10d554f..39c3602 100644 --- a/source/fs/mufs/tree.h +++ b/source/fs/mufs/tree.h @@ -11,3 +11,4 @@ size_t mufs_tree_read(struct mufs_tree *tree, void *data, uint32_t va, size_t len); size_t mufs_tree_write(struct mufs_tree *tree, void *data, uint32_t va, size_t len); +int mufs_sync_tree(struct mufs_tree *tree);