summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorroot <ngkaho1234@gmail.com>2015-09-20 22:47:37 +0000
committerroot <ngkaho1234@gmail.com>2015-09-20 22:47:37 +0000
commit241ba2c8b4e76232dea9a44f3478ee6408ee41c1 (patch)
tree001cb8527c95cd8f12eaa51bac3acd1c90936295
parent8cb6e4527381e9d50aef3b9ffb013026afb9a51f (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.c21
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;