From: Igor Putko <igorpetindev@gmail.com>
To: Carlos Maiolino <cem@kernel.org>
Cc: Dave Chinner <dchinner@redhat.com>,
linux-xfs@vger.kernel.org, linux-kernel@vger.kernel.org,
Igor Putko <igorpetindev@gmail.com>,
syzbot+c32fff62cf4913d345d0c@syzkaller.appspotmail.com
Subject: [PATCH] xfs: do not release buf log item prematurely in xfs_buf_item_done
Date: Sun, 18 Oct 2026 20:09:13 +0300 [thread overview]
Message-ID: <20261018170913.3104-1-igorpetindev@gmail.com> (raw)
When a buffer with an active log item is written synchronously to disk
via xfs_bwrite() (for example, in xfs_sync_sb_buf() during
FS_IOC_SETFSLABEL), I/O completion invokes xfs_buf_item_done().
Currently, xfs_buf_item_done() unconditionally calls
xfs_buf_item_relse(), which frees the xfs_buf_log_item even if it still
has active references (e.g. bli_refcount > 0 while the item is pinned in
a CIL context and queued on cilpcp->log_items). When xlog_cil_push_work()
subsequently runs on another CPU, xlog_cil_push_pcp_aggregate() accesses
the freed log item while splicing cilpcp->log_items, triggering a
slab-use-after-free:
BUG: KASAN: slab-use-after-free in xlog_cil_push_pcp_aggregate
Write of size 8 at addr ffff888036db9c40 by task kworker/u8:7/300
Call Trace:
<TASK>
__list_splice include/linux/list.h:577 [inline]
list_splice_init include/linux/list.h:619 [inline]
xlog_cil_push_pcp_aggregate fs/xfs/xfs_log_cil.c:137 [inline]
xlog_cil_push_work+0x986/0x2a90 fs/xfs/xfs_log_cil.c:1417
Fix this by checking if the buf log item still has active references
in xfs_buf_item_done(). If bli_refcount is elevated, the item is still
owned by an ongoing transaction or the CIL and must not be torn down.
Fixes: d2fe5c4c8d25 ("xfs: rearrange code in xfs_buf_item.c")
Reported-by: syzbot+c32fff62cf4913d345d0c@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=c32ff62cf4913d345d0c
Signed-off-by: Igor Putko <igorpetindev@gmail.com>
---
fs/xfs/xfs_buf_item.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c
index 1a4ef34af8d5..6b32061bac53 100644
--- a/fs/xfs/xfs_buf_item.c
+++ b/fs/xfs/xfs_buf_item.c
@@ -1067,6 +1067,14 @@ xfs_buf_item_done(
struct xfs_buf *bp)
{
struct xfs_buf_log_item *bip = bp->b_log_item;
+ struct xfs_log_item *lip = &bip->bli_item;
+
+ /*
+ * If the log item still has active references (e.g. pinned by the CIL
+ * or held by an ongoing transaction), we cannot tear it down here.
+ */
+ if (atomic_read(&bip->bli_refcount) > 0)
+ return;
/*
* If we are forcibly shutting down, this may well be off the AIL
@@ -1080,8 +1088,8 @@ xfs_buf_item_done(
* Note that log recovery writes might have buffer items that are not on
* the AIL even when the file system is not shut down.
*/
- xfs_trans_ail_delete(&bip->bli_item,
- xlog_in_recovery(bip->bli_item.li_log) ?
+ xfs_trans_ail_delete(lip,
+ xlog_in_recovery(lip->li_log) ?
0 : SHUTDOWN_CORRUPT_INCORE);
xfs_buf_item_relse(bip);
}
--
2.47.3
next reply other threads:[~2026-10-18 17:11 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-18 17:09 Igor Putko [this message]
2026-10-18 20:29 ` [PATCH] xfs: do not release buf log item prematurely in xfs_buf_item_done Dave Chinner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261018170913.3104-1-igorpetindev@gmail.com \
--to=igorpetindev@gmail.com \
--cc=cem@kernel.org \
--cc=dchinner@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-xfs@vger.kernel.org \
--cc=syzbot+c32fff62cf4913d345d0c@syzkaller.appspotmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.