mufs: implement mufs_sync_tree() to sync tree objects to disk
This commit is contained in:
parent
2c1079d0f4
commit
9ef95baac3
4 changed files with 23 additions and 18 deletions
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#include <fs/mufs.h>
|
||||
|
||||
#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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue