|
|
|
@ -179,10 +179,14 @@ void mufs_closedir(struct mufs_dir *dir) |
|
|
|
|
static size_t read_dirent(struct mufs *fs, struct mufs_tree *tree, |
|
|
|
|
struct mufs_dirent *dirent, uint32_t va) |
|
|
|
|
{ |
|
|
|
|
struct flash_dev *dev = fs->dev; |
|
|
|
|
struct mufs_dentry entry; |
|
|
|
|
size_t ret = 0; |
|
|
|
|
size_t len; |
|
|
|
|
uint32_t base = va; |
|
|
|
|
uint32_t base, offset; |
|
|
|
|
|
|
|
|
|
offset = va & ((UINT32_C(1) << dev->log2_block_size) - 1); |
|
|
|
|
base = align(va, dev->log2_block_size); |
|
|
|
|
|
|
|
|
|
if (va + sizeof(entry) > tree->file_size) |
|
|
|
|
return 0; |
|
|
|
@ -208,17 +212,12 @@ static size_t read_dirent(struct mufs *fs, struct mufs_tree *tree, |
|
|
|
|
|
|
|
|
|
dirent->type = entry.type; |
|
|
|
|
|
|
|
|
|
struct flash_dev *dev = fs->dev; |
|
|
|
|
|
|
|
|
|
if (mufs_lookup_page(tree, &dirent->tree.va, |
|
|
|
|
base & ~((UINT32_C(1) << dev->log2_block_size) - 1)) < 0) |
|
|
|
|
if (mufs_lookup_page(tree, &dirent->tree.va, base) < 0) |
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
dirent->tree.fs = fs; |
|
|
|
|
dirent->tree.va = dirent->tree.va << dev->log2_block_size; |
|
|
|
|
/* TODO: get a proper offset to the tree. */ |
|
|
|
|
dirent->tree.va += offsetof(struct mufs_dentry, tree); |
|
|
|
|
dirent->tree.va += base & ((UINT32_C(1) << dev->log2_block_size) - 1); |
|
|
|
|
dirent->tree.va = (dirent->tree.va << dev->log2_block_size) + offset + |
|
|
|
|
offsetof(struct mufs_dentry, tree); |
|
|
|
|
dirent->tree.file_size = entry.tree.file_size; |
|
|
|
|
dirent->tree.root = entry.tree.root; |
|
|
|
|
dirent->tree.depth = entry.tree.depth; |
|
|
|
|