From 807959eb2977b4ee40b0463d0ce19dc5f13fffb5 Mon Sep 17 00:00:00 2001 From: "S.J.R. van Schaik" Date: Fri, 16 Jun 2017 15:57:00 +0200 Subject: [PATCH] mufs: optimise memory footprint of write_dirent() --- source/fs/mufs/dir.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/source/fs/mufs/dir.c b/source/fs/mufs/dir.c index e36fd63..4441dd8 100644 --- a/source/fs/mufs/dir.c +++ b/source/fs/mufs/dir.c @@ -270,9 +270,12 @@ size_t write_dirent(struct mufs_tree *tree, { struct mufs *fs = tree->fs; struct flash_dev *dev = fs->dev; - char data[1 << dev->log2_block_size]; struct mufs_dentry entry; - size_t size; + size_t block_size = 1 << dev->log2_block_size; + uint32_t offset; + + offset = va & ((UINT32_C(1) << dev->log2_block_size) - 1); + va = align(va, dev->log2_block_size); entry.type = dirent->type; entry.tree.file_size = dirent->tree.file_size; @@ -280,15 +283,18 @@ size_t write_dirent(struct mufs_tree *tree, entry.tree.depth = dirent->tree.depth; entry.path_len = strlen(dirent->path); - memcpy(data, &entry, sizeof entry); - memcpy(data + sizeof entry, dirent->path, entry.path_len); - size = sizeof entry + entry.path_len; + if (block_size - offset < sizeof entry + entry.path_len) + return 0; + + if (mufs_tree_write(tree, dirent->path, va + offset + sizeof entry, + entry.path_len) == 0) + return 0; - if (mufs_tree_write(tree, data, va, size) == 0) + if (mufs_tree_write(tree, &entry, va + offset, sizeof entry) == 0) return 0; - va += sizeof entry + entry.path_len; - tree->file_size = max(tree->file_size, va); + tree->file_size = max(tree->file_size, va + offset + sizeof entry + + entry.path_len); if (tree->file_size <= va && mufs_sync_tree(tree) < 0) return 0;