RE: [f2fs-dev] [PATCH 04/12] f2fs: remove wrong f2fs_bug_on when merging extents
From: Chao Yu
Date: Mon Jun 29 2015 - 23:01:13 EST
Hi Jaegeuk,
> -----Original Message-----
> From: Jaegeuk Kim [mailto:jaegeuk@xxxxxxxxxx]
> Sent: Tuesday, June 30, 2015 2:39 AM
> To: linux-kernel@xxxxxxxxxxxxxxx; linux-fsdevel@xxxxxxxxxxxxxxx;
> linux-f2fs-devel@xxxxxxxxxxxxxxxxxxxxx
> Cc: Jaegeuk Kim
> Subject: [f2fs-dev] [PATCH 04/12] f2fs: remove wrong f2fs_bug_on when merging extents
>
> In f2fs_update_extent_tree, if there is existing extent, f2fs tries to split
> it with two parts.
> In each trial, __insert_extent_tree checks __is_front/back_mergeable, and then
> if it hits to go, there is f2fs_bug_on(!den), which triggers a kernel panic.
>
> Actually, we don't need to check this. Instead, we can do __try_back_merge only
> when there exists a den pointer.
>
> Signed-off-by: Jaegeuk Kim <jaegeuk@xxxxxxxxxx>
> ---
> fs/f2fs/data.c | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
> index 9bedfa8..7817167 100644
> --- a/fs/f2fs/data.c
> +++ b/fs/f2fs/data.c
> @@ -519,19 +519,19 @@ static struct extent_node *__insert_extent_tree(struct f2fs_sb_info *sbi,
>
> if (ei->fofs < en->ei.fofs) {
> if (__is_front_mergeable(ei, &en->ei)) {
> - f2fs_bug_on(sbi, !den);
I add a BUG_ON here because we assume that in extent cache there is no such
two extents whose mapping address is continuous but without being merged,
since whenever we add a new extent(not splitted one) into cache, we tries to
merge it frontward/backward, then all extent with continuous mapping should be
merged. So when we split one extent to two parts, each part should not be able
to merge with others. Otherwise it should be a bug.
Is there some special case to trigger this BUG_ON?
Thanks,
> en->ei.fofs = ei->fofs;
> en->ei.blk = ei->blk;
> en->ei.len += ei->len;
> - *den = __try_back_merge(sbi, et, en);
> + if (den)
> + *den = __try_back_merge(sbi, et, en);
> return en;
> }
> p = &(*p)->rb_left;
> } else if (ei->fofs >= en->ei.fofs + en->ei.len) {
> if (__is_back_mergeable(ei, &en->ei)) {
> - f2fs_bug_on(sbi, !den);
> en->ei.len += ei->len;
> - *den = __try_front_merge(sbi, et, en);
> + if (den)
> + *den = __try_front_merge(sbi, et, en);
> return en;
> }
> p = &(*p)->rb_right;
> --
> 2.1.1
>
>
> ------------------------------------------------------------------------------
> Don't Limit Your Business. Reach for the Cloud.
> GigeNET's Cloud Solutions provide you with the tools and support that
> you need to offload your IT needs and focus on growing your business.
> Configured For All Businesses. Start Your Cloud Today.
> https://www.gigenetcloud.com/
> _______________________________________________
> Linux-f2fs-devel mailing list
> Linux-f2fs-devel@xxxxxxxxxxxxxxxxxxxxx
> https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/