mufs: optimise memory footprint of mufs_do_lookup()

tags/0.1.0
S.J.R. van Schaik 8 years ago
parent 807959eb29
commit cbd395e137
  1. 23
      source/fs/mufs/tree.c

@ -32,8 +32,7 @@ static int mufs_do_lookup(struct mufs *fs, uint32_t *page,
unsigned alloc) unsigned alloc)
{ {
struct flash_dev *dev = fs->dev; struct flash_dev *dev = fs->dev;
char data[1 << dev->log2_block_size]; uint32_t entry;
uint32_t *table = (uint32_t *)data;
size_t index; size_t index;
if (!base) if (!base)
@ -44,27 +43,27 @@ static int mufs_do_lookup(struct mufs *fs, uint32_t *page,
return 0; return 0;
} }
if (flash_read(dev, base << dev->log2_block_size, data,
sizeof data) == 0)
return -1;
index = va & ((1 << ((depth - 1) * fs->log2_nentries)) - 1); index = va & ((1 << ((depth - 1) * fs->log2_nentries)) - 1);
if (!table[index]) { if (flash_read(dev, (base << dev->log2_block_size) + index * sizeof entry,
&entry, sizeof entry) == 0)
return -1;
if (!entry) {
if (alloc) { if (alloc) {
if (depth == 1 && new_page) { if (depth == 1 && new_page) {
table[index] = new_page; entry = new_page;
} else if (mufs_alloc_block(fs, &table[index]) < 0) { } else if (mufs_alloc_block(fs, &entry) < 0) {
return -1; return -1;
} }
} }
if (flash_write(dev, base << dev->log2_block_size, data, if (flash_write(dev, (base << dev->log2_block_size) +
sizeof data) == 0) index * sizeof entry, &entry, sizeof entry) == 0)
return -1; return -1;
} }
return mufs_do_lookup(fs, page, table[index], depth - 1, va, new_page, return mufs_do_lookup(fs, page, entry, depth - 1, va, new_page,
alloc); alloc);
} }

Loading…
Cancel
Save