It's possible, if reflink and rmap are both enabled, for CoW to create a lot of small mappings that cause an rmap btree expansion to run out of space. If both are enabled, keep the AGFL fully stocked at all times, refuse to CoW if we start to run out of space in the AGFL, and hope that's good enough. Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> --- libxfs/xfs_alloc.c | 8 ++++++++ repair/xfs_repair.c | 5 +++++ 2 files changed, 13 insertions(+) diff --git a/libxfs/xfs_alloc.c b/libxfs/xfs_alloc.c index 619e06d..86bc620 100644 --- a/libxfs/xfs_alloc.c +++ b/libxfs/xfs_alloc.c @@ -1997,6 +1997,14 @@ xfs_alloc_min_freelist( min_free += min_t(unsigned int, pag->pagf_levels[XFS_BTNUM_RMAPi] + 1, mp->m_ag_maxlevels); + /* + * The rmapbt can explode if we have reflink enabled and someone + * creates a lot of small mappings... so max out the AGFL to try + * to prevent that. + */ + if (xfs_sb_version_hasrmapbt(&mp->m_sb) && + xfs_sb_version_hasreflink(&mp->m_sb)) + min_free = XFS_AGFL_SIZE(mp) - min_free; return min_free; } diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c index 1d402a5..372c8f8 100644 --- a/repair/xfs_repair.c +++ b/repair/xfs_repair.c @@ -424,6 +424,11 @@ calc_mkfs(xfs_mount_t *mp) } if (xfs_sb_version_hasreflink(&mp->m_sb)) fino_bno++; + if (xfs_sb_version_hasrmapbt(&mp->m_sb) && + xfs_sb_version_hasreflink(&mp->m_sb)) { + fino_bno = XFS_AGFL_SIZE(mp) + (fino_bno - + (6 * min(2, mp->m_ag_maxlevels))); + } /* * If the log is allocated in the first allocation group we need to _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs