Message ID | 20200717011255.GM3151642@magnolia (mailing list archive) |
---|---|
State | Accepted, archived |
Headers | show |
Series | None | expand |
On Thu, Jul 16, 2020 at 06:12:55PM -0700, Darrick J. Wong wrote: > From: Darrick J. Wong <darrick.wong@oracle.com> > > Create an XFS_DQTYPE_ANY mask for ondisk dquots flags, and use that to > ensure that we never accept any garbage flags when we're loading dquots. > While we're at it, restructure the quota type flag checking to use the > proper masking. > > Note that I plan to add y2038 support soon, which will require a new > xfs_dqtype_t flag for extended timestamp support, hence all the work to > make the type masking work correctly. > > Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> > --- > v2: amend commit message > --- Looks good. Reviewed-by: Dave Chinner <dchinner@redhat.com>
On Thu, Jul 16, 2020 at 06:12:55PM -0700, Darrick J. Wong wrote: > From: Darrick J. Wong <darrick.wong@oracle.com> > > Create an XFS_DQTYPE_ANY mask for ondisk dquots flags, and use that to > ensure that we never accept any garbage flags when we're loading dquots. > While we're at it, restructure the quota type flag checking to use the > proper masking. > > Note that I plan to add y2038 support soon, which will require a new > xfs_dqtype_t flag for extended timestamp support, hence all the work to > make the type masking work correctly. I'd have delayed this until we actually add a the bigtime flag. But I don't want you to respin once again, so: Reviewed-by: Christoph Hellwig <hch@lst.de>
diff --git a/fs/xfs/libxfs/xfs_dquot_buf.c b/fs/xfs/libxfs/xfs_dquot_buf.c index 75c164ed141c..39d64fbc6b87 100644 --- a/fs/xfs/libxfs/xfs_dquot_buf.c +++ b/fs/xfs/libxfs/xfs_dquot_buf.c @@ -39,6 +39,8 @@ xfs_dquot_verify( struct xfs_disk_dquot *ddq, xfs_dqid_t id) /* used only during quotacheck */ { + __u8 ddq_type; + /* * We can encounter an uninitialized dquot buffer for 2 reasons: * 1. If we crash while deleting the quotainode(s), and those blks got @@ -59,9 +61,12 @@ xfs_dquot_verify( if (ddq->d_version != XFS_DQUOT_VERSION) return __this_address; - if (ddq->d_flags != XFS_DQTYPE_USER && - ddq->d_flags != XFS_DQTYPE_PROJ && - ddq->d_flags != XFS_DQTYPE_GROUP) + if (ddq->d_flags & ~XFS_DQTYPE_ANY) + return __this_address; + ddq_type = ddq->d_flags & XFS_DQTYPE_REC_MASK; + if (ddq_type != XFS_DQTYPE_USER && + ddq_type != XFS_DQTYPE_PROJ && + ddq_type != XFS_DQTYPE_GROUP) return __this_address; if (id != -1 && id != be32_to_cpu(ddq->d_id)) diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index 0fa969f6202c..29564bd32bef 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -1158,6 +1158,8 @@ static inline void xfs_dinode_put_rdev(struct xfs_dinode *dip, xfs_dev_t rdev) XFS_DQTYPE_PROJ | \ XFS_DQTYPE_GROUP) +#define XFS_DQTYPE_ANY (XFS_DQTYPE_REC_MASK) + /* * This is the main portion of the on-disk representation of quota information * for a user. We pad this with some more expansion room to construct the on