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