mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-29 18:11:20 +00:00
xfs: hoist recovered extent-free intent checks out of xfs_efi_item_recover
When we recover a extent-free intent from the log, we need to validate its contents before we try to replay them. Hoist the checking code into a separate function in preparation to refactor this code to use validation helpers. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Brian Foster <bfoster@redhat.com>
This commit is contained in:
parent
0d79781a1a
commit
3c15df3de0
1 changed files with 25 additions and 8 deletions
|
@ -578,6 +578,25 @@ const struct xfs_defer_op_type xfs_agfl_free_defer_type = {
|
||||||
.cancel_item = xfs_extent_free_cancel_item,
|
.cancel_item = xfs_extent_free_cancel_item,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Is this recovered EFI ok? */
|
||||||
|
static inline bool
|
||||||
|
xfs_efi_validate_ext(
|
||||||
|
struct xfs_mount *mp,
|
||||||
|
struct xfs_extent *extp)
|
||||||
|
{
|
||||||
|
xfs_fsblock_t startblock_fsb;
|
||||||
|
|
||||||
|
startblock_fsb = XFS_BB_TO_FSB(mp,
|
||||||
|
XFS_FSB_TO_DADDR(mp, extp->ext_start));
|
||||||
|
if (startblock_fsb == 0 ||
|
||||||
|
extp->ext_len == 0 ||
|
||||||
|
startblock_fsb >= mp->m_sb.sb_dblocks ||
|
||||||
|
extp->ext_len >= mp->m_sb.sb_agblocks)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Process an extent free intent item that was recovered from
|
* Process an extent free intent item that was recovered from
|
||||||
* the log. We need to free the extents that it describes.
|
* the log. We need to free the extents that it describes.
|
||||||
|
@ -592,7 +611,6 @@ xfs_efi_item_recover(
|
||||||
struct xfs_efd_log_item *efdp;
|
struct xfs_efd_log_item *efdp;
|
||||||
struct xfs_trans *tp;
|
struct xfs_trans *tp;
|
||||||
struct xfs_extent *extp;
|
struct xfs_extent *extp;
|
||||||
xfs_fsblock_t startblock_fsb;
|
|
||||||
int i;
|
int i;
|
||||||
int error = 0;
|
int error = 0;
|
||||||
|
|
||||||
|
@ -602,14 +620,13 @@ xfs_efi_item_recover(
|
||||||
* just toss the EFI.
|
* just toss the EFI.
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < efip->efi_format.efi_nextents; i++) {
|
for (i = 0; i < efip->efi_format.efi_nextents; i++) {
|
||||||
extp = &efip->efi_format.efi_extents[i];
|
if (!xfs_efi_validate_ext(mp,
|
||||||
startblock_fsb = XFS_BB_TO_FSB(mp,
|
&efip->efi_format.efi_extents[i])) {
|
||||||
XFS_FSB_TO_DADDR(mp, extp->ext_start));
|
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
|
||||||
if (startblock_fsb == 0 ||
|
&efip->efi_format,
|
||||||
extp->ext_len == 0 ||
|
sizeof(efip->efi_format));
|
||||||
startblock_fsb >= mp->m_sb.sb_dblocks ||
|
|
||||||
extp->ext_len >= mp->m_sb.sb_agblocks)
|
|
||||||
return -EFSCORRUPTED;
|
return -EFSCORRUPTED;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
error = xfs_trans_alloc(mp, &M_RES(mp)->tr_itruncate, 0, 0, 0, &tp);
|
error = xfs_trans_alloc(mp, &M_RES(mp)->tr_itruncate, 0, 0, 0, &tp);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue