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

Loading…
Cancel
Save