diff options
Diffstat (limited to 'fs/xfs/libxfs/xfs_inode_fork.c')
-rw-r--r-- | fs/xfs/libxfs/xfs_inode_fork.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/fs/xfs/libxfs/xfs_inode_fork.c b/fs/xfs/libxfs/xfs_inode_fork.c index 222e103356c6..25c1e078aef6 100644 --- a/fs/xfs/libxfs/xfs_inode_fork.c +++ b/fs/xfs/libxfs/xfs_inode_fork.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include "xfs_inode.h" | 26 | #include "xfs_inode.h" |
27 | #include "xfs_trans.h" | 27 | #include "xfs_trans.h" |
28 | #include "xfs_inode_item.h" | 28 | #include "xfs_inode_item.h" |
29 | #include "xfs_btree.h" | ||
29 | #include "xfs_bmap_btree.h" | 30 | #include "xfs_bmap_btree.h" |
30 | #include "xfs_bmap.h" | 31 | #include "xfs_bmap.h" |
31 | #include "xfs_error.h" | 32 | #include "xfs_error.h" |
@@ -429,11 +430,13 @@ xfs_iformat_btree( | |||
429 | /* REFERENCED */ | 430 | /* REFERENCED */ |
430 | int nrecs; | 431 | int nrecs; |
431 | int size; | 432 | int size; |
433 | int level; | ||
432 | 434 | ||
433 | ifp = XFS_IFORK_PTR(ip, whichfork); | 435 | ifp = XFS_IFORK_PTR(ip, whichfork); |
434 | dfp = (xfs_bmdr_block_t *)XFS_DFORK_PTR(dip, whichfork); | 436 | dfp = (xfs_bmdr_block_t *)XFS_DFORK_PTR(dip, whichfork); |
435 | size = XFS_BMAP_BROOT_SPACE(mp, dfp); | 437 | size = XFS_BMAP_BROOT_SPACE(mp, dfp); |
436 | nrecs = be16_to_cpu(dfp->bb_numrecs); | 438 | nrecs = be16_to_cpu(dfp->bb_numrecs); |
439 | level = be16_to_cpu(dfp->bb_level); | ||
437 | 440 | ||
438 | /* | 441 | /* |
439 | * blow out if -- fork has less extents than can fit in | 442 | * blow out if -- fork has less extents than can fit in |
@@ -446,7 +449,8 @@ xfs_iformat_btree( | |||
446 | XFS_IFORK_MAXEXT(ip, whichfork) || | 449 | XFS_IFORK_MAXEXT(ip, whichfork) || |
447 | XFS_BMDR_SPACE_CALC(nrecs) > | 450 | XFS_BMDR_SPACE_CALC(nrecs) > |
448 | XFS_DFORK_SIZE(dip, mp, whichfork) || | 451 | XFS_DFORK_SIZE(dip, mp, whichfork) || |
449 | XFS_IFORK_NEXTENTS(ip, whichfork) > ip->i_d.di_nblocks)) { | 452 | XFS_IFORK_NEXTENTS(ip, whichfork) > ip->i_d.di_nblocks) || |
453 | level == 0 || level > XFS_BTREE_MAXLEVELS) { | ||
450 | xfs_warn(mp, "corrupt inode %Lu (btree).", | 454 | xfs_warn(mp, "corrupt inode %Lu (btree).", |
451 | (unsigned long long) ip->i_ino); | 455 | (unsigned long long) ip->i_ino); |
452 | XFS_CORRUPTION_ERROR("xfs_iformat_btree", XFS_ERRLEVEL_LOW, | 456 | XFS_CORRUPTION_ERROR("xfs_iformat_btree", XFS_ERRLEVEL_LOW, |
@@ -497,15 +501,14 @@ xfs_iread_extents( | |||
497 | * We know that the size is valid (it's checked in iformat_btree) | 501 | * We know that the size is valid (it's checked in iformat_btree) |
498 | */ | 502 | */ |
499 | ifp->if_bytes = ifp->if_real_bytes = 0; | 503 | ifp->if_bytes = ifp->if_real_bytes = 0; |
500 | ifp->if_flags |= XFS_IFEXTENTS; | ||
501 | xfs_iext_add(ifp, 0, nextents); | 504 | xfs_iext_add(ifp, 0, nextents); |
502 | error = xfs_bmap_read_extents(tp, ip, whichfork); | 505 | error = xfs_bmap_read_extents(tp, ip, whichfork); |
503 | if (error) { | 506 | if (error) { |
504 | xfs_iext_destroy(ifp); | 507 | xfs_iext_destroy(ifp); |
505 | ifp->if_flags &= ~XFS_IFEXTENTS; | ||
506 | return error; | 508 | return error; |
507 | } | 509 | } |
508 | xfs_validate_extents(ifp, nextents, XFS_EXTFMT_INODE(ip)); | 510 | xfs_validate_extents(ifp, nextents, XFS_EXTFMT_INODE(ip)); |
511 | ifp->if_flags |= XFS_IFEXTENTS; | ||
509 | return 0; | 512 | return 0; |
510 | } | 513 | } |
511 | /* | 514 | /* |