From nobody Fri Jul 24 04:48:26 2026 Received: from mail-pj1-f48.google.com (mail-pj1-f48.google.com [209.85.216.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9491B39D6E5 for ; Thu, 23 Jul 2026 19:35:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784835351; cv=none; b=n1uj/RDpvB8nebjix5Jny/BlHcbKRfY8q2GRf4xxFvYSVUBvMRR8GEK5hkFraWopwHaQCrOfbN0yn17K1Mqa6fVeunUHbA4rk5IE1Py6TnLT4/aYbECpypUBBl2ODaC5wv86/P8nD5kGUUM00g0Ryj/l1iuaAv6eBd52kPtEo4c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784835351; c=relaxed/simple; bh=sVN6G1UW1uG0V+ihsBWsemrWrV0fqznYQ6TebiG7jEk=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=tDDmFAu6YOuub0/O8qql9ZC0MrtDeWQt7wxD5E2tIOqbrRESgNYAxweuQ3C+LuIjOWmQQeYyQuGY2SVej447vbhCHgiOUaY+FoDREiRSpQZ3adupfKCwo8lk2ptKo200tkYJ9mMWMreNqg+mdxvY8ssAWwq4xsx5pgD6zIqy+lA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=m+rlPaN5; arc=none smtp.client-ip=209.85.216.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="m+rlPaN5" Received: by mail-pj1-f48.google.com with SMTP id 98e67ed59e1d1-38101f85591so806168a91.1 for ; Thu, 23 Jul 2026 12:35:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784835349; x=1785440149; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to:content-type; bh=Mmxp41kA5FHa5x1u6tdJJJL0q36Az2Yj3WnRD1lYAZg=; b=m+rlPaN5BRAfyw9MJ7oTU/K/du81AD9z9m8nES7/o2HzOCuqhpRMxxOfwGM+/veLxd wKzwxWGO88N07k+qO1r4ZInG4b2eBWwgOCh4WZjTWLrPv5hIU0W0ZyebChhA78VAz0m8 iQMuscPs8elW8VJQKivD9bhizAa4v+md4cKY5kG6yv1nBsq+1jpj4YQ0qI+KBinJDbPl jMpg9EChF2VA3mnfOvy3Xb6mX/pjZNtNwHuGWMBA9zB6HoIVzC49BrwbPE7LTf7T/nNS NnBoIjak46FL80VPNPLsyf9pTuUWoAQ01iOZSJGxrPvvKeyDiv/XuihcGjH/jJgLf40w ESfA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784835349; x=1785440149; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=Mmxp41kA5FHa5x1u6tdJJJL0q36Az2Yj3WnRD1lYAZg=; b=d6pJ8ZrnPiRuDdodA4Klg/hRVH5GHZl5X9kx/++3pFNBa0tKLuPajV08qxXc7RX3Ns /bgOUsM09GfRoOs9heP81sLYpp9KwSf/Te0blD7ltHHQhrM+SAncGY1Y71PB1GaAn4SD REoL47krbm+9kEV8aSZYEqX1qTbpKnajHOW8rUvxhCY7aMm5bigj663Ng+dxA/X4/VO6 4hO7KgQZtGDXUzn9sU8yxupWfXYQ0yp/cbQ2GPuTlfVE5mObWZVGMTBBVuhqDk0rXOPe jvMokdlkWL3d4jjYZOfQaHjDsxl0isKZwQjchQCn8Varxxr6p2iAraBf9Z9al1qNqjRM 5j4g== X-Gm-Message-State: AOJu0Yx8FyRqho1piAHDXSYuEzv/YLpTE2wwTRcBcsCfl8nLC+LCVDKd bejoAsmeYdh2n0Y6JIXy8ulxEwKIxkyltzSqsQWQiQA3oeHezGwdRLcUDoUDPg== X-Gm-Gg: AR+sD13WRsYQmGhe55aW2lXWbtwaJYdONn+9ZeJaO5TRbSLWXkUiIogpyDFhKwF61rp OXduZhzOk8J4lgaQSUMvXx0bqjqz0p+tetaCPbx1sb0HLmRn/Bk7UbnzgODDR/Bo/fm1MZBhipC B4EsrmL4TUaVCPp2IfC8JLaNP31aoBLTfAzmbUFiulQtOUzwVahIjlQwviE1H6zW3JDqeukM+D1 bynFFiM9csTB9op/ItvxifROx96IteS3s7U9wc7svmBc47cQ6QSozIlqKwqu1EBB83FhN0y0SAW 97ttYacC+IDSgBzBthyIZ2eI/XaKuVPNBVQKegBEvA56+wq8WjmQ9/RzWMNEYF6aw8zTsfNvdDN IFDym6x3HcCq+Ir8SBCyMKnKNIjo6Ow/yRh8zSQbDC551Q2XFbuVLJu0x0c0TXN40AzYhWt8gCA J8QIBtNCS//tpTQFaiX/n9Ou1BTMH+Pe5jswuHowycMrx6wm5R67jo9xh1BKsERXzJq+UPpXkfy tXXybuTTnDUrTuEnPeZtq+0ObyUsw== X-Received: by 2002:a17:90b:5103:b0:380:8bb9:aba9 with SMTP id 98e67ed59e1d1-38ec839714emr4436392a91.3.1784835348677; Thu, 23 Jul 2026 12:35:48 -0700 (PDT) Received: from daehojeong-desktop.mtv.corp.google.com ([2a00:79e0:2e7c:8:8f80:8150:b723:2d96]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-13d130cc5ebsm23940500c88.12.2026.07.23.12.35.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Jul 2026 12:35:47 -0700 (PDT) From: Daeho Jeong To: linux-kernel@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, kernel-team@android.com Cc: Daeho Jeong Subject: [PATCH] fsck.f2fs: handle find_next_free_block failure gracefully Date: Thu, 23 Jul 2026 12:35:44 -0700 Message-ID: <20260723193544.2462174-1-daeho43@gmail.com> X-Mailer: git-send-email 2.55.0.229.g6434b31f56-goog Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Daeho Jeong When find_next_free_block() fails to allocate a free block, callers like move_one_curseg_info(), reserve_new_block(), and update_block() previously crashed via ASSERT(). Replace these ASSERT() calls with proper error propagation to gracefully abort FSCK execution instead of crashing. Signed-off-by: Daeho Jeong --- fsck/fsck.c | 22 +++++++++++++++------- fsck/fsck.h | 8 ++++---- fsck/main.c | 4 +++- fsck/mount.c | 28 ++++++++++++++++++---------- fsck/segment.c | 8 ++++---- 5 files changed, 44 insertions(+), 26 deletions(-) diff --git a/fsck/fsck.c b/fsck/fsck.c index db44f9d..b128617 100644 --- a/fsck/fsck.c +++ b/fsck/fsck.c @@ -2972,13 +2972,15 @@ int check_curseg_offsets(struct f2fs_sb_info *sbi, = bool check_wp) return 0; } =20 -static void fix_curseg_info(struct f2fs_sb_info *sbi, bool check_wp) +static int fix_curseg_info(struct f2fs_sb_info *sbi, bool check_wp) { - int i, need_update =3D 0; + int i, need_update =3D 0, ret; =20 for (i =3D 0; i < NO_CHECK_TYPE; i++) { if (check_curseg_offset(sbi, i, check_wp)) { - update_curseg_info(sbi, i); + ret =3D update_curseg_info(sbi, i); + if (ret) + return ret; need_update =3D 1; } } @@ -2987,6 +2989,7 @@ static void fix_curseg_info(struct f2fs_sb_info *sbi,= bool check_wp) write_curseg_info(sbi); flush_curseg_sit_entries(sbi); } + return 0; } =20 int check_sit_types(struct f2fs_sb_info *sbi) @@ -3595,23 +3598,28 @@ static void fix_wp_sit_alignment(struct f2fs_sb_inf= o *UNUSED(sbi)) * Check and fix consistency with write pointers at the beginning of * fsck so that following writes by fsck do not fail. */ -void fsck_chk_and_fix_write_pointers(struct f2fs_sb_info *sbi) +int fsck_chk_and_fix_write_pointers(struct f2fs_sb_info *sbi) { struct f2fs_fsck *fsck =3D F2FS_FSCK(sbi); + int ret =3D 0; =20 if (c.zoned_model !=3D F2FS_ZONED_HM) - return; + return 0; =20 if (c.fix_on) { flush_nat_journal_entries(sbi); flush_sit_journal_entries(sbi); =20 - if (check_curseg_offsets(sbi, true)) - fix_curseg_info(sbi, true); + if (check_curseg_offsets(sbi, true)) { + ret =3D fix_curseg_info(sbi, true); + if (ret) + return ret; + } =20 fix_wp_sit_alignment(sbi); fsck->chk.wp_fixed =3D 1; } + return 0; } =20 int fsck_chk_curseg_info(struct f2fs_sb_info *sbi) diff --git a/fsck/fsck.h b/fsck/fsck.h index 05daa2d..ec37e08 100644 --- a/fsck/fsck.h +++ b/fsck/fsck.h @@ -190,7 +190,7 @@ int fsck_chk_inline_dentries(struct f2fs_sb_info *, str= uct f2fs_node *, void fsck_chk_checkpoint(struct f2fs_sb_info *sbi); void fsck_update_sb_flags(struct f2fs_sb_info *sbi); int fsck_chk_meta(struct f2fs_sb_info *sbi); -void fsck_chk_and_fix_write_pointers(struct f2fs_sb_info *); +int fsck_chk_and_fix_write_pointers(struct f2fs_sb_info *sbi); int fsck_chk_curseg_info(struct f2fs_sb_info *); void pretty_print_filename(const u8 *raw_name, u32 len, char out[F2FS_PRINT_NAMELEN], int enc_name); @@ -227,11 +227,11 @@ extern int f2fs_find_fsync_inode(struct f2fs_sb_info = *, struct list_head *); extern void f2fs_destroy_fsync_dnodes(struct list_head *); =20 extern void flush_journal_entries(struct f2fs_sb_info *); -extern void update_curseg_info(struct f2fs_sb_info *, int); +extern int update_curseg_info(struct f2fs_sb_info *sbi, int type); extern void zero_journal_entries(struct f2fs_sb_info *); extern void flush_sit_entries(struct f2fs_sb_info *); -extern void move_curseg_info(struct f2fs_sb_info *, u64, int); -extern void move_one_curseg_info(struct f2fs_sb_info *sbi, u64 from, int l= eft, +extern int move_curseg_info(struct f2fs_sb_info *sbi, u64 from, int left); +extern int move_one_curseg_info(struct f2fs_sb_info *sbi, u64 from, int le= ft, int i); extern void write_curseg_info(struct f2fs_sb_info *); extern void save_curseg_warm_node_info(struct f2fs_sb_info *); diff --git a/fsck/main.c b/fsck/main.c index 08d38d8..460e4db 100644 --- a/fsck/main.c +++ b/fsck/main.c @@ -985,7 +985,9 @@ static int do_fsck(struct f2fs_sb_info *sbi) if (c.roll_forward && c.zoned_model =3D=3D F2FS_ZONED_HM) save_curseg_warm_node_info(sbi); =20 - fsck_chk_and_fix_write_pointers(sbi); + ret =3D fsck_chk_and_fix_write_pointers(sbi); + if (ret) + return FSCK_OPERATIONAL_ERROR; =20 fsck_chk_curseg_info(sbi); =20 diff --git a/fsck/mount.c b/fsck/mount.c index 6f640a0..85ed404 100644 --- a/fsck/mount.c +++ b/fsck/mount.c @@ -3159,7 +3159,7 @@ next_segment: return -1; } =20 -void move_one_curseg_info(struct f2fs_sb_info *sbi, u64 from, int left, +int move_one_curseg_info(struct f2fs_sb_info *sbi, u64 from, int left, int i) { struct f2fs_super_block *sb =3D F2FS_RAW_SUPER(sbi); @@ -3171,7 +3171,7 @@ void move_one_curseg_info(struct f2fs_sb_info *sbi, u= 64 from, int left, =20 if ((get_sb(feature) & F2FS_FEATURE_RO)) { if (i !=3D CURSEG_HOT_DATA && i !=3D CURSEG_HOT_NODE) - return; + return 0; =20 if (i =3D=3D CURSEG_HOT_DATA) { left =3D 0; @@ -3191,7 +3191,10 @@ bypass_ssa: to =3D from; ret =3D find_next_free_block(sbi, &to, left, i, c.zoned_model =3D=3D F2FS_ZONED_HM); - ASSERT(ret =3D=3D 0); + if (ret) { + ERR_MSG("Failed to find next free block for curseg[%d]\n", i); + return ret; + } =20 old_segno =3D curseg->segno; curseg->segno =3D GET_SEGNO(sbi, to); @@ -3211,22 +3214,27 @@ bypass_ssa: =20 FIX_MSG("Move curseg[%d] %x -> %x after %"PRIx64"\n", i, old_segno, curseg->segno, from); + return 0; } =20 -void move_curseg_info(struct f2fs_sb_info *sbi, u64 from, int left) +int move_curseg_info(struct f2fs_sb_info *sbi, u64 from, int left) { - int i; + int i, ret; =20 /* update summary blocks having nullified journal entries */ - for (i =3D 0; i < NO_CHECK_TYPE; i++) - move_one_curseg_info(sbi, from, left, i); + for (i =3D 0; i < NO_CHECK_TYPE; i++) { + ret =3D move_one_curseg_info(sbi, from, left, i); + if (ret) + return ret; + } + return 0; } =20 -void update_curseg_info(struct f2fs_sb_info *sbi, int type) +int update_curseg_info(struct f2fs_sb_info *sbi, int type) { if (!relocate_curseg_offset(sbi, type)) - return; - move_one_curseg_info(sbi, SM_I(sbi)->main_blkaddr, 0, type); + return 0; + return move_one_curseg_info(sbi, SM_I(sbi)->main_blkaddr, 0, type); } =20 void zero_journal_entries(struct f2fs_sb_info *sbi) diff --git a/fsck/segment.c b/fsck/segment.c index 96de22a..46dc747 100644 --- a/fsck/segment.c +++ b/fsck/segment.c @@ -70,8 +70,8 @@ int reserve_new_block(struct f2fs_sb_info *sbi, block_t *= to, } =20 if (find_next_free_block(sbi, &blkaddr, left, type, false)) { - ERR_MSG("Can't find free block"); - ASSERT(0); + ERR_MSG("Can't find free block\n"); + return -ENOSPC; } =20 se =3D get_seg_entry(sbi, GET_SEGNO(sbi, blkaddr)); @@ -789,8 +789,8 @@ int update_block(struct f2fs_sb_info *sbi, void *buf, u= 32 *blkaddr, =20 new_blkaddr =3D SM_I(sbi)->main_blkaddr; if (find_next_free_block(sbi, &new_blkaddr, 0, type, false)) { - ERR_MSG("Can't find free block for the update"); - ASSERT(0); + ERR_MSG("Can't find free block for the update\n"); + return -ENOSPC; } =20 ret =3D dev_write_block(buf, new_blkaddr, f2fs_io_type_to_rw_hint(type)); --=20 2.55.0.229.g6434b31f56-goog