]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: remove the NULL fork handling in xfs_bmapi_read
authorChristoph Hellwig <hch@lst.de>
Mon, 10 Aug 2020 20:32:06 +0000 (16:32 -0400)
committerEric Sandeen <sandeen@sandeen.net>
Mon, 10 Aug 2020 20:32:06 +0000 (16:32 -0400)
Source kernel commit: 4b516ff4e772993a99fc9bf36503d23ce5bd5ba9

Now that we fully verify the inode forks before they are added to the
inode cache, the crash reported in

https://bugzilla.kernel.org/show_bug.cgi?id=204031

can't happen anymore, as we'll never let an inode that has inconsistent
nextents counts vs the presence of an in-core attr fork leak into the
inactivate code path.  So remove the work around to try to handle the
case, and just return an error and warn if the fork is not present.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
libxfs/xfs_bmap.c

index 904cc5dfe0e14ee5a64eea588ad99fbcdfc4d937..2389f3ad4fbc01283a432efb1ebee5e87f69bc4b 100644 (file)
@@ -3884,7 +3884,8 @@ xfs_bmapi_read(
        int                     flags)
 {
        struct xfs_mount        *mp = ip->i_mount;
-       struct xfs_ifork        *ifp;
+       int                     whichfork = xfs_bmapi_whichfork(flags);
+       struct xfs_ifork        *ifp = XFS_IFORK_PTR(ip, whichfork);
        struct xfs_bmbt_irec    got;
        xfs_fileoff_t           obno;
        xfs_fileoff_t           end;
@@ -3892,12 +3893,14 @@ xfs_bmapi_read(
        int                     error;
        bool                    eof = false;
        int                     n = 0;
-       int                     whichfork = xfs_bmapi_whichfork(flags);
 
        ASSERT(*nmap >= 1);
        ASSERT(!(flags & ~(XFS_BMAPI_ATTRFORK | XFS_BMAPI_ENTIRE)));
        ASSERT(xfs_isilocked(ip, XFS_ILOCK_SHARED|XFS_ILOCK_EXCL));
 
+       if (WARN_ON_ONCE(!ifp))
+               return -EFSCORRUPTED;
+
        if (XFS_IS_CORRUPT(mp, !xfs_ifork_has_extents(ip, whichfork)) ||
            XFS_TEST_ERROR(false, mp, XFS_ERRTAG_BMAPIFORMAT)) {
                return -EFSCORRUPTED;
@@ -3908,21 +3911,6 @@ xfs_bmapi_read(
 
        XFS_STATS_INC(mp, xs_blk_mapr);
 
-       ifp = XFS_IFORK_PTR(ip, whichfork);
-       if (!ifp) {
-               /*
-                * A missing attr ifork implies that the inode says we're in
-                * extents or btree format but failed to pass the inode fork
-                * verifier while trying to load it.  Treat that as a file
-                * corruption too.
-                */
-#ifdef DEBUG
-               xfs_alert(mp, "%s: inode %llu missing fork %d",
-                               __func__, ip->i_ino, whichfork);
-#endif /* DEBUG */
-               return -EFSCORRUPTED;
-       }
-
        if (!(ifp->if_flags & XFS_IFEXTENTS)) {
                error = xfs_iread_extents(NULL, ip, whichfork);
                if (error)