From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pj1-f47.google.com (mail-pj1-f47.google.com [209.85.216.47]) (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 DD3C3405ACD for ; Tue, 31 Mar 2026 15:24:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.47 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774970677; cv=none; b=mfyrfFefsbJxG8PdIri7IbZIyI9CEeSLY0LrcSJ+YbGHv6nKD4gD9RcBo4/EYKyn+i2SUcgjCtFwlTOTFMjF1NEGsPftI1JZxKrI2CC0o79Trm1IWhcbN5fp7FbDVbSm/NDcNXTIwfy6cvI34uH6zHwnI3yxoG+QhDqH8RD88Ek= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774970677; c=relaxed/simple; bh=8WSaaTQrVT1tEvF+LPBXcvUJC4QWFdhM56n47zDvt8M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=LuP9bg8PHC3Tt4OYA/Xspm9Gu6VVQ33m16sZdnhGcWygzX/7LGtxS//Mnw1yzIllRW+KuFYSNIeFC7BfSDn3rMdX8yEhHnNclZqdnoS0Dk73RAmtx/BAsyZayfWVOrF0TyJvF33FRmlE5d5nKKaWb2GNGmzOrULwoFzCD4sNNyQ= 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=NqGH3gCD; arc=none smtp.client-ip=209.85.216.47 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="NqGH3gCD" Received: by mail-pj1-f47.google.com with SMTP id 98e67ed59e1d1-35d9b4f93f0so467701a91.3 for ; Tue, 31 Mar 2026 08:24:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774970675; x=1775575475; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=wSjL61USwcQJ1wIuLmTxtI1CzuBhlv8ZgrHUillsx5w=; b=NqGH3gCDp1T6Xhp5eem9rc/5up4iLJhv2sasRFQtGp63SfyfT6fGdBzvUxeL8yH5il seRA5fep8SG2UBnLo3ZZiHY/xqOLV+mDUhAQackun7qgLeVYtv0X8u2JCTL6YpHxORcW qax4f2EZayk+qLSOslUXHbOOmY4ZDseqhmtF+50iK+d5YoNTLfprtZLLVL9TLJpKf+yi NRNL8IAQklAuM3AffGkTqZ4FYXMBj+UiSnHbAg/CkGDojM1jq3jbz1+44zQqmNZWELSL Nxoluq15IaqtJr43+LvcJ+mA3M44U03f2gWMdFoK791MlmcdRS1RNY6Jl2Xlq6P0in4c P7sg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774970675; x=1775575475; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=wSjL61USwcQJ1wIuLmTxtI1CzuBhlv8ZgrHUillsx5w=; b=klKSUr1/xVomqCCcYeEbdpedbVb4afMgneUTEJf2O0B/6RgB0VEGJBe6+Pbv67Ac0+ jbWyQon628X8eXTrTnLZlCNdBaD6PdIUAjbxhK3P/axxYysOaJL6N0b2rwnnByioxHo0 l7SH0TFazBKWsD2j9G0dLVVGyIoOfqkC1blXyHZJcavfOQXnTn5Wq41MLe8ED+xXmE3Y kXWYs3Zx7aY3+zaDv0SLOGWl/lcQQ2msEHcr+68IEDbmgxmb4VGQ6DIZU8vaoQvDCHCH 9nx/19DnPlbC9X7Kqh69xnJ4Dwi5bv8gKJRB7uhq5GqqB6772cSNtOLuKyg1m4KBwX4u D3zg== X-Forwarded-Encrypted: i=1; AJvYcCUnRu6H0FKBB3K+kA3yCTFJP6C4q3VQ09ee1abeqiL7ABZGamwukEYAXjqYSZILDCbz/WflYgCc5bQeJkQ=@vger.kernel.org X-Gm-Message-State: AOJu0YzviN8hpWbmvCPUf1+Z5CkVPFkQ2K1VG7iEkaHCQOTOlCOI6Zqn 743XcrjEMopXG4A1YLr0YSCOLYJAGTBdSJ02WJbSDEKpKm2kY5sre+d4 X-Gm-Gg: ATEYQzxCvROwE8HUlYINEsy3Aa9Nbi/gupm8iiLNvy6Yw3LK88W8yFcYlfHnY3/4V09 8GBJxYPZ0sfqf3K/k1OrR0Ut7KYlcHoPjSfeE/PqH4RfGC8vyeLd83nEqDGFLtUDbq3qDikXLwD zMiYgdPaZbpsGNhcM6lUUFBqCSXxl91JgbsndJ7JagNuQtSSthn2tY2AxBAn9UCZA1uxYOVmhcU Kwx6Yn8hcznDEVSTpfokZFzVF0ZNd/xqiTjle4OHXdENvuEY/zqMXrUv2azFMXQhlx+2fd5SvrM 3mNLfhWJiBTWPK7+JBjOUyCN2qN0BfJdSmuV9h2Znn9HwjHx6Gn3LRhhMRGKK4pO8tMp6I9E5Lr YuTou2Ew0aWAhrFBQ3YNT2zlyrNdWzna1sOD/7QIoeuQ7S+Py5YiDdFYBRgl8r6OWh2SqfMiCfc n7wsyFDMHvDQK08pVulVOn15BGOF8tJNJSNY/1mozF X-Received: by 2002:a17:90b:4cc6:b0:35b:93d8:6ab9 with SMTP id 98e67ed59e1d1-35c300c22cfmr9471276a91.3.1774970675122; Tue, 31 Mar 2026 08:24:35 -0700 (PDT) Received: from kt5965-NUC8i3BEH.. ([182.217.14.201]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-35dbe6953a8sm2111709a91.12.2026.03.31.08.24.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Mar 2026 08:24:34 -0700 (PDT) From: kth5965@gmail.com To: Chao Yu , jaegeuk@kernel.org, linux-f2fs-devel@lists.sourceforge.net Cc: syzbot+fc026e87558558f75c00@syzkaller.appspotmail.com, linux-kernel@vger.kernel.org Subject: Re: [f2fs-dev] [PATCH v2] f2fs: evict: truncate page cache before clear_inode Date: Wed, 1 Apr 2026 00:24:29 +0900 Message-ID: <20260331152429.163173-1-kth5965@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <37c11065-e055-41b8-82a8-68f2fdf56ac3@kernel.org> References: <37c11065-e055-41b8-82a8-68f2fdf56ac3@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sorry for the late reply. I worked in that direction, and the fix ended up touching a bit more than I first expected. One part that grew a bit was the empty/no-data inline conversion side. To handle that case cleanly, I ended up consolidating part of the inline-state teardown so the no-data path and the normal inline-conversion cleanup follow the same path. This also lets f2fs_convert_inline_inode() avoid grabbing folio #0 in the empty inline case. With the current version, the reproducer no longer reaches the late clear_inode() BUG and instead fails earlier with Failed to read root inode. If you think that cleanup change should be trimmed or split out, please let me know. The current diff is below. diff --git a/fs/f2fs/inline.c b/fs/f2fs/inline.c index 0a1052d5ee62..89e8a0fbb923 100644 --- a/fs/f2fs/inline.c +++ b/fs/f2fs/inline.c @@ -53,8 +53,8 @@ bool f2fs_sanity_check_inline_data(struct inode *inode, struct folio *ifolio) if (!f2fs_has_inline_data(inode)) return false; - if (inode_has_blocks(inode, ifolio)) - return false; + if (!f2fs_exist_data(inode) && inode_has_blocks(inode, ifolio)) + return true; if (!support_inline_data(inode)) return true; @@ -142,6 +142,17 @@ int f2fs_read_inline_data(struct inode *inode, struct folio *folio) return 0; } +static void f2fs_clear_inline_inode(struct dnode_of_data *dn) +{ + f2fs_folio_wait_writeback(dn->inode_folio, NODE, true, true); + clear_inode_flag(dn->inode, FI_DATA_EXIST); + stat_dec_inline_inode(dn->inode); + clear_inode_flag(dn->inode, FI_INLINE_DATA); + set_raw_inline(dn->inode, F2FS_INODE(dn->inode_folio)); + folio_mark_dirty(dn->inode_folio); + folio_clear_f2fs_inline(dn->inode_folio); +} + int f2fs_convert_inline_folio(struct dnode_of_data *dn, struct folio *folio) { struct f2fs_io_info fio = { @@ -157,8 +168,10 @@ int f2fs_convert_inline_folio(struct dnode_of_data *dn, struct folio *folio) struct node_info ni; int dirty, err; - if (!f2fs_exist_data(dn->inode)) - goto clear_out; + if (!f2fs_exist_data(dn->inode)) { + f2fs_clear_inline_inode(dn); + goto out; + } err = f2fs_reserve_block(dn, 0); if (err) return err; @@ -206,10 +219,8 @@ int f2fs_convert_inline_folio(struct dnode_of_data *dn, struct folio *folio) /* clear inline data and flag after data writeback */ f2fs_truncate_inline_inode(dn->inode, dn->inode_folio, 0); - folio_clear_f2fs_inline(dn->inode_folio); -clear_out: - stat_dec_inline_inode(dn->inode); - clear_inode_flag(dn->inode, FI_INLINE_DATA); + f2fs_clear_inline_inode(dn); +out: f2fs_put_dnode(dn); return 0; } @@ -219,7 +230,7 @@ int f2fs_convert_inline_inode(struct inode *inode) struct f2fs_sb_info *sbi = F2FS_I_SB(inode); struct dnode_of_data dn; struct f2fs_lock_context lc; - struct folio *ifolio, *folio; + struct folio *ifolio, *folio = NULL; int err = 0; if (f2fs_hw_is_readonly(sbi) || f2fs_readonly(sbi->sb)) return -EROFS; @@ -232,9 +243,13 @@ int f2fs_convert_inline_inode(struct inode *inode) if (err) return err; - folio = f2fs_grab_cache_folio(inode->i_mapping, 0, false); - if (IS_ERR(folio)) - return PTR_ERR(folio); + if (f2fs_exist_data(inode)) { + folio = f2fs_grab_cache_folio(inode->i_mapping, 0, false); + if (IS_ERR(folio)) + return PTR_ERR(folio); + } + + set_new_dnode(&dn, inode, NULL, NULL, 0); f2fs_lock_op(sbi, &lc); @@ -249,11 +264,11 @@ int f2fs_convert_inline_inode(struct inode *inode) if (f2fs_has_inline_data(inode)) err = f2fs_convert_inline_folio(&dn, folio); - f2fs_put_dnode(&dn); out: + f2fs_put_dnode(&dn); f2fs_unlock_op(sbi, &lc); - - f2fs_folio_put(folio, true); + if (folio) + f2fs_folio_put(folio, true); if (!err) f2fs_balance_fs(sbi, dn.node_changed);