aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/libxfs/xfs_inode_fork.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/xfs/libxfs/xfs_inode_fork.c')
-rw-r--r--fs/xfs/libxfs/xfs_inode_fork.c9
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/*