[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <alpine.LFD.2.00.1503231138110.1578@localhost.localdomain>
Date: Mon, 23 Mar 2015 11:44:19 +0100 (CET)
From: Lukáš Czerner <lczerner@...hat.com>
To: Eric Whitney <enwlinux@...il.com>
cc: linux-ext4@...r.kernel.org, tytso@....edu
Subject: Re: [PATCH] ext4: fix loss of delalloc extent info in
ext4_zero_range()
On Fri, 20 Mar 2015, Eric Whitney wrote:
> Date: Fri, 20 Mar 2015 19:53:50 -0400
> From: Eric Whitney <enwlinux@...il.com>
> To: linux-ext4@...r.kernel.org
> Cc: tytso@....edu
> Subject: [PATCH] ext4: fix loss of delalloc extent info in ext4_zero_range()
>
> In ext4_zero_range(), removing a file's entire block range from the
> extent status tree removes all records of that file's delalloc extents.
> The delalloc accounting code uses this information, and its loss can
> then lead to accounting errors and kernel warnings at writeback time and
> subsequent file system damage. This is most noticeable on bigalloc
> file systems where code in ext4_ext_map_blocks() handles cases where
> delalloc extents share clusters with a newly allocated extent.
>
> Because we're not deleting a block range and are correctly updating the
> status of its associated extent, there is no need to remove anything
> from the extent status tree.
>
> When this patch is combined with an unrelated bug fix for
> ext4_zero_range(), kernel warnings and e2fsck errors reported during
> xfstests runs on bigalloc filesystems are greatly reduced without
> introducing regressions on other xfstests-bld test scenarios.
Ah, this is my bad sorry. I didn't realize that we're actually
relying on the delayed extent information in the extent status tree
now.
However I remember that I've seen some problems when this extent
removal was not there (see the comment you removed). I am not
entirely sure anymore what it was all about, but I need to retest
with your patch.
Thanks!
-Lukas
>
> Signed-off-by: Eric Whitney <enwlinux@...il.com>
> ---
> fs/ext4/extents.c | 13 -------------
> 1 file changed, 13 deletions(-)
>
> diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
> index bed4308..c187cc3 100644
> --- a/fs/ext4/extents.c
> +++ b/fs/ext4/extents.c
> @@ -4847,19 +4847,6 @@ static long ext4_zero_range(struct file *file, loff_t offset,
> flags, mode);
> if (ret)
> goto out_dio;
> - /*
> - * Remove entire range from the extent status tree.
> - *
> - * ext4_es_remove_extent(inode, lblk, max_blocks) is
> - * NOT sufficient. I'm not sure why this is the case,
> - * but let's be conservative and remove the extent
> - * status tree for the entire inode. There should be
> - * no outstanding delalloc extents thanks to the
> - * filemap_write_and_wait_range() call above.
> - */
> - ret = ext4_es_remove_extent(inode, 0, EXT_MAX_BLOCKS);
> - if (ret)
> - goto out_dio;
> }
> if (!partial_begin && !partial_end)
> goto out_dio;
>
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists