diff options
Diffstat (limited to 'fs/xfs/libxfs/xfs_ialloc.c')
| -rw-r--r-- | fs/xfs/libxfs/xfs_ialloc.c | 24 | 
1 files changed, 16 insertions, 8 deletions
| diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index a16d5de16933..34600f94c2f4 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -1834,7 +1834,7 @@ retry:   * might be sparse and only free the regions that are allocated as part of the   * chunk.   */ -STATIC void +static int  xfs_difree_inode_chunk(  	struct xfs_trans		*tp,  	xfs_agnumber_t			agno, @@ -1851,10 +1851,10 @@ xfs_difree_inode_chunk(  	if (!xfs_inobt_issparse(rec->ir_holemask)) {  		/* not sparse, calculate extent info directly */ -		xfs_free_extent_later(tp, XFS_AGB_TO_FSB(mp, agno, sagbno), -				  M_IGEO(mp)->ialloc_blks, -				  &XFS_RMAP_OINFO_INODES); -		return; +		return xfs_free_extent_later(tp, +				XFS_AGB_TO_FSB(mp, agno, sagbno), +				M_IGEO(mp)->ialloc_blks, +				&XFS_RMAP_OINFO_INODES);  	}  	/* holemask is only 16-bits (fits in an unsigned long) */ @@ -1871,6 +1871,8 @@ xfs_difree_inode_chunk(  						XFS_INOBT_HOLEMASK_BITS);  	nextbit = startidx + 1;  	while (startidx < XFS_INOBT_HOLEMASK_BITS) { +		int error; +  		nextbit = find_next_zero_bit(holemask, XFS_INOBT_HOLEMASK_BITS,  					     nextbit);  		/* @@ -1896,8 +1898,11 @@ xfs_difree_inode_chunk(  		ASSERT(agbno % mp->m_sb.sb_spino_align == 0);  		ASSERT(contigblk % mp->m_sb.sb_spino_align == 0); -		xfs_free_extent_later(tp, XFS_AGB_TO_FSB(mp, agno, agbno), -				  contigblk, &XFS_RMAP_OINFO_INODES); +		error = xfs_free_extent_later(tp, +				XFS_AGB_TO_FSB(mp, agno, agbno), +				contigblk, &XFS_RMAP_OINFO_INODES); +		if (error) +			return error;  		/* reset range to current bit and carry on... */  		startidx = endidx = nextbit; @@ -1905,6 +1910,7 @@ xfs_difree_inode_chunk(  next:  		nextbit++;  	} +	return 0;  }  STATIC int @@ -2003,7 +2009,9 @@ xfs_difree_inobt(  			goto error0;  		} -		xfs_difree_inode_chunk(tp, pag->pag_agno, &rec); +		error = xfs_difree_inode_chunk(tp, pag->pag_agno, &rec); +		if (error) +			goto error0;  	} else {  		xic->deleted = false; |