mirror of
https://github.com/edk2-porting/linux-next.git
synced 2025-01-02 10:43:57 +08:00
xfs: call xfs_dinode_verify from xfs_inode_from_disk
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>
This commit is contained in:
parent
0bce8173fd
commit
2d6051d496
@ -337,11 +337,11 @@ buffer.
|
|||||||
|
|
||||||
The structure of the verifiers and the identifiers checks is very similar to the
|
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
|
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
|
example, inode read verification is done in xfs_inode_from_disk() when the inode
|
||||||
read out of the buffer and the struct xfs_inode is instantiated. The inode is
|
is first read out of the buffer and the struct xfs_inode is instantiated. The
|
||||||
already extensively verified during writeback in xfs_iflush_int, so the only
|
inode is already extensively verified during writeback in xfs_iflush_int, so the
|
||||||
addition here is to add the LSN and CRC to the inode as it is copied back into
|
only addition here is to add the LSN and CRC to the inode as it is copied back
|
||||||
the buffer.
|
into the buffer.
|
||||||
|
|
||||||
XXX: inode unlinked list modification doesn't recalculate the inode CRC! None of
|
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
|
the unlinked list modifications check or update CRCs, neither during unlink nor
|
||||||
|
@ -188,10 +188,18 @@ xfs_inode_from_disk(
|
|||||||
struct xfs_icdinode *to = &ip->i_d;
|
struct xfs_icdinode *to = &ip->i_d;
|
||||||
struct inode *inode = VFS_I(ip);
|
struct inode *inode = VFS_I(ip);
|
||||||
int error;
|
int error;
|
||||||
|
xfs_failaddr_t fa;
|
||||||
|
|
||||||
ASSERT(ip->i_cowfp == NULL);
|
ASSERT(ip->i_cowfp == NULL);
|
||||||
ASSERT(ip->i_afp == 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
|
* 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
|
* 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_buf_t *bp;
|
||||||
xfs_dinode_t *dip;
|
xfs_dinode_t *dip;
|
||||||
xfs_failaddr_t fa;
|
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -652,15 +659,6 @@ xfs_iread(
|
|||||||
if (error)
|
if (error)
|
||||||
return 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);
|
error = xfs_inode_from_disk(ip, dip);
|
||||||
if (error)
|
if (error)
|
||||||
goto out_brelse;
|
goto out_brelse;
|
||||||
|
Loading…
Reference in New Issue
Block a user