|
|
@ -19,8 +19,7 @@ int mufs_mkpath(struct mufs *fs, const char *path, struct mufs_tree *subtree, |
|
|
|
struct mufs_stat stat; |
|
|
|
struct mufs_stat stat; |
|
|
|
struct mufs_dirent dirent; |
|
|
|
struct mufs_dirent dirent; |
|
|
|
struct mufs_tree *tree; |
|
|
|
struct mufs_tree *tree; |
|
|
|
char *s; |
|
|
|
char *s, *root, *name; |
|
|
|
char *name; |
|
|
|
|
|
|
|
size_t len; |
|
|
|
size_t len; |
|
|
|
int ret; |
|
|
|
int ret; |
|
|
|
|
|
|
|
|
|
|
@ -33,17 +32,18 @@ int mufs_mkpath(struct mufs *fs, const char *path, struct mufs_tree *subtree, |
|
|
|
return 0; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
root = s; |
|
|
|
name = strrchr(s, '/'); |
|
|
|
name = strrchr(s, '/'); |
|
|
|
*name++ = '\0'; |
|
|
|
*name++ = '\0'; |
|
|
|
|
|
|
|
|
|
|
|
if (*s == '\0') |
|
|
|
if (*root == '\0') |
|
|
|
s = "/"; |
|
|
|
root = "/"; |
|
|
|
|
|
|
|
|
|
|
|
if (*name == '\0') |
|
|
|
if (*name == '\0') |
|
|
|
return -1; |
|
|
|
goto err_free_s; |
|
|
|
|
|
|
|
|
|
|
|
if (resolve_path(fs, s, &tree, &stat) < 0 || stat.type != MUFS_DIR) |
|
|
|
if (resolve_path(fs, root, &tree, &stat) < 0 || stat.type != MUFS_DIR) |
|
|
|
return -1; |
|
|
|
goto err_free_s; |
|
|
|
|
|
|
|
|
|
|
|
memset(&dirent, 0, sizeof dirent); |
|
|
|
memset(&dirent, 0, sizeof dirent); |
|
|
|
|
|
|
|
|
|
|
@ -65,14 +65,20 @@ int mufs_mkpath(struct mufs *fs, const char *path, struct mufs_tree *subtree, |
|
|
|
if (!is_aligned(tree->file_size, fs->dev->log2_block_size) && |
|
|
|
if (!is_aligned(tree->file_size, fs->dev->log2_block_size) && |
|
|
|
write_dirent(tree, tree->file_size, &dirent) > 0) { |
|
|
|
write_dirent(tree, tree->file_size, &dirent) > 0) { |
|
|
|
mufs_del_tree(tree); |
|
|
|
mufs_del_tree(tree); |
|
|
|
|
|
|
|
free(s); |
|
|
|
return 0; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
ret = write_dirent(tree, align_up(tree->file_size, |
|
|
|
ret = write_dirent(tree, align_up(tree->file_size, |
|
|
|
fs->dev->log2_block_size), &dirent); |
|
|
|
fs->dev->log2_block_size), &dirent); |
|
|
|
mufs_del_tree(tree); |
|
|
|
mufs_del_tree(tree); |
|
|
|
|
|
|
|
free(s); |
|
|
|
|
|
|
|
|
|
|
|
return ret; |
|
|
|
return ret; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
err_free_s: |
|
|
|
|
|
|
|
free(s); |
|
|
|
|
|
|
|
return -1; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static int remove_page(struct mufs_tree *tree, uint32_t va) |
|
|
|
static int remove_page(struct mufs_tree *tree, uint32_t va) |
|
|
|