From patchwork Tue Sep 23 07:02:32 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Monakhov X-Patchwork-Id: 392242 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 8283714007B for ; Tue, 23 Sep 2014 17:02:44 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751713AbaIWHCn (ORCPT ); Tue, 23 Sep 2014 03:02:43 -0400 Received: from mailhub.sw.ru ([195.214.232.25]:46447 "EHLO relay.sw.ru" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751641AbaIWHCm (ORCPT ); Tue, 23 Sep 2014 03:02:42 -0400 Received: from mct-mail.qa.sw.ru ([10.29.1.112]) by relay.sw.ru (8.13.4/8.13.4) with ESMTP id s8N72YCn007981; Tue, 23 Sep 2014 11:02:37 +0400 (MSK) From: Dmitry Monakhov To: linux-ext4@vger.kernel.org Cc: Dmitry Monakhov Subject: [PATCH 3/3] ext4: optimize block allocation on grow indepth Date: Tue, 23 Sep 2014 11:02:32 +0400 Message-Id: <1411455752-2332-3-git-send-email-dmonakhov@openvz.org> X-Mailer: git-send-email 1.7.7.6 In-Reply-To: <1411455752-2332-1-git-send-email-dmonakhov@openvz.org> References: <1411455752-2332-1-git-send-email-dmonakhov@openvz.org> Sender: linux-ext4-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org It is reasonable to prepent newly created index to older one. Signed-off-by: Dmitry Monakhov --- fs/ext4/extents.c | 15 ++++++++++++--- 1 files changed, 12 insertions(+), 3 deletions(-) diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 8170b32..37267ea 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c @@ -1268,11 +1268,20 @@ static int ext4_ext_grow_indepth(handle_t *handle, struct inode *inode, { struct ext4_extent_header *neh; struct buffer_head *bh; - ext4_fsblk_t newblock; + ext4_fsblk_t newblock, goal = 0; + struct ext4_super_block *es = EXT4_SB(inode->i_sb)->s_es; int err = 0; - newblock = ext4_ext_new_meta_block(handle, inode, NULL, - newext, &err, flags); + /* Try to prepend new index to old one */ + if (ext_depth(inode)) + goal = ext4_idx_pblock(EXT_FIRST_INDEX(ext_inode_hdr(inode))); + if (goal > le32_to_cpu(es->s_first_data_block)) { + flags |= EXT4_MB_HINT_TRY_GOAL; + goal--; + } else + goal = ext4_inode_to_goal_block(inode); + newblock = ext4_new_meta_blocks(handle, inode, goal, flags, + NULL, &err); if (newblock == 0) return err;