diff options
| author | Dmitry Torokhov <[email protected]> | 2023-05-01 15:20:08 -0700 | 
|---|---|---|
| committer | Dmitry Torokhov <[email protected]> | 2023-05-01 15:20:08 -0700 | 
| commit | 9a87ffc99ec8eb8d35eed7c4f816d75f5cc9662e (patch) | |
| tree | d57f3a63479a07b4e0cece029886e76e04feb984 /fs/xfs/libxfs/xfs_refcount.c | |
| parent | 5dc63e56a9cf8df0b59c234a505a1653f1bdf885 (diff) | |
| parent | 53bea86b5712c7491bb3dae12e271666df0a308c (diff) | |
Merge branch 'next' into for-linus
Prepare input updates for 6.4 merge window.
Diffstat (limited to 'fs/xfs/libxfs/xfs_refcount.c')
| -rw-r--r-- | fs/xfs/libxfs/xfs_refcount.c | 96 | 
1 files changed, 43 insertions, 53 deletions
diff --git a/fs/xfs/libxfs/xfs_refcount.c b/fs/xfs/libxfs/xfs_refcount.c index 6f7ed9288fe4..bcf46aa0d08b 100644 --- a/fs/xfs/libxfs/xfs_refcount.c +++ b/fs/xfs/libxfs/xfs_refcount.c @@ -1213,37 +1213,33 @@ out_error:  STATIC int  xfs_refcount_adjust(  	struct xfs_btree_cur	*cur, -	xfs_agblock_t		agbno, -	xfs_extlen_t		aglen, -	xfs_agblock_t		*new_agbno, -	xfs_extlen_t		*new_aglen, +	xfs_agblock_t		*agbno, +	xfs_extlen_t		*aglen,  	enum xfs_refc_adjust_op	adj)  {  	bool			shape_changed;  	int			shape_changes = 0;  	int			error; -	*new_agbno = agbno; -	*new_aglen = aglen;  	if (adj == XFS_REFCOUNT_ADJUST_INCREASE) -		trace_xfs_refcount_increase(cur->bc_mp, cur->bc_ag.pag->pag_agno, -				agbno, aglen); +		trace_xfs_refcount_increase(cur->bc_mp, +				cur->bc_ag.pag->pag_agno, *agbno, *aglen);  	else -		trace_xfs_refcount_decrease(cur->bc_mp, cur->bc_ag.pag->pag_agno, -				agbno, aglen); +		trace_xfs_refcount_decrease(cur->bc_mp, +				cur->bc_ag.pag->pag_agno, *agbno, *aglen);  	/*  	 * Ensure that no rcextents cross the boundary of the adjustment range.  	 */  	error = xfs_refcount_split_extent(cur, XFS_REFC_DOMAIN_SHARED, -			agbno, &shape_changed); +			*agbno, &shape_changed);  	if (error)  		goto out_error;  	if (shape_changed)  		shape_changes++;  	error = xfs_refcount_split_extent(cur, XFS_REFC_DOMAIN_SHARED, -			agbno + aglen, &shape_changed); +			*agbno + *aglen, &shape_changed);  	if (error)  		goto out_error;  	if (shape_changed) @@ -1253,7 +1249,7 @@ xfs_refcount_adjust(  	 * Try to merge with the left or right extents of the range.  	 */  	error = xfs_refcount_merge_extents(cur, XFS_REFC_DOMAIN_SHARED, -			new_agbno, new_aglen, adj, &shape_changed); +			agbno, aglen, adj, &shape_changed);  	if (error)  		goto out_error;  	if (shape_changed) @@ -1262,7 +1258,7 @@ xfs_refcount_adjust(  		cur->bc_ag.refc.shape_changes++;  	/* Now that we've taken care of the ends, adjust the middle extents */ -	error = xfs_refcount_adjust_extents(cur, new_agbno, new_aglen, adj); +	error = xfs_refcount_adjust_extents(cur, agbno, aglen, adj);  	if (error)  		goto out_error; @@ -1298,21 +1294,20 @@ xfs_refcount_finish_one_cleanup(  static inline int  xfs_refcount_continue_op(  	struct xfs_btree_cur		*cur, -	xfs_fsblock_t			startblock, -	xfs_agblock_t			new_agbno, -	xfs_extlen_t			new_len, -	xfs_fsblock_t			*new_fsbno) +	struct xfs_refcount_intent	*ri, +	xfs_agblock_t			new_agbno)  {  	struct xfs_mount		*mp = cur->bc_mp;  	struct xfs_perag		*pag = cur->bc_ag.pag; -	if (XFS_IS_CORRUPT(mp, !xfs_verify_agbext(pag, new_agbno, new_len))) +	if (XFS_IS_CORRUPT(mp, !xfs_verify_agbext(pag, new_agbno, +					ri->ri_blockcount)))  		return -EFSCORRUPTED; -	*new_fsbno = XFS_AGB_TO_FSB(mp, pag->pag_agno, new_agbno); +	ri->ri_startblock = XFS_AGB_TO_FSB(mp, pag->pag_agno, new_agbno); -	ASSERT(xfs_verify_fsbext(mp, *new_fsbno, new_len)); -	ASSERT(pag->pag_agno == XFS_FSB_TO_AGNO(mp, *new_fsbno)); +	ASSERT(xfs_verify_fsbext(mp, ri->ri_startblock, ri->ri_blockcount)); +	ASSERT(pag->pag_agno == XFS_FSB_TO_AGNO(mp, ri->ri_startblock));  	return 0;  } @@ -1327,11 +1322,7 @@ xfs_refcount_continue_op(  int  xfs_refcount_finish_one(  	struct xfs_trans		*tp, -	enum xfs_refcount_intent_type	type, -	xfs_fsblock_t			startblock, -	xfs_extlen_t			blockcount, -	xfs_fsblock_t			*new_fsb, -	xfs_extlen_t			*new_len, +	struct xfs_refcount_intent	*ri,  	struct xfs_btree_cur		**pcur)  {  	struct xfs_mount		*mp = tp->t_mountp; @@ -1339,17 +1330,16 @@ xfs_refcount_finish_one(  	struct xfs_buf			*agbp = NULL;  	int				error = 0;  	xfs_agblock_t			bno; -	xfs_agblock_t			new_agbno;  	unsigned long			nr_ops = 0;  	int				shape_changes = 0;  	struct xfs_perag		*pag; -	pag = xfs_perag_get(mp, XFS_FSB_TO_AGNO(mp, startblock)); -	bno = XFS_FSB_TO_AGBNO(mp, startblock); +	pag = xfs_perag_get(mp, XFS_FSB_TO_AGNO(mp, ri->ri_startblock)); +	bno = XFS_FSB_TO_AGBNO(mp, ri->ri_startblock); -	trace_xfs_refcount_deferred(mp, XFS_FSB_TO_AGNO(mp, startblock), -			type, XFS_FSB_TO_AGBNO(mp, startblock), -			blockcount); +	trace_xfs_refcount_deferred(mp, XFS_FSB_TO_AGNO(mp, ri->ri_startblock), +			ri->ri_type, XFS_FSB_TO_AGBNO(mp, ri->ri_startblock), +			ri->ri_blockcount);  	if (XFS_TEST_ERROR(false, mp, XFS_ERRTAG_REFCOUNT_FINISH_ONE)) {  		error = -EIO; @@ -1380,42 +1370,42 @@ xfs_refcount_finish_one(  	}  	*pcur = rcur; -	switch (type) { +	switch (ri->ri_type) {  	case XFS_REFCOUNT_INCREASE: -		error = xfs_refcount_adjust(rcur, bno, blockcount, &new_agbno, -				new_len, XFS_REFCOUNT_ADJUST_INCREASE); +		error = xfs_refcount_adjust(rcur, &bno, &ri->ri_blockcount, +				XFS_REFCOUNT_ADJUST_INCREASE);  		if (error)  			goto out_drop; -		if (*new_len > 0) -			error = xfs_refcount_continue_op(rcur, startblock, -					new_agbno, *new_len, new_fsb); +		if (ri->ri_blockcount > 0) +			error = xfs_refcount_continue_op(rcur, ri, bno);  		break;  	case XFS_REFCOUNT_DECREASE: -		error = xfs_refcount_adjust(rcur, bno, blockcount, &new_agbno, -				new_len, XFS_REFCOUNT_ADJUST_DECREASE); +		error = xfs_refcount_adjust(rcur, &bno, &ri->ri_blockcount, +				XFS_REFCOUNT_ADJUST_DECREASE);  		if (error)  			goto out_drop; -		if (*new_len > 0) -			error = xfs_refcount_continue_op(rcur, startblock, -					new_agbno, *new_len, new_fsb); +		if (ri->ri_blockcount > 0) +			error = xfs_refcount_continue_op(rcur, ri, bno);  		break;  	case XFS_REFCOUNT_ALLOC_COW: -		*new_fsb = startblock + blockcount; -		*new_len = 0; -		error = __xfs_refcount_cow_alloc(rcur, bno, blockcount); +		error = __xfs_refcount_cow_alloc(rcur, bno, ri->ri_blockcount); +		if (error) +			goto out_drop; +		ri->ri_blockcount = 0;  		break;  	case XFS_REFCOUNT_FREE_COW: -		*new_fsb = startblock + blockcount; -		*new_len = 0; -		error = __xfs_refcount_cow_free(rcur, bno, blockcount); +		error = __xfs_refcount_cow_free(rcur, bno, ri->ri_blockcount); +		if (error) +			goto out_drop; +		ri->ri_blockcount = 0;  		break;  	default:  		ASSERT(0);  		error = -EFSCORRUPTED;  	} -	if (!error && *new_len > 0) -		trace_xfs_refcount_finish_one_leftover(mp, pag->pag_agno, type, -				bno, blockcount, new_agbno, *new_len); +	if (!error && ri->ri_blockcount > 0) +		trace_xfs_refcount_finish_one_leftover(mp, pag->pag_agno, +				ri->ri_type, bno, ri->ri_blockcount);  out_drop:  	xfs_perag_put(pag);  	return error;  |