From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932762AbcFBMHj (ORCPT ); Thu, 2 Jun 2016 08:07:39 -0400 Received: from mail.chinanetcenter.com ([123.103.13.31]:45077 "EHLO chinanetcenter.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S932344AbcFBMHi (ORCPT ); Thu, 2 Jun 2016 08:07:38 -0400 X-Greylist: delayed 309 seconds by postgrey-1.27 at vger.kernel.org; Thu, 02 Jun 2016 08:07:37 EDT From: Lin Feng To: tytso@mit.edu, adilger.kernel@dilger.ca Cc: linux-ext4@vger.kernel.org, linux-kernel@vger.kernel.org, Lin Feng Subject: [PATCH] ext4: mballoc.c: fix ac_g_ex and ac_f_ex misuse bug in EXT4_MB_HINT_TRY_GOAL path Date: Thu, 2 Jun 2016 20:01:38 +0800 Message-Id: <1464868898-31336-1-git-send-email-linf@chinanetcenter.com> X-Mailer: git-send-email 1.9.3 X-CM-TRANSID: AQAAf0CpsGAjIFBXWd2SAA--.1225S2 X-Coremail-Antispam: 1UD129KBjvJXoW7KFyUGr4fuF4Dtw1xXr1fJFb_yoW8Ar48pF s3XFnxGr4fWw18uFWku3Z8Ww1Fkw4xGr18Ar1Fyr18ury7JFW8Ca1Dta4rCF9rGrZayasx Za1Fva1UCFs293DanT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUU2F1xkIjI8I6I8E6xAIw20EY4v20xvaj40_Wr0E3s1l8cAvFVAK 0II2c7xJM2AIxVAIcxkEcVAq07x20xvEncxIr21l5I8CrVACY4xI64kE6c02F40Ex7xfMc Ij6x8ErcxFaVAv8VW3tr1UJr1lOx8S6xCaFVCjc4AY6r1j6r4UM4x0Y48IcxkI7VAKI48J M4x0x7Aq67IIx4CEVc8vx2IErcIFxwCF04k20xvY0x0EwIxGrwCF04k20xvE74AGY7Cv6c x26FyDJr1UJwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E 67AF67kF1VAFwI0_JF0_Jw1lIxkGc2Ij64vIr4UvcSsGvfC2KfnxnUUI43ZEXa7xUUbHrU UUUUU== X-CM-SenderInfo: holqwqxfkl0t5qhwuvhqwh2hhfrp/ Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Descriptions: ext4 block allocation core stack: ext4_mb_new_blocks ext4_mb_normalize_request ext4_mb_regular_allocator ext4_mb_find_by_goal mb_find_extent(e4b, ac->ac_g_ex.fe_start, ac->ac_g_ex.fe_len, &ex); The start block searching hint for merging(use EXT4_MB_HINT_TRY_GOAL flag) set in ext4_mb_normalize_request is stored in ac_f_ex, while in EXT4_MB_HINT_TRY_GOAL path which falls in ext4_mb_find_by_goal always use ac_g_ex as a hint and the hint set in ext4_mb_normalize_request is never use. We could hit this bug by writing a sparse file from backward mode and the file may get fragments even if the physical blocks in the hole is free, which is expected to be merged into a single extent. Signed-off-by: Lin Feng --- fs/ext4/mballoc.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index c1ab3ec..e31fc63 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c @@ -3198,15 +3198,15 @@ ext4_mb_normalize_request(struct ext4_allocation_context *ac, if (ar->pright && (ar->lright == (start + size))) { /* merge to the right */ ext4_get_group_no_and_offset(ac->ac_sb, ar->pright - size, - &ac->ac_f_ex.fe_group, - &ac->ac_f_ex.fe_start); + &ac->ac_g_ex.fe_group, + &ac->ac_g_ex.fe_start); ac->ac_flags |= EXT4_MB_HINT_TRY_GOAL; } if (ar->pleft && (ar->lleft + 1 == start)) { /* merge to the left */ ext4_get_group_no_and_offset(ac->ac_sb, ar->pleft + 1, - &ac->ac_f_ex.fe_group, - &ac->ac_f_ex.fe_start); + &ac->ac_g_ex.fe_group, + &ac->ac_g_ex.fe_start); ac->ac_flags |= EXT4_MB_HINT_TRY_GOAL; } -- 1.9.3