From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751658AbbIKGit (ORCPT ); Fri, 11 Sep 2015 02:38:49 -0400 Received: from mailout1.samsung.com ([203.254.224.24]:57587 "EHLO mailout1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751361AbbIKGis (ORCPT ); Fri, 11 Sep 2015 02:38:48 -0400 X-AuditID: cbfee61b-f79d56d0000048c5-77-55f276f6bc75 From: Chao Yu To: Jaegeuk Kim Cc: linux-f2fs-devel@lists.sourceforge.net, linux-kernel@vger.kernel.org Subject: [PATCH 2/7] f2fs: do in batches truncation in truncate_hole Date: Fri, 11 Sep 2015 14:38:05 +0800 Message-id: <00f201d0ec5c$8274e670$875eb350$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: AdDsXFx+m0ht+Z/jT8C9Bl0FKNfTMA== Content-language: zh-cn X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrJLMWRmVeSWpSXmKPExsVy+t9jAd1vZZ9CDW7M0LB4sn4Ws8WlRe4W l3fNYXNg9ti0qpPNY/eCz0wenzfJBTBHcdmkpOZklqUW6dslcGUs2r6YqeAMX8X8TQdZGhgv cXcxcnBICJhIPH9S1MXICWSKSVy4t54NxBYSWMoosf2hVBcjF5D9ilFiyfUXLCAJNgEVieUd /5lAbBEg+9Ciy+wgNrOAh0Rjx3dWEFtYwEWi+fBTdpD5LAKqEvdn+IOEeQUsJbb9WcQGYQtK /Jh8jwWiVUti/c7jTBC2vMTmNW+ZIe5RkNhx9jUjxCo9iUs9E9ggasQlNh65xTKBUWAWklGz kIyahWTULCQtCxhZVjFKpBYkFxQnpeca5aWW6xUn5haX5qXrJefnbmIEB/Az6R2Mh3e5H2IU 4GBU4uG1UP0UKsSaWFZcmXuIUYKDWUmE10AOKMSbklhZlVqUH19UmpNafIhRmoNFSZxXduWz UCGB9MSS1OzU1ILUIpgsEwenVANjVPj2zAdsCcYRE5smW29kE31rNuuGeNyFR/Ol64XC5e7P OVu3yj7lbDH3Qemdt8oCX98P3z1PKEm6/UzN1fZdG6umWaZcWbqz0DmISVX3yIVNdm6fNC58 nfmGYc02383rni5J7v08fa0Cg/i8F1WlyyIuebyZJzJvhX1CxYGzq9U2WbSePb9njxJLcUai oRZzUXEiAA1mfaxcAgAA Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org truncate_data_blocks_range can do in batches truncation which makes all changes in dnode page content, dnode page status, extent cache, block count updating together. But previously, truncate_hole() always truncates one block in dnode page at a time by invoking truncate_data_blocks_range(,1), which make thing slow. This patch changes truncate_hole() to do in batches truncation for all target blocks in one direct node inside truncate_data_blocks_range, which can make our punch hole operation in ->fallocate more efficent. Signed-off-by: Chao Yu --- fs/f2fs/file.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index b2fab9e..ac97f78 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -738,23 +738,33 @@ static int fill_zero(struct inode *inode, pgoff_t index, int truncate_hole(struct inode *inode, pgoff_t pg_start, pgoff_t pg_end) { - pgoff_t index; + pgoff_t count, index = pg_start; int err; - for (index = pg_start; index < pg_end; index++) { + while (index < pg_end) { struct dnode_of_data dn; + pgoff_t end_offset; set_new_dnode(&dn, inode, NULL, NULL, 0); err = get_dnode_of_data(&dn, index, LOOKUP_NODE); if (err) { - if (err == -ENOENT) + if (err == -ENOENT) { + index = PGOFS_OF_NEXT_DNODE(index, + F2FS_I(inode)); continue; + } return err; } - if (dn.data_blkaddr != NULL_ADDR) - truncate_data_blocks_range(&dn, 1); + end_offset = ADDRS_PER_PAGE(dn.node_page, F2FS_I(inode)); + count = min(end_offset - dn.ofs_in_node, pg_end - index); + + f2fs_bug_on(F2FS_I_SB(inode), count == 0 || count > end_offset); + + truncate_data_blocks_range(&dn, count); f2fs_put_dnode(&dn); + + index += count; } return 0; } -- 2.4.2