Maxim Patlasov <mpatla...@virtuozzo.com> writes:
> Since Oct 9 2014 (commit 671ddaaab74a8495a549fccae49eb4305c11e5d2), ploop has > not used FALLOC_FL_KEEP_SIZE. This means that the part of > fallocate(FALLOC_FL_CONVERT_AND_EXTEND) extending i_size is redundant now. > Hence, we can use existing (and well tested) ext4_convert_unwritten_extents() > instead of our home-made (buggy) algorithm. Ack-by: dmonak...@openvz.org > > https://jira.sw.ru/browse/PSBM-22381 > > Signed-off-by: Maxim Patlasov <mpatla...@virtuozzo.com> > --- > fs/ext4/extents.c | 111 > ----------------------------------------------------- > 1 file changed, 1 insertion(+), 110 deletions(-) > > diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c > index 34afee9..cf248ce 100644 > --- a/fs/ext4/extents.c > +++ b/fs/ext4/extents.c > @@ -4666,115 +4666,6 @@ retry: > ext4_std_error(inode->i_sb, err); > } > > -static int ext4_convert_and_extend_locked(struct inode *inode, loff_t offset, > - loff_t len) > -{ > - struct ext4_ext_path *path = NULL; > - loff_t new_size = offset + len; > - ext4_lblk_t iblock = offset >> inode->i_blkbits; > - ext4_lblk_t new_iblock = new_size >> inode->i_blkbits; > - unsigned int max_blocks = new_iblock - iblock; > - handle_t *handle; > - unsigned int credits; > - int err = 0; > - int ret = 0; > - > - if ((loff_t)iblock << inode->i_blkbits != offset || > - (loff_t)new_iblock << inode->i_blkbits != new_size) > - return -EINVAL; > - > - while (max_blocks > 0) { > - struct ext4_extent *ex; > - ext4_lblk_t ee_block; > - ext4_fsblk_t ee_start; > - unsigned short ee_len; > - int depth; > - > - /* > - * credits to insert 1 extents into extent tree > - */ > - credits = ext4_chunk_trans_blocks(inode, max_blocks); > - handle = ext4_journal_start(inode, EXT4_HT_MAP_BLOCKS, credits); > - if (IS_ERR(handle)) > - return PTR_ERR(handle); > - > - down_write((&EXT4_I(inode)->i_data_sem)); > - > - /* find extent for this block */ > - path = ext4_ext_find_extent(inode, iblock, NULL, 0); > - if (IS_ERR(path)) { > - err = PTR_ERR(path); > - goto done; > - } > - > - depth = ext_depth(inode); > - ex = path[depth].p_ext; > - BUG_ON(ex == NULL && depth != 0); > - > - if (ex == NULL) { > - err = -ENOENT; > - goto done; > - } > - > - ee_block = le32_to_cpu(ex->ee_block); > - ee_start = ext4_ext_pblock(ex); > - ee_len = ext4_ext_get_actual_len(ex); > - if (!in_range(iblock, ee_block, ee_len)) { > - err = -ERANGE; > - goto done; > - } > - > - if (ext4_ext_is_unwritten(ex)) { > - struct ext4_map_blocks map = {0}; > - > - map.m_lblk = iblock; > - map.m_len = max_blocks; > - err = ext4_convert_unwritten_extents_endio(handle, > inode, > - &map, > - path); > - if (err < 0) > - goto done; > - > - ext4_update_inode_fsync_trans(handle, inode, 1); > - err = check_eofblocks_fl(handle, inode, iblock, path, > - max_blocks); > - if (err) > - goto done; > - } > - > - > - up_write((&EXT4_I(inode)->i_data_sem)); > - > - iblock += ee_len; > - max_blocks -= (ee_len < max_blocks) ? ee_len : max_blocks; > - > - if (!max_blocks && new_size > i_size_read(inode)) { > - i_size_write(inode, new_size); > - ext4_update_i_disksize(inode, new_size); > - } > - > - ret = ext4_mark_inode_dirty(handle, inode); > -done: > - if (err) > - up_write((&EXT4_I(inode)->i_data_sem)); > - else > - err = ret; > - > - if (path) { > - ext4_ext_drop_refs(path); > - kfree(path); > - } > - > - ret = ext4_journal_stop(handle); > - if (!err && ret) > - err = ret; > - if (err) > - return err; > - } > - > - return 0; > -} > - > static int ext4_convert_and_extend(struct inode *inode, loff_t offset, > loff_t len) > { > @@ -4784,7 +4675,7 @@ static int ext4_convert_and_extend(struct inode *inode, > loff_t offset, > return -EACCES; > > mutex_lock(&inode->i_mutex); > - err = ext4_convert_and_extend_locked(inode, offset, len); > + err = ext4_convert_unwritten_extents(NULL, inode, offset, len); > mutex_unlock(&inode->i_mutex); > > return err;
signature.asc
Description: PGP signature
_______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel