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