Message ID | 20240517124005.347221-9-yi.zhang@huaweicloud.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | ext4: support adding multi-delalloc blocks | expand |
On Fri 17-05-24 20:40:03, Zhang Yi wrote: > From: Zhang Yi <yi.zhang@huawei.com> > > 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> Looks good. Feel free to add: Reviewed-by: Jan Kara <jack@suse.cz> Honza > --- > fs/ext4/inode.c | 55 ++++++++++++++++++++++++++++++++++--------------- > 1 file changed, 38 insertions(+), 17 deletions(-) > > diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c > index 0c52969654ac..eefedb7264c7 100644 > --- a/fs/ext4/inode.c > +++ b/fs/ext4/inode.c > @@ -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 > @@ -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; > } > } > > -- > 2.39.2 >
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 0c52969654ac..eefedb7264c7 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -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 @@ -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; } }