diff options
Diffstat (limited to 'fs/xfs/libxfs/xfs_da_btree.c')
| -rw-r--r-- | fs/xfs/libxfs/xfs_da_btree.c | 37 | 
1 files changed, 18 insertions, 19 deletions
| diff --git a/fs/xfs/libxfs/xfs_da_btree.c b/fs/xfs/libxfs/xfs_da_btree.c index 8a301402bbc4..376bee94b5dd 100644 --- a/fs/xfs/libxfs/xfs_da_btree.c +++ b/fs/xfs/libxfs/xfs_da_btree.c @@ -1481,6 +1481,7 @@ xfs_da3_node_lookup_int(  	int			error;  	int			retval;  	unsigned int		expected_level = 0; +	uint16_t		magic;  	struct xfs_inode	*dp = state->args->dp;  	args = state->args; @@ -1505,25 +1506,27 @@ xfs_da3_node_lookup_int(  			return error;  		}  		curr = blk->bp->b_addr; -		blk->magic = be16_to_cpu(curr->magic); +		magic = be16_to_cpu(curr->magic); -		if (blk->magic == XFS_ATTR_LEAF_MAGIC || -		    blk->magic == XFS_ATTR3_LEAF_MAGIC) { +		if (magic == XFS_ATTR_LEAF_MAGIC || +		    magic == XFS_ATTR3_LEAF_MAGIC) {  			blk->magic = XFS_ATTR_LEAF_MAGIC;  			blk->hashval = xfs_attr_leaf_lasthash(blk->bp, NULL);  			break;  		} -		if (blk->magic == XFS_DIR2_LEAFN_MAGIC || -		    blk->magic == XFS_DIR3_LEAFN_MAGIC) { +		if (magic == XFS_DIR2_LEAFN_MAGIC || +		    magic == XFS_DIR3_LEAFN_MAGIC) {  			blk->magic = XFS_DIR2_LEAFN_MAGIC;  			blk->hashval = xfs_dir2_leaf_lasthash(args->dp,  							      blk->bp, NULL);  			break;  		} -		blk->magic = XFS_DA_NODE_MAGIC; +		if (magic != XFS_DA_NODE_MAGIC && magic != XFS_DA3_NODE_MAGIC) +			return -EFSCORRUPTED; +		blk->magic = XFS_DA_NODE_MAGIC;  		/*  		 * Search an intermediate node for a match. @@ -2059,11 +2062,9 @@ xfs_da_grow_inode_int(  	 * Try mapping it in one filesystem block.  	 */  	nmap = 1; -	ASSERT(args->firstblock != NULL);  	error = xfs_bmapi_write(tp, dp, *bno, count,  			xfs_bmapi_aflag(w)|XFS_BMAPI_METADATA|XFS_BMAPI_CONTIG, -			args->firstblock, args->total, &map, &nmap, -			args->dfops); +			args->total, &map, &nmap);  	if (error)  		return error; @@ -2085,8 +2086,7 @@ xfs_da_grow_inode_int(  			c = (int)(*bno + count - b);  			error = xfs_bmapi_write(tp, dp, b, c,  					xfs_bmapi_aflag(w)|XFS_BMAPI_METADATA, -					args->firstblock, args->total, -					&mapp[mapi], &nmap, args->dfops); +					args->total, &mapp[mapi], &nmap);  			if (error)  				goto out_free_map;  			if (nmap < 1) @@ -2375,13 +2375,13 @@ done:   */  int  xfs_da_shrink_inode( -	xfs_da_args_t	*args, -	xfs_dablk_t	dead_blkno, -	struct xfs_buf	*dead_buf) +	struct xfs_da_args	*args, +	xfs_dablk_t		dead_blkno, +	struct xfs_buf		*dead_buf)  { -	xfs_inode_t *dp; -	int done, error, w, count; -	xfs_trans_t *tp; +	struct xfs_inode	*dp; +	int			done, error, w, count; +	struct xfs_trans	*tp;  	trace_xfs_da_shrink_inode(args); @@ -2395,8 +2395,7 @@ xfs_da_shrink_inode(  		 * the last block to the place we want to kill.  		 */  		error = xfs_bunmapi(tp, dp, dead_blkno, count, -				    xfs_bmapi_aflag(w), 0, args->firstblock, -				    args->dfops, &done); +				    xfs_bmapi_aflag(w), 0, &done);  		if (error == -ENOSPC) {  			if (w != XFS_DATA_FORK)  				break; |