Skip to content

Commit

Permalink
ext4: factor out a helper to check the cluster allocation state
Browse files Browse the repository at this point in the history
Factor out a common helper ext4_clu_alloc_state(), check whether the
cluster containing a delalloc block to be added has been allocated or
has delalloc reservation, no logic changes.

Signed-off-by: Zhang Yi <yi.zhang@huawei.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Link: https://patch.msgid.link/20240517124005.347221-9-yi.zhang@huaweicloud.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
  • Loading branch information
zhangyi089 authored and tytso committed Jun 27, 2024
1 parent 0d66b23 commit 49bf6ab
Showing 1 changed file with 38 additions and 17 deletions.
55 changes: 38 additions & 17 deletions fs/ext4/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -1649,6 +1649,35 @@ static void ext4_print_free_blocks(struct inode *inode)
return;
}

/*
* Check whether the cluster containing lblk has been allocated or has
* delalloc reservation.
*
* Returns 0 if the cluster doesn't have either, 1 if it has delalloc
* reservation, 2 if it's already been allocated, negative error code on
* failure.
*/
static int ext4_clu_alloc_state(struct inode *inode, ext4_lblk_t lblk)
{
struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
int ret;

/* Has delalloc reservation? */
if (ext4_es_scan_clu(inode, &ext4_es_is_delonly, lblk))
return 1;

/* Already been allocated? */
if (ext4_es_scan_clu(inode, &ext4_es_is_mapped, lblk))
return 2;
ret = ext4_clu_mapped(inode, EXT4_B2C(sbi, lblk));
if (ret < 0)
return ret;
if (ret > 0)
return 2;

return 0;
}

/*
* ext4_insert_delayed_block - adds a delayed block to the extents status
* tree, incrementing the reserved cluster/block
Expand Down Expand Up @@ -1682,23 +1711,15 @@ static int ext4_insert_delayed_block(struct inode *inode, ext4_lblk_t lblk)
if (ret != 0) /* ENOSPC */
return ret;
} else { /* bigalloc */
if (!ext4_es_scan_clu(inode, &ext4_es_is_delonly, lblk)) {
if (!ext4_es_scan_clu(inode,
&ext4_es_is_mapped, lblk)) {
ret = ext4_clu_mapped(inode,
EXT4_B2C(sbi, lblk));
if (ret < 0)
return ret;
if (ret == 0) {
ret = ext4_da_reserve_space(inode, 1);
if (ret != 0) /* ENOSPC */
return ret;
} else {
allocated = true;
}
} else {
allocated = true;
}
ret = ext4_clu_alloc_state(inode, lblk);
if (ret < 0)
return ret;
if (ret == 2)
allocated = true;
if (ret == 0) {
ret = ext4_da_reserve_space(inode, 1);
if (ret != 0) /* ENOSPC */
return ret;
}
}

Expand Down

0 comments on commit 49bf6ab

Please sign in to comment.