mufs: implement mufs_sync_tree() to sync tree objects to disk

This commit is contained in:
S.J.R. van Schaik 2017-06-12 12:59:01 +02:00
parent 2c1079d0f4
commit 9ef95baac3
4 changed files with 23 additions and 18 deletions

View file

@ -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;

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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);