diff options
Diffstat (limited to 'fs/xfs/libxfs/xfs_ialloc.c')
| -rw-r--r-- | fs/xfs/libxfs/xfs_ialloc.c | 32 | 
1 files changed, 15 insertions, 17 deletions
diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 34600f94c2f4..b83e54c70906 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -1853,8 +1853,8 @@ xfs_difree_inode_chunk(  		/* not sparse, calculate extent info directly */  		return xfs_free_extent_later(tp,  				XFS_AGB_TO_FSB(mp, agno, sagbno), -				M_IGEO(mp)->ialloc_blks, -				&XFS_RMAP_OINFO_INODES); +				M_IGEO(mp)->ialloc_blks, &XFS_RMAP_OINFO_INODES, +				XFS_AG_RESV_NONE);  	}  	/* holemask is only 16-bits (fits in an unsigned long) */ @@ -1899,8 +1899,8 @@ xfs_difree_inode_chunk(  		ASSERT(agbno % mp->m_sb.sb_spino_align == 0);  		ASSERT(contigblk % mp->m_sb.sb_spino_align == 0);  		error = xfs_free_extent_later(tp, -				XFS_AGB_TO_FSB(mp, agno, agbno), -				contigblk, &XFS_RMAP_OINFO_INODES); +				XFS_AGB_TO_FSB(mp, agno, agbno), contigblk, +				&XFS_RMAP_OINFO_INODES, XFS_AG_RESV_NONE);  		if (error)  			return error; @@ -2486,11 +2486,14 @@ xfs_ialloc_log_agi(  static xfs_failaddr_t  xfs_agi_verify( -	struct xfs_buf	*bp) +	struct xfs_buf		*bp)  { -	struct xfs_mount *mp = bp->b_mount; -	struct xfs_agi	*agi = bp->b_addr; -	int		i; +	struct xfs_mount	*mp = bp->b_mount; +	struct xfs_agi		*agi = bp->b_addr; +	xfs_failaddr_t		fa; +	uint32_t		agi_seqno = be32_to_cpu(agi->agi_seqno); +	uint32_t		agi_length = be32_to_cpu(agi->agi_length); +	int			i;  	if (xfs_has_crc(mp)) {  		if (!uuid_equal(&agi->agi_uuid, &mp->m_sb.sb_meta_uuid)) @@ -2507,6 +2510,10 @@ xfs_agi_verify(  	if (!XFS_AGI_GOOD_VERSION(be32_to_cpu(agi->agi_versionnum)))  		return __this_address; +	fa = xfs_validate_ag_length(bp, agi_seqno, agi_length); +	if (fa) +		return fa; +  	if (be32_to_cpu(agi->agi_level) < 1 ||  	    be32_to_cpu(agi->agi_level) > M_IGEO(mp)->inobt_maxlevels)  		return __this_address; @@ -2516,15 +2523,6 @@ xfs_agi_verify(  	     be32_to_cpu(agi->agi_free_level) > M_IGEO(mp)->inobt_maxlevels))  		return __this_address; -	/* -	 * during growfs operations, the perag is not fully initialised, -	 * so we can't use it for any useful checking. growfs ensures we can't -	 * use it by using uncached buffers that don't have the perag attached -	 * so we can detect and avoid this problem. -	 */ -	if (bp->b_pag && be32_to_cpu(agi->agi_seqno) != bp->b_pag->pag_agno) -		return __this_address; -  	for (i = 0; i < XFS_AGI_UNLINKED_BUCKETS; i++) {  		if (agi->agi_unlinked[i] == cpu_to_be32(NULLAGINO))  			continue;  |