diff options
| author | root <ngkaho1234@gmail.com> | 2015-09-20 22:47:37 +0000 |
|---|---|---|
| committer | root <ngkaho1234@gmail.com> | 2015-09-20 22:47:37 +0000 |
| commit | 241ba2c8b4e76232dea9a44f3478ee6408ee41c1 (patch) | |
| tree | 001cb8527c95cd8f12eaa51bac3acd1c90936295 | |
| parent | 8cb6e4527381e9d50aef3b9ffb013026afb9a51f (diff) | |
FIX: the parent directory reference in child directory inode, a.k.a '..' dirent is not correctly reset during rename.
| -rw-r--r-- | lwext4/ext4.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/lwext4/ext4.c b/lwext4/ext4.c index 7ce8786..4b35858 100644 --- a/lwext4/ext4.c +++ b/lwext4/ext4.c @@ -253,7 +253,7 @@ static int ext4_link(struct ext4_mountpoint *mp, struct ext4_inode_ref *parent, } else { #if CONFIG_DIR_INDEX_ENABLE - rc = ext4_dir_dx_reset_parent_inode(parent, + rc = ext4_dir_dx_reset_parent_inode(child, parent->index); if (rc != EOK) return rc; @@ -1220,6 +1220,25 @@ Finish: } +int ext4_fopen_all(ext4_file *f, const char *path, int flags) +{ + struct ext4_mountpoint *mp = ext4_get_mount(path); + int r; + int filetype; + + if (!mp) + return ENOENT; + + filetype = EXT4_DIRECTORY_FILETYPE_UNKNOWN; + + EXT4_MP_LOCK(mp); + ext4_block_cache_write_back(mp->fs.bdev, 1); + r = ext4_generic_open2(f, path, flags, filetype, 0, 0); + ext4_block_cache_write_back(mp->fs.bdev, 0); + EXT4_MP_UNLOCK(mp); + return r; +} + int ext4_ftruncate(ext4_file *f, uint64_t size) { int r; |
