From: Darrick J. Wong Date: Thu, 18 Aug 2016 23:30:57 +0000 (+1000) Subject: xfs: remove OWN_AG rmap when allocating a block from the AGFL X-Git-Tag: v4.8.0-rc1~43 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=59b863607a8da292564e64eb205d31e3050faeed;p=thirdparty%2Fxfsprogs-dev.git xfs: remove OWN_AG rmap when allocating a block from the AGFL When we're really tight on space, xfs_alloc_ag_vextent_small() can allocate a block from the AGFL and give it to the caller. Since the caller is never the AGFL-fixing method, we must remove the OWN_AG reverse mapping because it will clash with whatever rmap the caller wants to set up. This bug was discovered by running generic/299 repeatedly. Signed-off-by: Darrick J. Wong Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner --- diff --git a/libxfs/xfs_alloc.c b/libxfs/xfs_alloc.c index c6f4601ff..61aa0023a 100644 --- a/libxfs/xfs_alloc.c +++ b/libxfs/xfs_alloc.c @@ -1578,6 +1578,8 @@ xfs_alloc_ag_vextent_small( xfs_extlen_t *flenp, /* result length */ int *stat) /* status: 0-freelist, 1-normal/none */ { + struct xfs_owner_info oinfo; + struct xfs_perag *pag; int error; xfs_agblock_t fbno; xfs_extlen_t flen; @@ -1620,6 +1622,20 @@ 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; + pag = xfs_perag_get(args->mp, args->agno); + xfs_perag_put(pag); + *stat = 0; return 0; }