diff options
Diffstat (limited to 'fs/xfs/libxfs/xfs_bmap.c')
| -rw-r--r-- | fs/xfs/libxfs/xfs_bmap.c | 15 | 
1 files changed, 9 insertions, 6 deletions
| diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index 48502cb9990f..4637ae1ae91c 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -1191,7 +1191,10 @@ xfs_iread_extents(  	 * Root level must use BMAP_BROOT_PTR_ADDR macro to get ptr out.  	 */  	level = be16_to_cpu(block->bb_level); -	ASSERT(level > 0); +	if (unlikely(level == 0)) { +		XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, mp); +		return -EFSCORRUPTED; +	}  	pp = XFS_BMAP_BROOT_PTR_ADDR(mp, block, 1, ifp->if_broot_bytes);  	bno = be64_to_cpu(*pp); @@ -4249,9 +4252,13 @@ xfs_bmapi_write(  	struct xfs_bmbt_irec	*mval,		/* output: map values */  	int			*nmap)		/* i/o: mval size/count */  { +	struct xfs_bmalloca	bma = { +		.tp		= tp, +		.ip		= ip, +		.total		= total, +	};  	struct xfs_mount	*mp = ip->i_mount;  	struct xfs_ifork	*ifp; -	struct xfs_bmalloca	bma = { NULL };	/* args for xfs_bmap_alloc */  	xfs_fileoff_t		end;		/* end of mapped file region */  	bool			eof = false;	/* after the end of extents */  	int			error;		/* error return */ @@ -4319,10 +4326,6 @@ xfs_bmapi_write(  		eof = true;  	if (!xfs_iext_peek_prev_extent(ifp, &bma.icur, &bma.prev))  		bma.prev.br_startoff = NULLFILEOFF; -	bma.tp = tp; -	bma.ip = ip; -	bma.total = total; -	bma.datatype = 0;  	bma.minleft = xfs_bmapi_minleft(tp, ip, whichfork);  	n = 0; |