Re: [PATCH] ext4: fix loss of delalloc extent info in ext4_zero_range()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, 20 Mar 2015, Eric Whitney wrote:

> Date: Fri, 20 Mar 2015 19:53:50 -0400
> From: Eric Whitney <enwlinux@xxxxxxxxx>
> To: linux-ext4@xxxxxxxxxxxxxxx
> Cc: tytso@xxxxxxx
> 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@xxxxxxxxx>
> ---
>  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@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Reiser Filesystem Development]     [Ceph FS]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux FS]     [Yosemite National Park]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Device Mapper]     [Linux Media]

  Powered by Linux