Message ID | 171270968933.3631545.17328111564626328171.stgit@frogsfrogsfrogs (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | [01/12] xfs: attr fork iext must be loaded before calling xfs_attr_is_leaf | expand |
On Tue, Apr 09, 2024 at 05:51:41PM -0700, Darrick J. Wong wrote: > +#define XFS_ATTR_ONDISK_MASK (XFS_ATTR_NSP_ONDISK_MASK | \ > + XFS_ATTR_LOCAL | \ > + XFS_ATTR_INCOMPLETE) Note that XFS_ATTR_LOCAL and XFS_ATTR_INCOMPLETE are not valid for short form directories. Should we check for that somewhere as well? Otherwise looks good: Reviewed-by: Christoph Hellwig <hch@lst.de>
On Tue, Apr 09, 2024 at 10:07:10PM -0700, Christoph Hellwig wrote: > On Tue, Apr 09, 2024 at 05:51:41PM -0700, Darrick J. Wong wrote: > > +#define XFS_ATTR_ONDISK_MASK (XFS_ATTR_NSP_ONDISK_MASK | \ > > + XFS_ATTR_LOCAL | \ > > + XFS_ATTR_INCOMPLETE) > > Note that XFS_ATTR_LOCAL and XFS_ATTR_INCOMPLETE are not valid for > short form directories. Should we check for that somewhere as well? Good point, xchk_xattr_check_sf should be flagging those too: /* * Shortform entries do not set LOCAL or INCOMPLETE, so the only * valid flag bits here are for namespaces. */ if (sfe->flags & ~XFS_ATTR_NSP_ONDISK_MASK) { xchk_fblock_set_corrupt(sc, XFS_ATTR_FORK, 0); break; } I'll tack that on the end. > Otherwise looks good: > > Reviewed-by: Christoph Hellwig <hch@lst.de> Thanks! --D
diff --git a/fs/xfs/libxfs/xfs_da_format.h b/fs/xfs/libxfs/xfs_da_format.h index aac3fe0396140..ecd0616f5776a 100644 --- a/fs/xfs/libxfs/xfs_da_format.h +++ b/fs/xfs/libxfs/xfs_da_format.h @@ -719,8 +719,13 @@ struct xfs_attr3_leafblock { #define XFS_ATTR_ROOT (1u << XFS_ATTR_ROOT_BIT) #define XFS_ATTR_SECURE (1u << XFS_ATTR_SECURE_BIT) #define XFS_ATTR_INCOMPLETE (1u << XFS_ATTR_INCOMPLETE_BIT) + #define XFS_ATTR_NSP_ONDISK_MASK (XFS_ATTR_ROOT | XFS_ATTR_SECURE) +#define XFS_ATTR_ONDISK_MASK (XFS_ATTR_NSP_ONDISK_MASK | \ + XFS_ATTR_LOCAL | \ + XFS_ATTR_INCOMPLETE) + #define XFS_ATTR_NAMESPACE_STR \ { XFS_ATTR_LOCAL, "local" }, \ { XFS_ATTR_ROOT, "root" }, \ diff --git a/fs/xfs/scrub/attr.c b/fs/xfs/scrub/attr.c index 5b855d7c98211..5ca79af47e81e 100644 --- a/fs/xfs/scrub/attr.c +++ b/fs/xfs/scrub/attr.c @@ -192,6 +192,11 @@ xchk_xattr_actor( if (xchk_should_terminate(sc, &error)) return error; + if (attr_flags & ~XFS_ATTR_ONDISK_MASK) { + xchk_fblock_set_corrupt(sc, XFS_ATTR_FORK, args.blkno); + return -ECANCELED; + } + if (attr_flags & XFS_ATTR_INCOMPLETE) { /* Incomplete attr key, just mark the inode for preening. */ xchk_ino_set_preen(sc, ip->i_ino); @@ -481,7 +486,6 @@ xchk_xattr_rec( xfs_dahash_t hash; int nameidx; int hdrsize; - unsigned int badflags; int error; ASSERT(blk->magic == XFS_ATTR_LEAF_MAGIC); @@ -511,10 +515,11 @@ xchk_xattr_rec( /* Retrieve the entry and check it. */ hash = be32_to_cpu(ent->hashval); - badflags = ~(XFS_ATTR_LOCAL | XFS_ATTR_ROOT | XFS_ATTR_SECURE | - XFS_ATTR_INCOMPLETE); - if ((ent->flags & badflags) != 0) + if (ent->flags & ~XFS_ATTR_ONDISK_MASK) { xchk_da_set_corrupt(ds, level); + return 0; + } + if (ent->flags & XFS_ATTR_LOCAL) { lentry = (struct xfs_attr_leaf_name_local *) (((char *)bp->b_addr) + nameidx);