FAILED: patch "[PATCH] nilfs2: handle inconsistent state in" 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 4811f7af6090e8f5a398fbdd766f903ef6c0d787
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2024072926-epiphany-basis-4f11@gregkh' --subject-prefix 'PATCH 6.1.y' HEAD^..
Possible dependencies:
4811f7af6090 ("nilfs2: handle inconsistent state in nilfs_btnode_create_block()")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 4811f7af6090e8f5a398fbdd766f903ef6c0d787 Mon Sep 17 00:00:00 2001
From: Ryusuke Konishi <[email protected]>
Date: Thu, 25 Jul 2024 14:20:07 +0900
Subject: [PATCH] nilfs2: handle inconsistent state in
nilfs_btnode_create_block()
Syzbot reported that a buffer state inconsistency was detected in nilfs_btnode_create_block(), triggering a kernel bug.
It is not appropriate to treat this inconsistency as a bug; it can occur if the argument block address (the buffer index of the newly created block) is a virtual block number and has been reallocated due to corruption of the bitmap used to manage its allocation state.
So, modify nilfs_btnode_create_block() and its callers to treat it as a possible filesystem error, rather than triggering a kernel bug.
fs/nilfs2/btnode.c +20 -5
@@ -51,12 +51,21 @@ nilfs_btnode_create_block(struct address_space *btnc, __u64 blocknr) bh =nilfs_grab_buffer (inode, btnc, blocknr,BIT (BH_NILFS_Node));if (unlikely (!bh)) -return NULL ; +return ERR_PTR (-ENOMEM );if (unlikely (buffer_mapped (bh) ||buffer_uptodate (bh) ||buffer_dirty (bh))) { -brelse (bh); -BUG (); +/* +* The block buffer at the specified new address was already +* in use. This can happen if it is a virtual block number +* and has been reallocated due to corruption of the bitmap +* used to manage its allocation state (if not, the buffer +* clearing of an abandoned b-tree node is missing somewhere). +*/ +nilfs_error (inode->i_sb, +"state inconsistency probably due to duplicate use of b-tree node block address %llu (ino=%lu)" , + (unsigned long long )blocknr, inode->i_ino); + goto failed; }memset (bh->b_data,0 ,i_blocksize (inode)); bh->b_bdev = inode->i_sb->s_bdev;
@@ -67,6 +76,12 @@ nilfs_btnode_create_block(struct address_space *btnc, __u64 blocknr)folio_unlock (bh->b_folio);folio_put (bh->b_folio);return bh; + +failed: +folio_unlock (bh->b_folio); +folio_put (bh->b_folio); +brelse (bh); +return ERR_PTR (-EIO ); } int nilfs_btnode_submit_block(struct address_space *btnc, __u64 blocknr,
@@ -217,8 +232,8 @@ int nilfs_btnode_prepare_change_key(struct address_space *btnc, } nbh =nilfs_btnode_create_block (btnc, newkey); -if (!nbh) -return -ENOMEM ; +if (IS_ERR (nbh)) +return PTR_ERR (nbh);BUG_ON (nbh == obh); ctxt->newbh = nbh;
fs/nilfs2/btree.c +2 -2
@@ -63,8 +63,8 @@ static int nilfs_btree_get_new_block(const struct nilfs_bmap *btree,struct buffer_head *bh; bh =nilfs_btnode_create_block (btnc, ptr); -if (!bh) -return -ENOMEM ; +if (IS_ERR (bh)) +return PTR_ERR (bh);set_buffer_nilfs_volatile (bh); *bhp = bh;