xfs: call xfs_dinode_verify from xfs_inode_from_disk
authorChristoph Hellwig <hch@lst.de>
Thu, 14 May 2020 21:01:18 +0000 (14:01 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Tue, 19 May 2020 16:40:57 +0000 (09:40 -0700)
Keep the code dealing with the dinode together, and also ensure we verify
the dinode in the owner change log recovery case as well.

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>
Documentation/filesystems/xfs-self-describing-metadata.txt
fs/xfs/libxfs/xfs_inode_buf.c

index 8db0121d0980c4b7293f76eb8331d09162cc21e9..e912699d74301405ff4a29de32ec97632e1146f4 100644 (file)
@@ -337,11 +337,11 @@ buffer.
 
 The structure of the verifiers and the identifiers checks is very similar to the
 buffer code described above. The only difference is where they are called. For
-example, inode read verification is done in xfs_iread() when the inode is first
-read out of the buffer and the struct xfs_inode is instantiated. The inode is
-already extensively verified during writeback in xfs_iflush_int, so the only
-addition here is to add the LSN and CRC to the inode as it is copied back into
-the buffer.
+example, inode read verification is done in xfs_inode_from_disk() when the inode
+is first read out of the buffer and the struct xfs_inode is instantiated. The
+inode is already extensively verified during writeback in xfs_iflush_int, so the
+only addition here is to add the LSN and CRC to the inode as it is copied back
+into the buffer.
 
 XXX: inode unlinked list modification doesn't recalculate the inode CRC! None of
 the unlinked list modifications check or update CRCs, neither during unlink nor
index 686a026b5f6ed3c92e9d726cca8d367d3113a859..3aac22e892985149dfd0a44eecf27acfc97a5873 100644 (file)
@@ -188,10 +188,18 @@ xfs_inode_from_disk(
        struct xfs_icdinode     *to = &ip->i_d;
        struct inode            *inode = VFS_I(ip);
        int                     error;
+       xfs_failaddr_t          fa;
 
        ASSERT(ip->i_cowfp == NULL);
        ASSERT(ip->i_afp == NULL);
 
+       fa = xfs_dinode_verify(ip->i_mount, ip->i_ino, from);
+       if (fa) {
+               xfs_inode_verifier_error(ip, -EFSCORRUPTED, "dinode", from,
+                               sizeof(*from), fa);
+               return -EFSCORRUPTED;
+       }
+
        /*
         * First get the permanent information that is needed to allocate an
         * inode. If the inode is unused, mode is zero and we shouldn't mess
@@ -627,7 +635,6 @@ xfs_iread(
 {
        xfs_buf_t       *bp;
        xfs_dinode_t    *dip;
-       xfs_failaddr_t  fa;
        int             error;
 
        /*
@@ -652,15 +659,6 @@ xfs_iread(
        if (error)
                return error;
 
-       /* even unallocated inodes are verified */
-       fa = xfs_dinode_verify(mp, ip->i_ino, dip);
-       if (fa) {
-               xfs_inode_verifier_error(ip, -EFSCORRUPTED, "dinode", dip,
-                               sizeof(*dip), fa);
-               error = -EFSCORRUPTED;
-               goto out_brelse;
-       }
-
        error = xfs_inode_from_disk(ip, dip);
        if (error)
                goto out_brelse;