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);
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;
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);
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;
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;
}
/*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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
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;
}
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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)
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;
}
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;
}
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;
}
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;
}
/*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;
}