summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lwext4/ext4.c125
1 files changed, 119 insertions, 6 deletions
diff --git a/lwext4/ext4.c b/lwext4/ext4.c
index 94599d5..d3c5c35 100644
--- a/lwext4/ext4.c
+++ b/lwext4/ext4.c
@@ -1048,6 +1048,7 @@ int ext4_flink(const char *path, const char *hardlink_path)
return EINVAL;
EXT4_MP_LOCK(mp);
+ ext4_trans_start(mp);
r = ext4_generic_open2(&f, path, O_RDONLY, EXT4_DE_UNKNOWN,
&parent_inode, &name_off);
@@ -1077,6 +1078,11 @@ Finish:
if (child_loaded)
ext4_fs_put_inode_ref(&child_ref);
+ if (r != EOK)
+ ext4_trans_abort(mp);
+ else
+ ext4_trans_stop(mp);
+
EXT4_MP_UNLOCK(mp);
return r;
@@ -1096,6 +1102,7 @@ int ext4_frename(const char *path, const char *new_path)
return ENOENT;
EXT4_MP_LOCK(mp);
+ ext4_trans_start(mp);
r = ext4_generic_open2(&f, path, O_RDONLY, EXT4_DE_UNKNOWN,
&parent_inode, &name_off);
@@ -1134,6 +1141,11 @@ Finish:
if (child_loaded)
ext4_fs_put_inode_ref(&child_ref);
+ if (r != EOK)
+ ext4_trans_abort(mp);
+ else
+ ext4_trans_stop(mp);
+
EXT4_MP_UNLOCK(mp);
return r;
@@ -1181,9 +1193,12 @@ int ext4_fremove(const char *path)
return ENOENT;
EXT4_MP_LOCK(mp);
+ ext4_trans_start(mp);
+
r = ext4_generic_open2(&f, path, O_RDWR, EXT4_DE_UNKNOWN,
&parent_inode, &name_off);
if (r != EOK) {
+ ext4_trans_abort(mp);
EXT4_MP_UNLOCK(mp);
return r;
}
@@ -1191,6 +1206,7 @@ int ext4_fremove(const char *path)
/*Load parent*/
r = ext4_fs_get_inode_ref(&mp->fs, parent_inode, &parent);
if (r != EOK) {
+ ext4_trans_abort(mp);
EXT4_MP_UNLOCK(mp);
return r;
}
@@ -1199,6 +1215,7 @@ int ext4_fremove(const char *path)
r = ext4_fs_get_inode_ref(&mp->fs, f.inode, &child);
if (r != EOK) {
ext4_fs_put_inode_ref(&parent);
+ ext4_trans_abort(mp);
EXT4_MP_UNLOCK(mp);
return r;
}
@@ -1233,6 +1250,12 @@ int ext4_fremove(const char *path)
Finish:
ext4_fs_put_inode_ref(&child);
ext4_fs_put_inode_ref(&parent);
+
+ if (r != EOK)
+ ext4_trans_abort(mp);
+ else
+ ext4_trans_stop(mp);
+
EXT4_MP_UNLOCK(mp);
return r;
}
@@ -1286,9 +1309,17 @@ int ext4_fopen(ext4_file *f, const char *path, const char *flags)
return ENOENT;
EXT4_MP_LOCK(mp);
+ ext4_trans_start(mp);
+
ext4_block_cache_write_back(mp->fs.bdev, 1);
r = ext4_generic_open(f, path, flags, true, 0, 0);
ext4_block_cache_write_back(mp->fs.bdev, 0);
+
+ if (r != EOK)
+ ext4_trans_abort(mp);
+ else
+ ext4_trans_stop(mp);
+
EXT4_MP_UNLOCK(mp);
return r;
}
@@ -1305,9 +1336,17 @@ int ext4_fopen2(ext4_file *f, const char *path, int flags)
filetype = EXT4_DE_REG_FILE;
EXT4_MP_LOCK(mp);
+ ext4_trans_start(mp);
+
ext4_block_cache_write_back(mp->fs.bdev, 1);
r = ext4_generic_open2(f, path, flags, filetype, NULL, NULL);
ext4_block_cache_write_back(mp->fs.bdev, 0);
+
+ if (r != EOK)
+ ext4_trans_abort(mp);
+ else
+ ext4_trans_stop(mp);
+
EXT4_MP_UNLOCK(mp);
return r;
}
@@ -1377,7 +1416,14 @@ int ext4_ftruncate(ext4_file *f, uint64_t size)
return EPERM;
EXT4_MP_LOCK(f->mp);
+
+ ext4_trans_start(f->mp);
r = ext4_ftruncate_no_lock(f, size);
+ if (r != EOK)
+ ext4_trans_abort(f->mp);
+ else
+ ext4_trans_stop(f->mp);
+
EXT4_MP_UNLOCK(f->mp);
return r;
}
@@ -1565,6 +1611,7 @@ int ext4_fwrite(ext4_file *f, const void *buf, size_t size, size_t *wcnt)
return EOK;
EXT4_MP_LOCK(f->mp);
+ ext4_trans_start(f->mp);
struct ext4_fs *const fs = &f->mp->fs;
struct ext4_sblock *const sb = &f->mp->fs.sb;
@@ -1574,6 +1621,7 @@ int ext4_fwrite(ext4_file *f, const void *buf, size_t size, size_t *wcnt)
r = ext4_fs_get_inode_ref(fs, f->inode, &ref);
if (r != EOK) {
+ ext4_trans_abort(f->mp);
EXT4_MP_UNLOCK(f->mp);
return r;
}
@@ -1713,7 +1761,13 @@ out_fsize:
}
Finish:
- ext4_fs_put_inode_ref(&ref);
+ r = ext4_fs_put_inode_ref(&ref);
+
+ if (r != EOK)
+ ext4_trans_abort(f->mp);
+ else
+ ext4_trans_stop(f->mp);
+
EXT4_MP_UNLOCK(f->mp);
return r;
}
@@ -1766,9 +1820,11 @@ int ext4_chmod(const char *path, uint32_t mode)
return ENOENT;
EXT4_MP_LOCK(mp);
+ ext4_trans_start(mp);
r = ext4_generic_open2(&f, path, O_RDWR, EXT4_DE_UNKNOWN, NULL, NULL);
if (r != EOK) {
+ ext4_trans_abort(mp);
EXT4_MP_UNLOCK(mp);
return r;
}
@@ -1777,6 +1833,7 @@ int ext4_chmod(const char *path, uint32_t mode)
ext4_fclose(&f);
r = ext4_fs_get_inode_ref(&mp->fs, ino, &inode_ref);
if (r != EOK) {
+ ext4_trans_abort(mp);
EXT4_MP_UNLOCK(mp);
return r;
}
@@ -1784,7 +1841,12 @@ int ext4_chmod(const char *path, uint32_t mode)
ext4_inode_set_mode(sb, inode_ref.inode, mode);
inode_ref.dirty = true;
- ext4_fs_put_inode_ref(&inode_ref);
+ r = ext4_fs_put_inode_ref(&inode_ref);
+ if (r != EOK)
+ ext4_trans_abort(mp);
+ else
+ ext4_trans_stop(mp);
+
EXT4_MP_UNLOCK(mp);
return r;
}
@@ -1801,9 +1863,11 @@ int ext4_chown(const char *path, uint32_t uid, uint32_t gid)
return ENOENT;
EXT4_MP_LOCK(mp);
+ ext4_trans_start(mp);
r = ext4_generic_open2(&f, path, O_RDWR, EXT4_DE_UNKNOWN, NULL, NULL);
if (r != EOK) {
+ ext4_trans_abort(mp);
EXT4_MP_UNLOCK(mp);
return r;
}
@@ -1811,6 +1875,7 @@ int ext4_chown(const char *path, uint32_t uid, uint32_t gid)
ext4_fclose(&f);
r = ext4_fs_get_inode_ref(&mp->fs, ino, &inode_ref);
if (r != EOK) {
+ ext4_trans_abort(mp);
EXT4_MP_UNLOCK(mp);
return r;
}
@@ -1819,7 +1884,12 @@ int ext4_chown(const char *path, uint32_t uid, uint32_t gid)
ext4_inode_set_gid(inode_ref.inode, gid);
inode_ref.dirty = true;
- ext4_fs_put_inode_ref(&inode_ref);
+ r = ext4_fs_put_inode_ref(&inode_ref);
+ if (r != EOK)
+ ext4_trans_abort(mp);
+ else
+ ext4_trans_stop(mp);
+
EXT4_MP_UNLOCK(mp);
return r;
}
@@ -1836,9 +1906,11 @@ int ext4_file_set_atime(const char *path, uint32_t atime)
return ENOENT;
EXT4_MP_LOCK(mp);
+ ext4_trans_start(mp);
r = ext4_generic_open2(&f, path, O_RDWR, EXT4_DE_UNKNOWN, NULL, NULL);
if (r != EOK) {
+ ext4_trans_abort(mp);
EXT4_MP_UNLOCK(mp);
return r;
}
@@ -1846,6 +1918,7 @@ int ext4_file_set_atime(const char *path, uint32_t atime)
ext4_fclose(&f);
r = ext4_fs_get_inode_ref(&mp->fs, ino, &inode_ref);
if (r != EOK) {
+ ext4_trans_abort(mp);
EXT4_MP_UNLOCK(mp);
return r;
}
@@ -1853,7 +1926,12 @@ int ext4_file_set_atime(const char *path, uint32_t atime)
ext4_inode_set_access_time(inode_ref.inode, atime);
inode_ref.dirty = true;
- ext4_fs_put_inode_ref(&inode_ref);
+ r = ext4_fs_put_inode_ref(&inode_ref);
+ if (r != EOK)
+ ext4_trans_abort(mp);
+ else
+ ext4_trans_stop(mp);
+
EXT4_MP_UNLOCK(mp);
return r;
}
@@ -1870,9 +1948,11 @@ int ext4_file_set_mtime(const char *path, uint32_t mtime)
return ENOENT;
EXT4_MP_LOCK(mp);
+ ext4_trans_start(mp);
r = ext4_generic_open2(&f, path, O_RDWR, EXT4_DE_UNKNOWN, NULL, NULL);
if (r != EOK) {
+ ext4_trans_abort(mp);
EXT4_MP_UNLOCK(mp);
return r;
}
@@ -1880,6 +1960,7 @@ int ext4_file_set_mtime(const char *path, uint32_t mtime)
ext4_fclose(&f);
r = ext4_fs_get_inode_ref(&mp->fs, ino, &inode_ref);
if (r != EOK) {
+ ext4_trans_abort(mp);
EXT4_MP_UNLOCK(mp);
return r;
}
@@ -1887,7 +1968,12 @@ int ext4_file_set_mtime(const char *path, uint32_t mtime)
ext4_inode_set_modif_time(inode_ref.inode, mtime);
inode_ref.dirty = true;
- ext4_fs_put_inode_ref(&inode_ref);
+ r = ext4_fs_put_inode_ref(&inode_ref);
+ if (r != EOK)
+ ext4_trans_abort(mp);
+ else
+ ext4_trans_stop(mp);
+
EXT4_MP_UNLOCK(mp);
return r;
}
@@ -1904,9 +1990,11 @@ int ext4_file_set_ctime(const char *path, uint32_t ctime)
return ENOENT;
EXT4_MP_LOCK(mp);
+ ext4_trans_start(mp);
r = ext4_generic_open2(&f, path, O_RDWR, EXT4_DE_UNKNOWN, NULL, NULL);
if (r != EOK) {
+ ext4_trans_abort(mp);
EXT4_MP_UNLOCK(mp);
return r;
}
@@ -1914,6 +2002,7 @@ int ext4_file_set_ctime(const char *path, uint32_t ctime)
ext4_fclose(&f);
r = ext4_fs_get_inode_ref(&mp->fs, ino, &inode_ref);
if (r != EOK) {
+ ext4_trans_abort(mp);
EXT4_MP_UNLOCK(mp);
return r;
}
@@ -1921,7 +2010,12 @@ int ext4_file_set_ctime(const char *path, uint32_t ctime)
ext4_inode_set_change_inode_time(inode_ref.inode, ctime);
inode_ref.dirty = true;
- ext4_fs_put_inode_ref(&inode_ref);
+ r = ext4_fs_put_inode_ref(&inode_ref);
+ if (r != EOK)
+ ext4_trans_abort(mp);
+ else
+ ext4_trans_stop(mp);
+
EXT4_MP_UNLOCK(mp);
return r;
}
@@ -2006,6 +2100,8 @@ int ext4_fsymlink(const char *target, const char *path)
filetype = EXT4_DE_SYMLINK;
EXT4_MP_LOCK(mp);
+ ext4_trans_start(mp);
+
ext4_block_cache_write_back(mp->fs.bdev, 1);
r = ext4_generic_open2(&f, path, O_RDWR|O_CREAT, filetype, NULL, NULL);
if (r == EOK)
@@ -2048,6 +2144,11 @@ int ext4_readlink(const char *path, char *buf, size_t bufsize, size_t *rcnt)
Finish:
ext4_block_cache_write_back(mp->fs.bdev, 0);
+ if (r != EOK)
+ ext4_trans_abort(mp);
+ else
+ ext4_trans_stop(mp);
+
EXT4_MP_UNLOCK(mp);
return r;
}
@@ -2308,12 +2409,14 @@ int ext4_dir_rm(const char *path)
return ENOENT;
EXT4_MP_LOCK(mp);
+ ext4_trans_start(mp);
struct ext4_fs *const fs = &mp->fs;
/*Check if exist.*/
r = ext4_generic_open(&f, path, "r", false, &inode_up, &name_off);
if (r != EOK) {
+ ext4_trans_abort(mp);
EXT4_MP_UNLOCK(mp);
return r;
}
@@ -2479,6 +2582,12 @@ int ext4_dir_rm(const char *path)
ext4_block_cache_write_back(mp->fs.bdev, 0);
EXT4_MP_UNLOCK(mp);
+
+ if (r != EOK)
+ ext4_trans_abort(mp);
+ else
+ ext4_trans_stop(mp);
+
return r;
}
@@ -2493,11 +2602,13 @@ int ext4_dir_mk(const char *path)
return ENOENT;
EXT4_MP_LOCK(mp);
+ ext4_trans_start(mp);
/*Check if exist.*/
r = ext4_generic_open(&f, path, "r", false, 0, 0);
if (r == EOK) {
/*Directory already created*/
+ ext4_trans_stop(mp);
EXT4_MP_UNLOCK(mp);
return r;
}
@@ -2505,10 +2616,12 @@ int ext4_dir_mk(const char *path)
/*Create new dir*/
r = ext4_generic_open(&f, path, "w", false, 0, 0);
if (r != EOK) {
+ ext4_trans_abort(mp);
EXT4_MP_UNLOCK(mp);
return r;
}
+ ext4_trans_stop(mp);
EXT4_MP_UNLOCK(mp);
return r;
}