xfs: simplify validation of the unwritten extent bit
XFS only supports the unwritten extent bit in the data fork, and only if the file system has a version 5 superblock or the unwritten extent feature bit. We currently have two routines that validate the invariant: xfs_check_nostate_extents which return -EFSCORRUPTED when it's not met, and xfs_validate_extent that triggers and assert in debug build. Both of them iterate over all extents of an inode fork when called, which isn't very efficient. This patch instead adds a new helper that verifies the invariant one extent at a time, and calls it from the places where we iterate over all extents to converted them from or two the in-memory format. The callers then return -EFSCORRUPTED when reading invalid extents from disk, or trigger an assert when writing them to disk. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
This commit is contained in:

committed by
Darrick J. Wong

parent
37f7f9bbf3
commit
0c1d9e4a61
@@ -24,13 +24,6 @@ struct xfs_mount;
|
||||
struct xfs_inode;
|
||||
struct xfs_trans;
|
||||
|
||||
/*
|
||||
* Extent state and extent format macros.
|
||||
*/
|
||||
#define XFS_EXTFMT_INODE(x) \
|
||||
(xfs_sb_version_hasextflgbit(&((x)->i_mount->m_sb)) ? \
|
||||
XFS_EXTFMT_HASSTATE : XFS_EXTFMT_NOSTATE)
|
||||
|
||||
/*
|
||||
* Btree block header size depends on a superblock flag.
|
||||
*/
|
||||
@@ -139,4 +132,18 @@ extern int xfs_bmbt_change_owner(struct xfs_trans *tp, struct xfs_inode *ip,
|
||||
extern struct xfs_btree_cur *xfs_bmbt_init_cursor(struct xfs_mount *,
|
||||
struct xfs_trans *, struct xfs_inode *, int);
|
||||
|
||||
/*
|
||||
* Check that the extent does not contain an invalid unwritten extent flag.
|
||||
*/
|
||||
static inline bool xfs_bmbt_validate_extent(struct xfs_mount *mp, int whichfork,
|
||||
struct xfs_bmbt_rec_host *ep)
|
||||
{
|
||||
if (ep->l0 >> (64 - BMBT_EXNTFLAG_BITLEN) == 0)
|
||||
return true;
|
||||
if (whichfork == XFS_DATA_FORK &&
|
||||
xfs_sb_version_hasextflgbit(&mp->m_sb))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
#endif /* __XFS_BMAP_BTREE_H__ */
|
||||
|
Reference in New Issue
Block a user