• Darrick J. Wong's avatar
    xfs: try other AGs to allocate a BMBT block · 90e2056d
    Darrick J. Wong authored
    Prior to the introduction of reflink, allocating a block and mapping
    it into a file was performed in a single transaction with a single
    block reservation, and the allocator was supposed to find enough
    blocks to allocate the extent and any BMBT blocks that might be
    necessary (unless we're low on space).
    
    However, due to the way copy on write works, allocation and mapping
    have been split into two transactions, which means that we must be
    able to handle the case where we allocate an extent for CoW but that
    AG runs out of free space before the blocks can be mapped into a file,
    and the mapping requires a new BMBT block.  When this happens, look in
    one of the other AGs for a BMBT block instead of taking the FS down.
    
    The same applies to the functions that convert a data fork to extents
    and later btree format.
    Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    90e2056d
xfs_bmap_btree.c 23 KB