FAILED: patch "[PATCH] f2fs: fix to clear dirty flag on folio in error path" failed to apply to 6.1-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 6.1-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.1.y
git checkout FETCH_HEAD
git cherry-pick -x 5b86eab84ac8e9289b5afc52ef88ab18ba5bacab
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026090930-scallion-geometry-8ab1@gregkh' --subject-prefix 'PATCH 6.1.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 5b86eab84ac8e9289b5afc52ef88ab18ba5bacab Mon Sep 17 00:00:00 2001
From: Chao Yu <[email protected]>
Date: Wed, 5 Aug 2026 12:29:20 +0000
Subject: [PATCH] f2fs: fix to clear dirty flag on folio in error path
If node block is corrupted due to chksum mismatch or inconsistent footer info, it needs to drop clear flag of node folio, in order to persist inconsistent node data to storage.
fs/f2fs/node.c +1 -1
@@ -1618,7 +1618,7 @@ static struct folio *__get_node_folio(struct f2fs_sb_info *sbi, pgoff_t nid,if (!err)return folio; out_err: -folio_clear_uptodate (folio); +clear_node_folio_dirty (folio); out_put_err:/* ENOENT comes from read_node_folio which is not an error. */ if (err != -ENOENT )
Sasha Levin
maintainerPATCH 1/2 f2fs: Convert clear_node_page_dirty() to clear_node_folio_dirty()
From: "Matthew Wilcox (Oracle)" <[email protected]>
[ Upstream commit f16ebe0de73274fd1cf885b30cc4fe42d2a1821a ]
Both callers have a folio so pass it in, removing five calls to compound_head().
Backport notes for 6.6:
The stable callers and F2FS dirty-tag/superblock helpers still use pages. Convert the existing dirty-node helper to folios, using page_folio() at its callers and the folio's page for the existing F2FS interfaces.
Prepare the existing node-read helpers for the follow-up error-path fix:read_node_folio() accepts a folio, __get_node_folio() returns one, and the public node-page getters retain their page interfaces and error pointers. Keep the stable footer validation inline and arrange its success return and error labels to match the target patch. This preserves the existing validation, locking and reference handling without adding functions or importing the wider upstream node-folio conversion.
Stable-dep-of: 5b86eab84ac8 ("f2fs: fix to clear dirty flag on folio in error path")
--- fs/f2fs/node.c | 53 ++++++++++++++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 23 deletions(-)
fs/f2fs/node.c +30 -23
@@ -123,14 +123,14 @@ bool f2fs_available_free_memory(struct f2fs_sb_info *sbi, int type)return res; } -static void clear_node_page_dirty (struct page *page) +static void clear_node_folio_dirty (struct folio *folio) { -if (PageDirty (page)) { -f2fs_clear_page_cache_dirty_tag (page); -clear_page_dirty_for_io (page); -dec_page_count (F2FS_P_SB (page),F2FS_DIRTY_NODES ); +if (folio_test_dirty (folio)) { +f2fs_clear_page_cache_dirty_tag (&folio->page); +folio_clear_dirty_for_io (folio); +dec_page_count (F2FS_P_SB (&folio->page),F2FS_DIRTY_NODES ); } -ClearPageUptodate (page); +folio_clear_uptodate (folio); }static struct page *get_current_nat_page (struct f2fs_sb_info *sbi,nid_t nid)
@@ -929,7 +929,7 @@ static int truncate_node(struct dnode_of_data *dn)f2fs_inode_synced (dn->inode); } -clear_node_page_dirty (dn->node_page); +clear_node_folio_dirty (page_folio (dn->node_page));set_sbi_flag (sbi,SBI_IS_DIRTY ); index = dn->node_page->index;
@@ -1357,7 +1357,7 @@ struct page *f2fs_new_node_page(struct dnode_of_data *dn, unsigned int ofs)inc_valid_inode_count (sbi);return page; fail: -clear_node_page_dirty (page); +clear_node_folio_dirty (page_folio (page));f2fs_put_page (page,1 );return ERR_PTR (err); }
@@ -1367,8 +1367,9 @@ struct page *f2fs_new_node_page(struct dnode_of_data *dn, unsigned int ofs)* 0: f2fs_put_page(page, 0) * LOCKED_PAGE or error: f2fs_put_page(page, 1) */ -static int read_node_page (struct page *page,blk_opf_t op_flags) +static int read_node_folio (struct folio *folio,blk_opf_t op_flags) { +struct page *page = &folio->page;struct f2fs_sb_info *sbi =F2FS_P_SB (page);struct node_info ni;struct f2fs_io_info fio = {
@@ -1430,14 +1431,15 @@ void f2fs_ra_node_page(struct f2fs_sb_info *sbi, nid_t nid)if (!apage)return ; - err =read_node_page (apage,REQ_RAHEAD ); + err =read_node_folio (page_folio (apage),REQ_RAHEAD );f2fs_put_page (apage, err ?1 :0 ); } -static struct page *__get_node_page (struct f2fs_sb_info *sbi,pgoff_t nid, +static struct folio *__get_node_folio (struct f2fs_sb_info *sbi,pgoff_t nid,struct page *parent,int start) {struct page *page; +struct folio *folio;int err;if (!nid)
@@ -1449,7 +1451,8 @@ static struct page *__get_node_page(struct f2fs_sb_info *sbi, pgoff_t nid,if (!page)return ERR_PTR (-ENOMEM ); - err =read_node_page (page,0 ); + folio =page_folio (page); + err =read_node_folio (folio,0 );if (err <0 ) { goto out_put_err; }else if (err ==LOCKED_PAGE ) {
@@ -1477,20 +1480,21 @@ static struct page *__get_node_page(struct f2fs_sb_info *sbi, pgoff_t nid, goto out_err; } page_hit: -if (likely (nid ==nid_of_node (page))) -return page; - -f2fs_warn (sbi,"inconsistent node block, nid:%lu, node_footer[nid:%u,ino:%u,ofs:%u,cpver:%llu,blkaddr:%u]" , +if (unlikely (nid !=nid_of_node (page))) { +f2fs_warn (sbi,"inconsistent node block, nid:%lu, node_footer[nid:%u,ino:%u,ofs:%u,cpver:%llu,blkaddr:%u]" , nid,nid_of_node (page),ino_of_node (page),ofs_of_node (page),cpver_of_node (page),next_blkaddr_of_node (page)); -set_sbi_flag (sbi,SBI_NEED_FSCK ); -f2fs_handle_error (sbi,ERROR_INCONSISTENT_FOOTER ); - err = -EFSCORRUPTED ; +set_sbi_flag (sbi,SBI_NEED_FSCK ); +f2fs_handle_error (sbi,ERROR_INCONSISTENT_FOOTER ); + err = -EFSCORRUPTED ; + } +if (!err) +return folio; out_err: -ClearPageUptodate (page); +folio_clear_uptodate (folio); out_put_err: -/* ENOENT comes from read_node_page which is not an error. */ +/* ENOENT comes from read_node_folio which is not an error. */ if (err != -ENOENT )f2fs_handle_page_eio (sbi, page->index,NODE );f2fs_put_page (page,1 );
@@ -1499,15 +1503,18 @@ static struct page *__get_node_page(struct f2fs_sb_info *sbi, pgoff_t nid,struct page *f2fs_get_node_page (struct f2fs_sb_info *sbi,pgoff_t nid) { -return __get_node_page (sbi, nid,NULL ,0 ); +struct folio *folio =__get_node_folio (sbi, nid,NULL ,0 ); + +return IS_ERR (folio) ?ERR_CAST (folio) : &folio->page; }struct page *f2fs_get_node_page_ra (struct page *parent,int start) {struct f2fs_sb_info *sbi =F2FS_P_SB (parent);nid_t nid =get_nid (parent, start, false); +struct folio *folio =__get_node_folio (sbi, nid, parent, start); -return __get_node_page (sbi, nid, parent, start); +return IS_ERR (folio) ?ERR_CAST (folio) : &folio->page; }static void flush_inline_data (struct f2fs_sb_info *sbi,nid_t ino)
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 2/2 f2fs: fix to clear dirty flag on folio in error path
From: Chao Yu <[email protected]>
[ Upstream commit 5b86eab84ac8e9289b5afc52ef88ab18ba5bacab ]
If node block is corrupted due to chksum mismatch or inconsistent footer info, it needs to drop clear flag of node folio, in order to persist inconsistent node data to storage.
--- fs/f2fs/node.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/f2fs/node.c +1 -1
@@ -1492,7 +1492,7 @@ static struct folio *__get_node_folio(struct f2fs_sb_info *sbi, pgoff_t nid,if (!err)return folio; out_err: -folio_clear_uptodate (folio); +clear_node_folio_dirty (folio); out_put_err:/* ENOENT comes from read_node_folio which is not an error. */ if (err != -ENOENT )
Signature · 1 line
2.53.0