Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp1473146imu; Mon, 5 Nov 2018 22:14:45 -0800 (PST) X-Google-Smtp-Source: AJdET5eNdRXm+utEXFimCLw46U8TgkT3X1UaEnZX7MPtdfF8yEgj4RTMTmnvF+hHvv7AHqT/P5pY X-Received: by 2002:a63:a30a:: with SMTP id s10mr21493719pge.234.1541484885257; Mon, 05 Nov 2018 22:14:45 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1541484885; cv=none; d=google.com; s=arc-20160816; b=cvSOo/0AUAaKhS7i2NSRY6lSGuw2aCTz34jUqnLOg3VClBY19grlL24QeXDJHmkZHP tXZ90T/LtdSuuRhDrPRmGNUyH5FjQFa5RMKwdbMpLrrk3d5qj6n1uJHRTUHBODGdqY/c RJIQVmOdViZEy/J1Hbf7DhQ8MJ5OzU03tEBYOVaBpbBvrjzh50wmXYPyc7KFsekvwL6G uCQVhxBpN8vPszMrRsvwOZznP1SrnMrv6p1txWNgKXOCs9wtMQenE6OblDV6tVLqly+R 2xj24ZPzXRgygQnoMsBaGqUl9mbZ6XE3VJ/wz6YRlVlwSiAk0KY2Ilxba5AWY+oHw+I2 HAsA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:mime-version:user-agent:date:message-id:cc:to :subject:from; bh=WAWMsy0PCQpjLpFBFqpWBKxYoi4p6ysKJTd9jeYLDV8=; b=VDDhqmZk9sTBG/SMz2sh5KHOJrqE4ASrMuNUT1D1f0EyTMEh6w9PUkrp1kyPteBu/1 /8ak2YnvSE0NVoZhpTrghlmDl0r4dVUwkJwTXFT3U+y1QtFEWBgfnFB8U0C7suyNtXrH 5/PoDwP1OlgiCuI0cUUwsd7W546tUQoVdkZdk7EPwJtt8ZvrKYDVXxpnuoaffwcGF18v 6Znu47h5w3ha/+ICT0JA8Pb5pXK3UEgIo4ct5Lb8u5eHEXsoukePJamekaYz7ycGgEiN QROLJYKQHBzowi8J0vu8dxmHRKhMsrh9zlR/S+9ejbC+bTT7NjIP7FeMUWZ5LxFz/348 qPDA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=virtuozzo.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id t129-v6si17282601pfb.16.2018.11.05.22.14.29; Mon, 05 Nov 2018 22:14:45 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=virtuozzo.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387472AbeKFPhk (ORCPT + 99 others); Tue, 6 Nov 2018 10:37:40 -0500 Received: from relay.sw.ru ([185.231.240.75]:53096 "EHLO relay.sw.ru" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387393AbeKFPhk (ORCPT ); Tue, 6 Nov 2018 10:37:40 -0500 Received: from [172.16.24.21] by relay.sw.ru with esmtp (Exim 4.90_1) (envelope-from ) id 1gJuch-0002Eb-4m; Tue, 06 Nov 2018 09:13:59 +0300 From: Vasily Averin Subject: [PATCH] ext4: remove code duplication in free_ind_block() To: linux-ext4@vger.kernel.org, Theodore Ts'o , Andreas Dilger Cc: linux-kernel@vger.kernel.org Message-ID: Date: Tue, 6 Nov 2018 09:13:57 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.2.1 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org free_ind_block(), free_dind_blocks() and free_tind_blocks() are replaced by a single recursive function. Signed-off-by: Vasily Averin --- fs/ext4/migrate.c | 115 +++++++++++++--------------------------------- 1 file changed, 32 insertions(+), 83 deletions(-) diff --git a/fs/ext4/migrate.c b/fs/ext4/migrate.c index 224e136d1c10..754f172b18d4 100644 --- a/fs/ext4/migrate.c +++ b/fs/ext4/migrate.c @@ -157,100 +157,43 @@ static int extend_credit_for_blkdel(handle_t *handle, struct inode *inode) return retval; } -static int free_dind_blocks(handle_t *handle, - struct inode *inode, __le32 i_data) +static int free_ind_blocks(handle_t *handle, + struct inode *inode, __le32 i_data, int ind) { - int i; - __le32 *tmp_idata; - struct buffer_head *bh; - unsigned long max_entries = inode->i_sb->s_blocksize >> 2; - - bh = sb_bread(inode->i_sb, le32_to_cpu(i_data)); - if (!bh) - return -EIO; - - tmp_idata = (__le32 *)bh->b_data; - for (i = 0; i < max_entries; i++) { - if (tmp_idata[i]) { - extend_credit_for_blkdel(handle, inode); - ext4_free_blocks(handle, inode, NULL, - le32_to_cpu(tmp_idata[i]), 1, - EXT4_FREE_BLOCKS_METADATA | - EXT4_FREE_BLOCKS_FORGET); - } - } - put_bh(bh); - extend_credit_for_blkdel(handle, inode); - ext4_free_blocks(handle, inode, NULL, le32_to_cpu(i_data), 1, - EXT4_FREE_BLOCKS_METADATA | - EXT4_FREE_BLOCKS_FORGET); - return 0; -} - -static int free_tind_blocks(handle_t *handle, - struct inode *inode, __le32 i_data) -{ - int i, retval = 0; - __le32 *tmp_idata; - struct buffer_head *bh; - unsigned long max_entries = inode->i_sb->s_blocksize >> 2; - - bh = sb_bread(inode->i_sb, le32_to_cpu(i_data)); - if (!bh) - return -EIO; - - tmp_idata = (__le32 *)bh->b_data; - for (i = 0; i < max_entries; i++) { - if (tmp_idata[i]) { - retval = free_dind_blocks(handle, - inode, tmp_idata[i]); - if (retval) { - put_bh(bh); - return retval; + if (ind > 0) { + int retval = 0; + __le32 *tmp_idata; + ext4_lblk_t i, max_entries; + struct buffer_head *bh; + + bh = sb_bread(inode->i_sb, le32_to_cpu(i_data)); + if (!bh) + return -EIO; + + tmp_idata = (__le32 *)bh->b_data; + max_entries = inode->i_sb->s_blocksize >> 2; + for (i = 0; i < max_entries; i++) { + if (tmp_idata[i]) { + retval = free_ind_blocks(handle, + inode, tmp_idata[i], ind - 1); + if (retval) { + put_bh(bh); + return retval; + } } } + put_bh(bh); } - put_bh(bh); extend_credit_for_blkdel(handle, inode); ext4_free_blocks(handle, inode, NULL, le32_to_cpu(i_data), 1, - EXT4_FREE_BLOCKS_METADATA | - EXT4_FREE_BLOCKS_FORGET); - return 0; -} - -static int free_ind_block(handle_t *handle, struct inode *inode, __le32 *i_data) -{ - int retval; - - /* ei->i_data[EXT4_IND_BLOCK] */ - if (i_data[0]) { - extend_credit_for_blkdel(handle, inode); - ext4_free_blocks(handle, inode, NULL, - le32_to_cpu(i_data[0]), 1, - EXT4_FREE_BLOCKS_METADATA | - EXT4_FREE_BLOCKS_FORGET); - } - - /* ei->i_data[EXT4_DIND_BLOCK] */ - if (i_data[1]) { - retval = free_dind_blocks(handle, inode, i_data[1]); - if (retval) - return retval; - } - - /* ei->i_data[EXT4_TIND_BLOCK] */ - if (i_data[2]) { - retval = free_tind_blocks(handle, inode, i_data[2]); - if (retval) - return retval; - } + EXT4_FREE_BLOCKS_METADATA | EXT4_FREE_BLOCKS_FORGET); return 0; } static int ext4_ext_swap_inode_data(handle_t *handle, struct inode *inode, struct inode *tmp_inode) { - int retval; + int i, retval; __le32 i_data[3]; struct ext4_inode_info *ei = EXT4_I(inode); struct ext4_inode_info *tmp_ei = EXT4_I(tmp_inode); @@ -307,7 +250,13 @@ static int ext4_ext_swap_inode_data(handle_t *handle, struct inode *inode, * We mark the inode dirty after, because we decrement the * i_blocks when freeing the indirect meta-data blocks */ - retval = free_ind_block(handle, inode, i_data); + for (i = 0; i < ARRAY_SIZE(i_data); i++) { + if (i_data[i]) { + retval = free_ind_blocks(handle, inode, i_data[i], i); + if (retval) + break; + } + } ext4_mark_inode_dirty(handle, inode); err_out: -- 2.17.1