if (parent_inode)
*parent_inode = ref.index;
- if (flags & O_CREAT)
- ext4_trans_start(mp);
-
len = ext4_path_check(path, &is_goal);
while (1) {
if (name_off)
*name_off += len + 1;
- };
+ }
if (r != EOK) {
ext4_fs_put_inode_ref(&ref);
if (f->flags & O_APPEND)
f->fpos = f->fsize;
-
}
- r = ext4_fs_put_inode_ref(&ref);
- if (flags & O_CREAT) {
- if (r == EOK)
- ext4_trans_stop(mp);
- else
- ext4_trans_abort(mp);
-
- }
-
- return r;
+ return ext4_fs_put_inode_ref(&ref);
}
/****************************************************************************/
{
uint32_t iflags;
int filetype;
+ int r;
+ struct ext4_mountpoint *mp = ext4_get_mount(path);
+
if (ext4_parse_flags(flags, &iflags) == false)
return EINVAL;
else
filetype = EXT4_DE_DIR;
- return ext4_generic_open2(f, path, iflags, filetype, parent_inode,
- name_off);
+ if (iflags & O_CREAT)
+ ext4_trans_start(mp);
+
+ r = ext4_generic_open2(f, path, iflags, filetype, parent_inode,
+ name_off);
+
+ if (iflags & O_CREAT) {
+ if (r == EOK)
+ ext4_trans_stop(mp);
+ else
+ ext4_trans_abort(mp);
+ }
+
+ return r;
}
static int ext4_create_hardlink(const char *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);
- if (r != EOK)
- goto Finish;
+ if (r != EOK) {
+ EXT4_MP_UNLOCK(mp);
+ return r;
+ }
child_inode = f.inode;
ext4_fclose(&f);
+ ext4_trans_start(mp);
/*We have file to unlink. Load it.*/
r = ext4_fs_get_inode_ref(&mp->fs, child_inode, &child_ref);
return EROFS;
EXT4_MP_LOCK(mp);
- ext4_trans_start(mp);
r = ext4_generic_open2(&f, path, O_RDONLY, EXT4_DE_UNKNOWN,
&parent_inode, &name_off);
- if (r != EOK)
- goto Finish;
+ if (r != EOK) {
+ EXT4_MP_UNLOCK(mp);
+ return r;
+ }
child_inode = f.inode;
ext4_fclose(&f);
+ ext4_trans_start(mp);
/*Load parent*/
r = ext4_fs_get_inode_ref(&mp->fs, parent_inode, &parent_ref);
{
ext4_file f;
uint32_t parent_inode;
+ uint32_t child_inode;
uint32_t name_off;
bool is_goal;
int r;
return EROFS;
EXT4_MP_LOCK(mp);
- ext4_trans_start(mp);
-
- r = ext4_generic_open2(&f, path, O_RDWR, EXT4_DE_UNKNOWN,
+ r = ext4_generic_open2(&f, path, O_RDONLY, EXT4_DE_UNKNOWN,
&parent_inode, &name_off);
if (r != EOK) {
- ext4_trans_abort(mp);
EXT4_MP_UNLOCK(mp);
return r;
}
+ child_inode = f.inode;
+ ext4_fclose(&f);
+ ext4_trans_start(mp);
+
/*Load parent*/
r = ext4_fs_get_inode_ref(&mp->fs, parent_inode, &parent);
if (r != EOK) {
}
/*We have file to delete. Load it.*/
- r = ext4_fs_get_inode_ref(&mp->fs, f.inode, &child);
+ r = ext4_fs_get_inode_ref(&mp->fs, child_inode, &child);
if (r != EOK) {
ext4_fs_put_inode_ref(&parent);
ext4_trans_abort(mp);
filetype = EXT4_DE_REG_FILE;
EXT4_MP_LOCK(mp);
-
ext4_block_cache_write_back(mp->fs.bdev, 1);
+
+ if (flags & O_CREAT)
+ ext4_trans_start(mp);
+
r = ext4_generic_open2(file, path, flags, filetype, NULL, NULL);
- ext4_block_cache_write_back(mp->fs.bdev, 0);
+ if (flags & O_CREAT) {
+ if (r == EOK)
+ ext4_trans_stop(mp);
+ else
+ ext4_trans_abort(mp);
+ }
+
+ ext4_block_cache_write_back(mp->fs.bdev, 0);
EXT4_MP_UNLOCK(mp);
+
return r;
}
int r;
ext4_file f;
- ext4_trans_start(mp);
- r = ext4_generic_open2(&f, path, O_RDWR, EXT4_DE_UNKNOWN, NULL, NULL);
- if (r != EOK) {
- ext4_trans_abort(mp);
+ r = ext4_generic_open2(&f, path, O_RDONLY, EXT4_DE_UNKNOWN, NULL, NULL);
+ if (r != EOK)
return r;
- }
+
+ ext4_trans_start(mp);
r = ext4_fs_get_inode_ref(&mp->fs, f.inode, inode_ref);
if (r != EOK) {
filetype = EXT4_DE_SYMLINK;
EXT4_MP_LOCK(mp);
+ ext4_block_cache_write_back(mp->fs.bdev, 1);
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);
+ r = ext4_generic_open2(&f, path, O_RDWR | O_CREAT, filetype, NULL, NULL);
if (r == EOK)
r = ext4_fsymlink_set(&f, target, strlen(target));
else
ext4_fclose(&f);
Finish:
- ext4_block_cache_write_back(mp->fs.bdev, 0);
-
if (r != EOK)
ext4_trans_abort(mp);
else
ext4_trans_stop(mp);
+ ext4_block_cache_write_back(mp->fs.bdev, 0);
EXT4_MP_UNLOCK(mp);
return r;
}
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 EINVAL;
EXT4_MP_LOCK(mp);
+ ext4_block_cache_write_back(mp->fs.bdev, 1);
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);
+ r = ext4_generic_open2(&f, path, O_RDWR | O_CREAT, filetype, NULL, NULL);
if (r == EOK) {
if (filetype == EXT4_DE_CHRDEV ||
filetype == EXT4_DE_BLKDEV)
r = ext4_mknod_set(&f, dev);
- } else
+ } else {
goto Finish;
+ }
ext4_fclose(&f);
Finish:
- ext4_block_cache_write_back(mp->fs.bdev, 0);
-
if (r != EOK)
ext4_trans_abort(mp);
else
ext4_trans_stop(mp);
+ ext4_block_cache_write_back(mp->fs.bdev, 0);
EXT4_MP_UNLOCK(mp);
return r;
}
return EINVAL;
EXT4_MP_LOCK(mp);
- ext4_trans_start(mp);
+ r = ext4_generic_open2(&f, path, O_RDONLY, EXT4_DE_UNKNOWN, NULL, NULL);
+ if (r != EOK) {
+ EXT4_MP_UNLOCK(mp);
+ return r;
+ }
- r = ext4_generic_open2(&f, path, O_RDWR, EXT4_DE_UNKNOWN, NULL, NULL);
- if (r != EOK)
- goto Finish;
inode = f.inode;
ext4_fclose(&f);
+ ext4_trans_start(mp);
r = ext4_fs_get_inode_ref(&mp->fs, inode, &inode_ref);
if (r != EOK)
return EINVAL;
EXT4_MP_LOCK(mp);
- r = ext4_generic_open2(&f, path, O_RDWR, EXT4_DE_UNKNOWN, NULL, NULL);
+ r = ext4_generic_open2(&f, path, O_RDONLY, EXT4_DE_UNKNOWN, NULL, NULL);
if (r != EOK)
goto Finish;
+
inode = f.inode;
ext4_fclose(&f);
return ENOENT;
EXT4_MP_LOCK(mp);
- r = ext4_generic_open2(&f, path, O_RDWR, EXT4_DE_UNKNOWN, NULL, NULL);
+ r = ext4_generic_open2(&f, path, O_RDONLY, EXT4_DE_UNKNOWN, NULL, NULL);
if (r != EOK)
goto Finish;
inode = f.inode;
return EINVAL;
EXT4_MP_LOCK(mp);
- ext4_trans_start(mp);
+ r = ext4_generic_open2(&f, path, O_RDONLY, EXT4_DE_UNKNOWN, NULL, NULL);
+ if (r != EOK) {
+ EXT4_MP_LOCK(mp);
+ return r;
+ }
- r = ext4_generic_open2(&f, path, O_RDWR, EXT4_DE_UNKNOWN, NULL, NULL);
- if (r != EOK)
- goto Finish;
inode = f.inode;
ext4_fclose(&f);
+ ext4_trans_start(mp);
r = ext4_fs_get_inode_ref(&mp->fs, inode, &inode_ref);
if (r != EOK)
/*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;
}
path += name_off;
len = ext4_path_check(path, &is_goal);
-
inode_current = f.inode;
ext4_block_cache_write_back(mp->fs.bdev, 1);
{
int r;
ext4_file f;
-
struct ext4_mountpoint *mp = ext4_get_mount(path);
if (!mp)
return EROFS;
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;
- }
+ if (r == EOK)
+ goto Finish;
- /*Create new dir*/
+ /*Create new directory.*/
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);
+Finish:
EXT4_MP_UNLOCK(mp);
return r;
}