From: "Darrick J. Wong" <djwong@kernel.org>
To: Andrey Albershteyn <aalbersh@redhat.com>
Cc: ebiggers@kernel.org, linux-xfs@vger.kernel.org,
linux-fsdevel@vger.kernel.org, fsverity@lists.linux.dev
Subject: Re: [PATCH 24/29] xfs: teach online repair to evaluate fsverity xattrs
Date: Tue, 2 Apr 2024 09:42:57 -0700 [thread overview]
Message-ID: <20240402164257.GC6390@frogsfrogsfrogs> (raw)
In-Reply-To: <6fd77dqwbfmbaqwqori6jffpg2czfe23qmqrvzducti33a4vvi@7lut4a6qhsmt>
On Tue, Apr 02, 2024 at 05:42:04PM +0200, Andrey Albershteyn wrote:
> On 2024-03-29 17:42:19, Darrick J. Wong wrote:
> > From: Darrick J. Wong <djwong@kernel.org>
> >
> > Teach online repair to check for unused fsverity metadata and purge it
> > on reconstruction.
> >
> > Signed-off-by: Darrick J. Wong <djwong@kernel.org>
> > ---
> > fs/xfs/scrub/attr.c | 139 ++++++++++++++++++++++++++++++++++++++++++++
> > fs/xfs/scrub/attr.h | 6 ++
> > fs/xfs/scrub/attr_repair.c | 50 ++++++++++++++++
> > fs/xfs/scrub/trace.c | 1
> > fs/xfs/scrub/trace.h | 31 ++++++++++
> > 5 files changed, 226 insertions(+), 1 deletion(-)
> >
> >
> > diff --git a/fs/xfs/scrub/attr.c b/fs/xfs/scrub/attr.c
> > index 2e8a2b2e82fbd..be121625c14f0 100644
> > --- a/fs/xfs/scrub/attr.c
> > +++ b/fs/xfs/scrub/attr.c
> > @@ -18,6 +18,7 @@
> > #include "xfs_attr_leaf.h"
> > #include "xfs_attr_sf.h"
> > #include "xfs_parent.h"
> > +#include "xfs_verity.h"
> > #include "scrub/scrub.h"
> > #include "scrub/common.h"
> > #include "scrub/dabtree.h"
> > @@ -25,6 +26,8 @@
> > #include "scrub/listxattr.h"
> > #include "scrub/repair.h"
> >
> > +#include <linux/fsverity.h>
> > +
> > /* Free the buffers linked from the xattr buffer. */
> > static void
> > xchk_xattr_buf_cleanup(
> > @@ -126,6 +129,53 @@ xchk_setup_xattr_buf(
> > return 0;
> > }
> >
> > +#ifdef CONFIG_FS_VERITY
> > +/*
> > + * Obtain merkle tree geometry information for a verity file so that we can
> > + * perform sanity checks of the fsverity xattrs.
> > + */
> > +STATIC int
> > +xchk_xattr_setup_verity(
> > + struct xfs_scrub *sc)
> > +{
> > + struct xchk_xattr_buf *ab;
> > + int error;
> > +
> > + /*
> > + * Drop the ILOCK and the transaction because loading the fsverity
> > + * metadata will call into the xattr code. S_VERITY is enabled with
> > + * IOLOCK_EXCL held, so it should not change here.
> > + */
> > + xchk_iunlock(sc, XFS_ILOCK_EXCL);
> > + xchk_trans_cancel(sc);
> > +
> > + error = xchk_setup_xattr_buf(sc, 0);
> > + if (error)
> > + return error;
> > +
> > + ab = sc->buf;
> > + error = fsverity_merkle_tree_geometry(VFS_I(sc->ip),
> > + &ab->merkle_blocksize, &ab->merkle_tree_size);
> > + if (error == -ENODATA || error == -EFSCORRUPTED) {
> > + /* fsverity metadata corrupt, cannot complete checks */
> > + xchk_set_incomplete(sc);
> > + ab->merkle_blocksize = 0;
> > + error = 0;
> > + }
> > + if (error)
> > + return error;
> > +
> > + error = xchk_trans_alloc(sc, 0);
> > + if (error)
> > + return error;
> > +
> > + xchk_ilock(sc, XFS_ILOCK_EXCL);
> > + return 0;
> > +}
> > +#else
> > +# define xchk_xattr_setup_verity(...) (0)
> > +#endif /* CONFIG_FS_VERITY */
> > +
> > /* Set us up to scrub an inode's extended attributes. */
> > int
> > xchk_setup_xattr(
> > @@ -150,9 +200,89 @@ xchk_setup_xattr(
> > return error;
> > }
> >
> > - return xchk_setup_inode_contents(sc, 0);
> > + error = xchk_setup_inode_contents(sc, 0);
> > + if (error)
> > + return error;
> > +
> > + if (IS_VERITY(VFS_I(sc->ip))) {
> > + error = xchk_xattr_setup_verity(sc);
> > + if (error)
> > + return error;
> > + }
> > +
> > + return error;
> > }
> >
> > +#ifdef CONFIG_FS_VERITY
> > +/* Check the merkle tree xattrs. */
> > +STATIC void
> > +xchk_xattr_verity(
> > + struct xfs_scrub *sc,
> > + xfs_dablk_t blkno,
> > + const unsigned char *name,
> > + unsigned int namelen,
> > + unsigned int valuelen)
> > +{
> > + struct xchk_xattr_buf *ab = sc->buf;
> > +
> > + /* Non-verity filesystems should never have verity xattrs. */
> > + if (!xfs_has_verity(sc->mp)) {
> > + xchk_fblock_set_corrupt(sc, XFS_ATTR_FORK, blkno);
> > + return;
> > + }
> > +
> > + /*
> > + * Any verity metadata on a non-verity file are leftovers from a
> > + * previous attempt to enable verity.
> > + */
> > + if (!IS_VERITY(VFS_I(sc->ip))) {
> > + xchk_ino_set_preen(sc, sc->ip->i_ino);
> > + return;
> > + }
> > +
> > + /* Zero blocksize occurs if we couldn't load the merkle tree data. */
> > + if (ab->merkle_blocksize == 0)
> > + return;
> > +
> > + switch (namelen) {
> > + case sizeof(struct xfs_merkle_key):
> > + /* Oversized blocks are not allowed */
> > + if (valuelen > ab->merkle_blocksize) {
> > + xchk_fblock_set_corrupt(sc, XFS_ATTR_FORK, blkno);
> > + return;
> > + }
> > + break;
> > + case XFS_VERITY_DESCRIPTOR_NAME_LEN:
> > + /* Has to match the descriptor xattr name */
> > + if (memcmp(name, XFS_VERITY_DESCRIPTOR_NAME, namelen))
> > + xchk_fblock_set_corrupt(sc, XFS_ATTR_FORK, blkno);
> > + return;
> > + default:
> > + xchk_fblock_set_corrupt(sc, XFS_ATTR_FORK, blkno);
> > + return;
> > + }
> > +
> > + /*
> > + * Merkle tree blocks beyond the end of the tree are leftovers from
> > + * a previous failed attempt to enable verity.
> > + */
> > + if (xfs_merkle_key_from_disk(name, namelen) >= ab->merkle_tree_size)
> > + xchk_ino_set_preen(sc, sc->ip->i_ino);
>
> The other case which probably can be detected is if we start
> removing the tree and it gets interrupted (starting blocks missing).
> This can be checked by iterating over the xattrs names up to
> ->merkle_tree_size. But I'm not sure if online repair can store
> state over xattrs validation.
It can; you'd just have to amend the xchk_xattr_buf to store whatever
extra data you want. That said, if IS_VERITY() isn't true, then we'll
flag the xattr structure for any XFS_ATTR_VERITY attrs:
/*
* Any verity metadata on a non-verity file are leftovers from a
* previous attempt to enable verity.
*/
if (!IS_VERITY(VFS_I(sc->ip))) {
xchk_ino_set_preen(sc, sc->ip->i_ino);
return;
}
And attr_repair.c will not salvage the attrs when it reconstructs the
attr structure.
> Also, only pair of valid descriptor and valid tree is something of
> use, but I'm not sure if all of this is in scope of online repair.
Not here -- the xfsprogs verity patchset amends xfs_scrub phase 6 to
look for verity files so that it can open them and read the contents to
see if any IO errors occur. That will catch missing/inconsistent bits
in the fsverity metadata.
> Otherwise, looks good to me:
> Reviewed-by: Andrey Albershteyn <aalbersh@redhat.com>
Thanks!
--D
> --
> - Andrey
>
>
next prev parent reply other threads:[~2024-04-02 16:42 UTC|newest]
Thread overview: 111+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-03-30 0:30 [PATCHBOMB v5.5] fs-verity support for XFS Darrick J. Wong
2024-03-30 0:32 ` [PATCHSET v5.5 1/2] fs-verity: support merkle tree access by blocks Darrick J. Wong
2024-03-30 0:32 ` [PATCH 01/13] fs: add FS_XFLAG_VERITY for verity files Darrick J. Wong
2024-03-30 0:33 ` [PATCH 02/13] fsverity: pass tree_blocksize to end_enable_verity() Darrick J. Wong
2024-03-30 0:33 ` [PATCH 03/13] fsverity: support block-based Merkle tree caching Darrick J. Wong
2024-04-05 2:31 ` Eric Biggers
2024-04-24 21:25 ` Darrick J. Wong
2024-04-24 22:08 ` Eric Biggers
2024-04-25 0:27 ` Darrick J. Wong
2024-04-25 0:46 ` Eric Biggers
2024-04-25 0:53 ` Darrick J. Wong
2024-03-30 0:33 ` [PATCH 04/13] fsverity: add per-sb workqueue for post read processing Darrick J. Wong
2024-04-05 2:39 ` Eric Biggers
2024-04-24 21:33 ` Darrick J. Wong
2024-03-30 0:33 ` [PATCH 05/13] fsverity: add tracepoints Darrick J. Wong
2024-03-30 0:34 ` [PATCH 06/13] fsverity: send the level of the merkle tree block to ->read_merkle_tree_block Darrick J. Wong
2024-04-05 2:42 ` Eric Biggers
2024-04-25 0:30 ` Darrick J. Wong
2024-03-30 0:34 ` [PATCH 07/13] fsverity: pass the new tree size and block size to ->begin_enable_verity Darrick J. Wong
2024-04-05 2:46 ` Eric Biggers
2024-04-24 21:36 ` Darrick J. Wong
2024-03-30 0:34 ` [PATCH 08/13] fsverity: expose merkle tree geometry to callers Darrick J. Wong
2024-04-05 2:50 ` Eric Biggers
2024-04-25 0:45 ` Darrick J. Wong
2024-04-25 0:49 ` Eric Biggers
2024-04-25 1:01 ` Darrick J. Wong
2024-04-25 1:04 ` Eric Biggers
2024-03-30 0:35 ` [PATCH 09/13] fsverity: box up the write_merkle_tree_block parameters too Darrick J. Wong
2024-04-05 2:52 ` Eric Biggers
2024-04-25 0:46 ` Darrick J. Wong
2024-03-30 0:35 ` [PATCH 10/13] fsverity: pass the zero-hash value to the implementation Darrick J. Wong
2024-04-05 2:57 ` Eric Biggers
2024-04-24 19:02 ` Darrick J. Wong
2024-04-24 19:19 ` Eric Biggers
2024-04-24 20:23 ` Darrick J. Wong
2024-04-24 20:59 ` Eric Biggers
2024-04-24 21:43 ` Darrick J. Wong
2024-03-30 0:35 ` [PATCH 11/13] fsverity: report validation errors back to the filesystem Darrick J. Wong
2024-04-05 3:09 ` Eric Biggers
2024-04-24 18:18 ` Darrick J. Wong
2024-04-24 18:52 ` Eric Biggers
2024-04-24 19:03 ` Darrick J. Wong
2024-03-30 0:35 ` [PATCH 12/13] fsverity: remove system-wide workqueue Darrick J. Wong
2024-04-05 3:14 ` Eric Biggers
2024-04-24 18:05 ` Darrick J. Wong
2024-04-24 18:41 ` Eric Biggers
2024-04-29 10:15 ` Andrey Albershteyn
2024-04-29 16:35 ` Darrick J. Wong
2024-03-30 0:36 ` [PATCH 13/13] iomap: integrate fs-verity verification into iomap's read path Darrick J. Wong
2024-03-30 0:32 ` [PATCHSET v5.5 2/2] xfs: fs-verity support Darrick J. Wong
2024-03-30 0:36 ` [PATCH 01/29] xfs: use unsigned ints for non-negative quantities in xfs_attr_remote.c Darrick J. Wong
2024-04-02 9:51 ` Andrey Albershteyn
2024-04-02 16:25 ` Darrick J. Wong
2024-03-30 0:36 ` [PATCH 02/29] xfs: turn XFS_ATTR3_RMT_BUF_SPACE into a function Darrick J. Wong
2024-04-02 10:09 ` Andrey Albershteyn
2024-03-30 0:36 ` [PATCH 03/29] xfs: create a helper to compute the blockcount of a max sized remote value Darrick J. Wong
2024-04-02 10:09 ` Andrey Albershteyn
2024-03-30 0:37 ` [PATCH 04/29] xfs: minor cleanups of xfs_attr3_rmt_blocks Darrick J. Wong
2024-04-02 10:11 ` Andrey Albershteyn
2024-03-30 0:37 ` [PATCH 05/29] xfs: add attribute type for fs-verity Darrick J. Wong
2024-03-30 0:37 ` [PATCH 06/29] xfs: do not use xfs_attr3_rmt_hdr for remote verity value blocks Darrick J. Wong
2024-03-30 0:37 ` [PATCH 07/29] xfs: add fs-verity ro-compat flag Darrick J. Wong
2024-03-30 0:38 ` [PATCH 08/29] xfs: add inode on-disk VERITY flag Darrick J. Wong
2024-03-30 0:38 ` [PATCH 09/29] xfs: initialize fs-verity on file open and cleanup on inode destruction Darrick J. Wong
2024-03-30 0:38 ` [PATCH 10/29] xfs: don't allow to enable DAX on fs-verity sealed inode Darrick J. Wong
2024-03-30 0:38 ` [PATCH 11/29] xfs: disable direct read path for fs-verity files Darrick J. Wong
2024-03-30 0:39 ` [PATCH 12/29] xfs: widen flags argument to the xfs_iflags_* helpers Darrick J. Wong
2024-04-02 12:37 ` Andrey Albershteyn
2024-04-02 16:27 ` Darrick J. Wong
2024-03-30 0:39 ` [PATCH 13/29] xfs: add fs-verity support Darrick J. Wong
2024-04-02 8:42 ` Andrey Albershteyn
2024-04-02 16:34 ` Darrick J. Wong
2024-04-25 1:14 ` Darrick J. Wong
2024-03-30 0:39 ` [PATCH 14/29] xfs: create a per-mount shrinker for verity inodes merkle tree blocks Darrick J. Wong
2024-04-05 3:16 ` Eric Biggers
2024-04-24 17:39 ` Darrick J. Wong
2024-03-30 0:39 ` [PATCH 15/29] xfs: create an icache tag for files with cached " Darrick J. Wong
2024-03-30 0:40 ` [PATCH 16/29] xfs: shrink verity blob cache Darrick J. Wong
2024-03-30 0:40 ` [PATCH 17/29] xfs: only allow the verity iflag for regular files Darrick J. Wong
2024-04-02 12:52 ` Andrey Albershteyn
2024-03-30 0:40 ` [PATCH 18/29] xfs: don't store trailing zeroes of merkle tree blocks Darrick J. Wong
2024-03-30 0:41 ` [PATCH 19/29] xfs: use merkle tree offset as attr hash Darrick J. Wong
2024-03-30 0:41 ` [PATCH 20/29] xfs: don't bother storing merkle tree blocks for zeroed data blocks Darrick J. Wong
2024-03-30 0:41 ` [PATCH 21/29] xfs: add fs-verity ioctls Darrick J. Wong
2024-03-30 0:41 ` [PATCH 22/29] xfs: advertise fs-verity being available on filesystem Darrick J. Wong
2024-04-02 13:44 ` Andrey Albershteyn
2024-03-30 0:42 ` [PATCH 23/29] xfs: make scrub aware of verity dinode flag Darrick J. Wong
2024-03-30 0:42 ` [PATCH 24/29] xfs: teach online repair to evaluate fsverity xattrs Darrick J. Wong
2024-04-02 15:42 ` Andrey Albershteyn
2024-04-02 16:42 ` Darrick J. Wong [this message]
2024-03-30 0:42 ` [PATCH 25/29] xfs: report verity failures through the health system Darrick J. Wong
2024-04-02 16:16 ` Andrey Albershteyn
2024-03-30 0:42 ` [PATCH 26/29] xfs: clear the verity iflag when not appropriate Darrick J. Wong
2024-04-02 16:26 ` Andrey Albershteyn
2024-03-30 0:43 ` [PATCH 27/29] xfs: make it possible to disable fsverity Darrick J. Wong
2024-04-02 17:15 ` Andrey Albershteyn
2024-04-02 23:25 ` Eric Biggers
2024-04-03 1:26 ` Darrick J. Wong
2024-03-30 0:43 ` [PATCH 28/29] xfs: allow verity files to be opened even if the fsverity metadata is damaged Darrick J. Wong
2024-04-02 18:04 ` Andrey Albershteyn
2024-04-02 20:00 ` Colin Walters
2024-04-02 22:52 ` Darrick J. Wong
2024-04-02 23:45 ` Eric Biggers
2024-04-03 1:34 ` Darrick J. Wong
2024-04-03 0:10 ` Colin Walters
2024-04-03 1:39 ` Darrick J. Wong
2024-04-03 1:59 ` Dave Chinner
2024-04-03 3:19 ` Darrick J. Wong
2024-04-03 22:22 ` Dave Chinner
2024-04-03 8:35 ` Alexander Larsson
2024-03-30 0:43 ` [PATCH 29/29] xfs: enable ro-compat fs-verity flag Darrick J. Wong
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=20240402164257.GC6390@frogsfrogsfrogs \
--to=djwong@kernel.org \
--cc=aalbersh@redhat.com \
--cc=ebiggers@kernel.org \
--cc=fsverity@lists.linux.dev \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-xfs@vger.kernel.org \
/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