From: Forrest Liu Subject: Re: [PATCH] ext4: fix extent tree corruption that incurred by hole punch Date: Fri, 7 Dec 2012 20:13:59 +0800 Message-ID: References: <1354623069-8124-1-git-send-email-forrestl@synology.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Cc: "Theodore Ts'o" , ext4 development , Eric Sandeen To: Ashish Sangwan Return-path: Received: from mail-ia0-f174.google.com ([209.85.210.174]:54423 "EHLO mail-ia0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933763Ab2LGMOA (ORCPT ); Fri, 7 Dec 2012 07:14:00 -0500 Received: by mail-ia0-f174.google.com with SMTP id y25so414992iay.19 for ; Fri, 07 Dec 2012 04:13:59 -0800 (PST) In-Reply-To: Sender: linux-ext4-owner@vger.kernel.org List-ID: 2012/12/7 Ashish Sangwan : > On Thu, Dec 6, 2012 at 8:06 PM, Forrest Liu wrote: >> Hi Ashish, >> >> There have a chance to do a trivial update, and this case will be >> covered in ext4_ext_remove_space. >> >> + if (err == 0 && eh->eh_entries == 0 && path[depth].p_bh != NULL) { >> err = ext4_ext_rm_idx(handle, inode, path + depth); >> + /* If this was the first extent index in node, >> + * propagates the ei_block updation info to top */ >> + if(!err) { >> + --depth; >> + path = path + depth; >> + while (--depth >= 0) { >> + if (path->p_idx != EXT_FIRST_INDEX(path->p_hdr)) >> + break; >> + path--; >> + err = ext4_ext_get_access(handle, inode, path); >> + if (err) >> + break; >> >> trivial update, when (path + 1)->p_idx->eh_entries == 0 >> >> + path->p_idx->ei_block =(path + >> 1)->p_idx->ei_block ; >> + err = ext4_ext_dirty(handle, inode, path); >> + if (err) >> + break; >> + } >> + } >> + } >> + >> >> I will trying to reproduce the problem tomorrow. > I think it will work fine atleast till depth = 2. > It would be great if you could check with depth > 2. > If still having this problem, we can think more. Hi Ashish, First, create a file lager than 4GB, and then punch out every even blocks; Use ex command in debugfs to dump extents, belowing is the result. Level Entries Logical Physical Length Flags 0/ 3 1/ 1 1 - 1048575 40013 1048575 1/ 3 1/ 5 1 - 231160 40012 231160 2/ 3 1/340 1 - 680 40011 680 3/ 3 1/340 1 - 1 2228225 - 2228225 1 3/ 3 2/340 3 - 3 2228227 - 2228227 1 3/ 3 3/340 5 - 5 2228229 - 2228229 1 punch out 231159, 231157, ..., 1.. Level Entries Logical Physical Length Flags 0/ 3 1/ 1 1 - 1048575 40013 1048575 1/ 3 1/ 4 231161 - 462320 2457604 231160 2/ 3 1/340 231161 - 231840 2457606 680 3/ 3 1/340 231161 - 231161 2459385 - 2459385 1 Then, we get incorrect logical index, if only do correction in ext4_ext_rm_leaf. Thanks, Forrest