diff options
Diffstat (limited to 'fs/xfs/libxfs/xfs_alloc.c')
| -rw-r--r-- | fs/xfs/libxfs/xfs_alloc.c | 16 | 
1 files changed, 16 insertions, 0 deletions
diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c index 776ae2f325d1..05b5243d89f6 100644 --- a/fs/xfs/libxfs/xfs_alloc.c +++ b/fs/xfs/libxfs/xfs_alloc.c @@ -1582,6 +1582,7 @@ xfs_alloc_ag_vextent_small(  	xfs_extlen_t	*flenp,	/* result length */  	int		*stat)	/* status: 0-freelist, 1-normal/none */  { +	struct xfs_owner_info	oinfo;  	int		error;  	xfs_agblock_t	fbno;  	xfs_extlen_t	flen; @@ -1624,6 +1625,18 @@ xfs_alloc_ag_vextent_small(  				error0);  			args->wasfromfl = 1;  			trace_xfs_alloc_small_freelist(args); + +			/* +			 * If we're feeding an AGFL block to something that +			 * doesn't live in the free space, we need to clear +			 * out the OWN_AG rmap. +			 */ +			xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_AG); +			error = xfs_rmap_free(args->tp, args->agbp, args->agno, +					fbno, 1, &oinfo); +			if (error) +				goto error0; +  			*stat = 0;  			return 0;  		} @@ -2264,6 +2277,9 @@ xfs_alloc_log_agf(  		offsetof(xfs_agf_t, agf_longest),  		offsetof(xfs_agf_t, agf_btreeblks),  		offsetof(xfs_agf_t, agf_uuid), +		offsetof(xfs_agf_t, agf_rmap_blocks), +		/* needed so that we don't log the whole rest of the structure: */ +		offsetof(xfs_agf_t, agf_spare64),  		sizeof(xfs_agf_t)  	};  | 
