From: "Darrick J. Wong" <djwong@kernel.org>
To: sashiko-reviews@lists.linux.dev
Cc: Andrey Albershteyn <aalbersh@kernel.org>,
linux-ext4@vger.kernel.org, dsterba@suse.cz, tytso@mit.edu
Subject: Re: [PATCH v16 15/21] xfs: add fs-verity support
Date: Mon, 21 Sep 2026 21:50:29 -0700 [thread overview]
Message-ID: <20260922045029.GB6239@frogsfrogsfrogs> (raw)
In-Reply-To: <20260918114308.03C7F1F000FF@smtp.kernel.org>
On Fri, Sep 18, 2026 at 11:43:07AM +0000, sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
> - [High] xfs: AB-BA lock inversion in xfs_fsverity_delete_metadata()
> - [High] xfs: verity metadata destroyed after commit on xfs_free_eofblocks failure
> - [Low] xfs: duplicate xfs_fsverity_delete_metadata call on cleanup failure
> --
>
> commit 2cf0e89721e69aa45ac23d60792bafc833b86f51
> Author: Andrey Albershteyn <aalbersh@kernel.org>
>
> xfs: add fs-verity support
>
> This commit integrates fs-verity with XFS, storing the Merkle tree and
> descriptor in the data fork past EOF. It sets up the enablement process
> and handles read and write operations for the verity metadata.
>
> > --- a/fs/xfs/xfs_fsverity.c
> > +++ b/fs/xfs/xfs_fsverity.c
> [ ... ]
> > +static int
> > +xfs_fsverity_delete_metadata(
> > + struct xfs_inode *ip)
> > +{
> > + struct xfs_trans *tp;
> > + struct xfs_mount *mp = ip->i_mount;
> > + int error;
> > +
> > + xfs_ilock(ip, XFS_MMAPLOCK_EXCL);
> > + error = xfs_trans_alloc(mp, &M_RES(mp)->tr_itruncate, 0, 0, 0, &tp);
> > + if (error) {
> > + xfs_iunlock(ip, XFS_MMAPLOCK_EXCL);
> > + return error;
> > + }
> > +
> > + xfs_ilock(ip, XFS_ILOCK_EXCL);
> > + xfs_trans_ijoin(tp, ip, 0);
> > +
> > + truncate_inode_pages(VFS_I(ip)->i_mapping, XFS_ISIZE(ip));
>
> [Severity: High]
> Does this sequence create a lock inversion between the page/folio locks and
> the XFS_ILOCK?
>
> XFS lock ordering rules require folio locks to be acquired before the log space
> reservation (xfs_trans_alloc) and the XFS_ILOCK. Because truncate_inode_pages
> sequentially locks folios, calling it while holding XFS_ILOCK_EXCL could cause
> an AB-BA deadlock if a background thread (like writeback) has locked a folio
> and is concurrently trying to acquire the XFS_ILOCK for block mapping.
>
> Could truncate_inode_pages be moved outside the transaction and before
> acquiring XFS_ILOCK_EXCL?
Yes, it should.
>
> [ ... ]
> > +static int
> > +xfs_fsverity_end_enable(
> > + struct file *file,
> > + const void *desc,
> > + size_t desc_size,
> > + u64 merkle_tree_size)
> > +{
> > + struct inode *inode = file_inode(file);
> > + struct xfs_inode *ip = XFS_I(inode);
> > + struct xfs_mount *mp = ip->i_mount;
> > + struct xfs_trans *tp;
> > + int error = 0;
> > + loff_t range_start = xfs_fsverity_metadata_offset(ip);
> > +
> > + xfs_assert_ilocked(ip, XFS_IOLOCK_EXCL);
> > +
> > + /* fs-verity failed, just cleanup */
> > + if (desc == NULL) {
> > + error = xfs_fsverity_delete_metadata(ip);
> > + goto out;
> > + }
> [ ... ]
> > + /*
> > + * Ensure that we've persisted the verity information before we enable
> > + * it on the inode and tell the caller we have sealed the inode.
> > + */
> > + ip->i_diflags2 |= XFS_DIFLAG2_VERITY;
> > +
> > + xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
> > + xfs_trans_set_sync(tp);
> > +
> > + error = xfs_trans_commit(tp);
> > + xfs_iunlock(ip, XFS_ILOCK_EXCL);
> > + if (error)
> > + goto out;
> > +
> > + inode_set_flags(inode, S_VERITY, S_VERITY);
> > +
> > + /*
> > + * Proactively remove unwritten extents left by COW preallocations and
> > + * write preallocation in the merkle tree holes and past descriptor,
> > + * and any delayed preallocations
> > + */
> > + error = xfs_free_eofblocks(ip);
> > +out:
> > + if (error) {
> > + int error2;
> > +
> > + error2 = xfs_fsverity_delete_metadata(ip);
>
> [Severity: Low]
> Is it intentional to call xfs_fsverity_delete_metadata a second time if the
> initial early cleanup fails?
>
> If desc is NULL at the start of the function, xfs_fsverity_delete_metadata is
> called. If that call returns an error, it jumps to the out label. Because
> error is preserved, this block executes and calls xfs_fsverity_delete_metadata
> again with the exact same failed state.
>
> [Severity: High]
> Can a failure in xfs_free_eofblocks cause the metadata of a fully committed
> verity inode to be destroyed?
>
> If the verity enablement is successful, the transaction is committed via
> xfs_trans_commit and the inode is permanently marked with XFS_DIFLAG2_VERITY.
> If the subsequent post-commit optimization call to xfs_free_eofblocks fails
> (for example, due to memory constraints or space issues), it returns an error,
> which leads directly to this unconditional cleanup path.
>
> This deletes the Merkle tree and descriptor extents. Because the on-disk flag
> was already committed, the file remains verity-enabled but loses its metadata.
> This would permanently fail verity validation and lock the user out of their
> file.
>
> Should this cleanup be skipped if the transaction has already been committed?
>
> > + if (error2)
> > + xfs_alert(ip->i_mount,
> > +"ino 0x%llx failed to clean up new fsverity metadata, err %d",
> > + I_INO(ip), error2);
> > + }
> > +
> > + xfs_iflags_clear(ip, XFS_VERITY_CONSTRUCTION);
> > + return error;
> > +}
>
> --
> Sashiko AI review · https://sashiko.dev/#/patchset/20260918111539.1003439-1-aalbersh@kernel.org?part=15
>
next prev parent reply other threads:[~2026-09-22 4:50 UTC|newest]
Thread overview: 67+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-18 11:15 [PATCH v16 00/21] fs-verity support for XFS with post EOF merkle tree Andrey Albershteyn
2026-09-18 11:15 ` [PATCH v16 01/21] fsverity: report validation errors through fserror to fsnotify Andrey Albershteyn
2026-09-18 11:27 ` sashiko-bot
2026-09-18 11:15 ` [PATCH v16 02/21] fsverity: expose ensure_fsverity_info() Andrey Albershteyn
2026-09-18 11:32 ` sashiko-bot
2026-09-18 11:15 ` [PATCH v16 03/21] fsverity: pass digest size and hash of the all-zeroes block to ->write Andrey Albershteyn
2026-09-18 11:24 ` sashiko-bot
2026-09-18 11:15 ` [PATCH v16 04/21] fsverity: hoist pagecache_read from f2fs/ext4 to fsverity Andrey Albershteyn
2026-09-18 11:26 ` sashiko-bot
2026-09-18 11:15 ` [PATCH v16 05/21] fsverity: don't allow setting DAX file attribute on fsverity files Andrey Albershteyn
2026-09-18 11:28 ` sashiko-bot
2026-09-25 4:35 ` Eric Biggers
2026-09-18 11:15 ` [PATCH v16 06/21] fsverity: hoist statx reporting of fs-verity flag Andrey Albershteyn
2026-09-18 11:28 ` sashiko-bot
2026-09-18 11:15 ` [PATCH v16 07/21] xfs: introduce fsverity on-disk changes Andrey Albershteyn
2026-09-18 11:34 ` sashiko-bot
2026-09-18 11:15 ` [PATCH v16 08/21] xfs: don't allow to enable DAX on fs-verity sealed inode Andrey Albershteyn
2026-09-18 11:27 ` sashiko-bot
2026-09-18 11:15 ` [PATCH v16 09/21] xfs: disable direct read path for fs-verity files Andrey Albershteyn
2026-09-18 11:26 ` sashiko-bot
2026-09-18 11:15 ` [PATCH v16 10/21] xfs: don't report dio_mem_align and dio_offset_align for fsverity files Andrey Albershteyn
2026-09-18 11:26 ` sashiko-bot
2026-09-18 11:15 ` [PATCH v16 11/21] xfs: handle fsverity I/O in write/read path Andrey Albershteyn
2026-09-18 11:38 ` sashiko-bot
2026-09-22 7:15 ` Christoph Hellwig
2026-09-18 11:15 ` [PATCH v16 12/21] xfs: use read ioend for fsverity data verification Andrey Albershteyn
2026-09-18 11:36 ` sashiko-bot
2026-09-22 4:29 ` Darrick J. Wong
2026-09-22 7:18 ` Christoph Hellwig
2026-09-22 9:13 ` Andrey Albershteyn
2026-09-22 12:31 ` Christoph Hellwig
2026-09-22 13:17 ` Andrey Albershteyn
2026-09-18 11:15 ` [PATCH v16 13/21] xfs: add XFS_BMAPI_UNWRITTEN to unmap unwritten extents in __xfs_bunmapi() Andrey Albershteyn
2026-09-18 11:32 ` sashiko-bot
2026-09-22 4:49 ` Darrick J. Wong
2026-09-22 4:34 ` Darrick J. Wong
2026-09-22 7:20 ` Christoph Hellwig
2026-09-22 8:32 ` Andrey Albershteyn
2026-09-18 11:15 ` [PATCH v16 14/21] xfs: don't remove written extents past EOF on fsverity inodes Andrey Albershteyn
2026-09-18 11:41 ` sashiko-bot
2026-09-22 4:37 ` Darrick J. Wong
2026-09-22 8:33 ` Andrey Albershteyn
2026-09-22 11:29 ` Andrey Albershteyn
2026-09-18 11:15 ` [PATCH v16 15/21] xfs: add fs-verity support Andrey Albershteyn
2026-09-18 11:43 ` sashiko-bot
2026-09-22 4:50 ` Darrick J. Wong [this message]
2026-09-22 4:45 ` Darrick J. Wong
2026-09-22 9:27 ` Andrey Albershteyn
2026-09-22 7:22 ` Christoph Hellwig
2026-09-22 8:56 ` Andrey Albershteyn
2026-09-22 12:32 ` Christoph Hellwig
2026-09-22 13:27 ` Andrey Albershteyn
2026-09-23 4:44 ` Christoph Hellwig
2026-09-18 11:15 ` [PATCH v16 16/21] xfs: initialize fs-verity on file open Andrey Albershteyn
2026-09-18 11:33 ` sashiko-bot
2026-09-18 11:15 ` [PATCH v16 17/21] xfs: add fs-verity ioctls Andrey Albershteyn
2026-09-18 11:31 ` sashiko-bot
2026-09-18 11:15 ` [PATCH v16 18/21] xfs: advertise fs-verity being available on filesystem Andrey Albershteyn
2026-09-18 11:30 ` sashiko-bot
2026-09-18 11:15 ` [PATCH v16 19/21] xfs: check and repair the verity inode flag state Andrey Albershteyn
2026-09-18 11:40 ` sashiko-bot
2026-09-18 11:15 ` [PATCH v16 20/21] xfs: introduce health state for corrupted fsverity metadata Andrey Albershteyn
2026-09-18 11:34 ` sashiko-bot
2026-09-18 11:15 ` [PATCH v16 21/21] xfs: enable ro-compat fs-verity flag Andrey Albershteyn
2026-09-18 11:44 ` sashiko-bot
2026-09-22 4:51 ` [PATCH v16 00/21] fs-verity support for XFS with post EOF merkle tree Darrick J. Wong
2026-09-22 9:00 ` Andrey Albershteyn
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=20260922045029.GB6239@frogsfrogsfrogs \
--to=djwong@kernel.org \
--cc=aalbersh@kernel.org \
--cc=dsterba@suse.cz \
--cc=linux-ext4@vger.kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
--cc=tytso@mit.edu \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox