162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (c) 2000,2005 Silicon Graphics, Inc. 462306a36Sopenharmony_ci * All Rights Reserved. 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci#ifndef __XFS_TRANS_SPACE_H__ 762306a36Sopenharmony_ci#define __XFS_TRANS_SPACE_H__ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci/* 1062306a36Sopenharmony_ci * Components of space reservations. 1162306a36Sopenharmony_ci */ 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci/* Worst case number of rmaps that can be held in a block. */ 1462306a36Sopenharmony_ci#define XFS_MAX_CONTIG_RMAPS_PER_BLOCK(mp) \ 1562306a36Sopenharmony_ci (((mp)->m_rmap_mxr[0]) - ((mp)->m_rmap_mnr[0])) 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci/* Adding one rmap could split every level up to the top of the tree. */ 1862306a36Sopenharmony_ci#define XFS_RMAPADD_SPACE_RES(mp) ((mp)->m_rmap_maxlevels) 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci/* 2162306a36Sopenharmony_ci * Note that we historically set m_rmap_maxlevels to 9 when reflink is enabled, 2262306a36Sopenharmony_ci * so we must preserve this behavior to avoid changing the transaction space 2362306a36Sopenharmony_ci * reservations and minimum log size calculations for existing filesystems. 2462306a36Sopenharmony_ci */ 2562306a36Sopenharmony_ci#define XFS_OLD_REFLINK_RMAP_MAXLEVELS 9 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci/* Blocks we might need to add "b" rmaps to a tree. */ 2862306a36Sopenharmony_ci#define XFS_NRMAPADD_SPACE_RES(mp, b)\ 2962306a36Sopenharmony_ci (((b + XFS_MAX_CONTIG_RMAPS_PER_BLOCK(mp) - 1) / \ 3062306a36Sopenharmony_ci XFS_MAX_CONTIG_RMAPS_PER_BLOCK(mp)) * \ 3162306a36Sopenharmony_ci XFS_RMAPADD_SPACE_RES(mp)) 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci#define XFS_MAX_CONTIG_EXTENTS_PER_BLOCK(mp) \ 3462306a36Sopenharmony_ci (((mp)->m_alloc_mxr[0]) - ((mp)->m_alloc_mnr[0])) 3562306a36Sopenharmony_ci#define XFS_EXTENTADD_SPACE_RES(mp,w) (XFS_BM_MAXLEVELS(mp,w) - 1) 3662306a36Sopenharmony_ci#define XFS_NEXTENTADD_SPACE_RES(mp,b,w)\ 3762306a36Sopenharmony_ci (((b + XFS_MAX_CONTIG_EXTENTS_PER_BLOCK(mp) - 1) / \ 3862306a36Sopenharmony_ci XFS_MAX_CONTIG_EXTENTS_PER_BLOCK(mp)) * \ 3962306a36Sopenharmony_ci XFS_EXTENTADD_SPACE_RES(mp,w)) 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci/* Blocks we might need to add "b" mappings & rmappings to a file. */ 4262306a36Sopenharmony_ci#define XFS_SWAP_RMAP_SPACE_RES(mp,b,w)\ 4362306a36Sopenharmony_ci (XFS_NEXTENTADD_SPACE_RES((mp), (b), (w)) + \ 4462306a36Sopenharmony_ci XFS_NRMAPADD_SPACE_RES((mp), (b))) 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci#define XFS_DAENTER_1B(mp,w) \ 4762306a36Sopenharmony_ci ((w) == XFS_DATA_FORK ? (mp)->m_dir_geo->fsbcount : 1) 4862306a36Sopenharmony_ci#define XFS_DAENTER_DBS(mp,w) \ 4962306a36Sopenharmony_ci (XFS_DA_NODE_MAXDEPTH + (((w) == XFS_DATA_FORK) ? 2 : 0)) 5062306a36Sopenharmony_ci#define XFS_DAENTER_BLOCKS(mp,w) \ 5162306a36Sopenharmony_ci (XFS_DAENTER_1B(mp,w) * XFS_DAENTER_DBS(mp,w)) 5262306a36Sopenharmony_ci#define XFS_DAENTER_BMAP1B(mp,w) \ 5362306a36Sopenharmony_ci XFS_NEXTENTADD_SPACE_RES(mp, XFS_DAENTER_1B(mp, w), w) 5462306a36Sopenharmony_ci#define XFS_DAENTER_BMAPS(mp,w) \ 5562306a36Sopenharmony_ci (XFS_DAENTER_DBS(mp,w) * XFS_DAENTER_BMAP1B(mp,w)) 5662306a36Sopenharmony_ci#define XFS_DAENTER_SPACE_RES(mp,w) \ 5762306a36Sopenharmony_ci (XFS_DAENTER_BLOCKS(mp,w) + XFS_DAENTER_BMAPS(mp,w)) 5862306a36Sopenharmony_ci#define XFS_DAREMOVE_SPACE_RES(mp,w) XFS_DAENTER_BMAPS(mp,w) 5962306a36Sopenharmony_ci#define XFS_DIRENTER_MAX_SPLIT(mp,nl) 1 6062306a36Sopenharmony_ci#define XFS_DIRENTER_SPACE_RES(mp,nl) \ 6162306a36Sopenharmony_ci (XFS_DAENTER_SPACE_RES(mp, XFS_DATA_FORK) * \ 6262306a36Sopenharmony_ci XFS_DIRENTER_MAX_SPLIT(mp,nl)) 6362306a36Sopenharmony_ci#define XFS_DIRREMOVE_SPACE_RES(mp) \ 6462306a36Sopenharmony_ci XFS_DAREMOVE_SPACE_RES(mp, XFS_DATA_FORK) 6562306a36Sopenharmony_ci#define XFS_IALLOC_SPACE_RES(mp) \ 6662306a36Sopenharmony_ci (M_IGEO(mp)->ialloc_blks + \ 6762306a36Sopenharmony_ci ((xfs_has_finobt(mp) ? 2 : 1) * M_IGEO(mp)->inobt_maxlevels)) 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci/* 7062306a36Sopenharmony_ci * Space reservation values for various transactions. 7162306a36Sopenharmony_ci */ 7262306a36Sopenharmony_ci#define XFS_ADDAFORK_SPACE_RES(mp) \ 7362306a36Sopenharmony_ci ((mp)->m_dir_geo->fsbcount + XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK)) 7462306a36Sopenharmony_ci#define XFS_ATTRRM_SPACE_RES(mp) \ 7562306a36Sopenharmony_ci XFS_DAREMOVE_SPACE_RES(mp, XFS_ATTR_FORK) 7662306a36Sopenharmony_ci/* This macro is not used - see inline code in xfs_attr_set */ 7762306a36Sopenharmony_ci#define XFS_ATTRSET_SPACE_RES(mp, v) \ 7862306a36Sopenharmony_ci (XFS_DAENTER_SPACE_RES(mp, XFS_ATTR_FORK) + XFS_B_TO_FSB(mp, v)) 7962306a36Sopenharmony_ci#define XFS_CREATE_SPACE_RES(mp,nl) \ 8062306a36Sopenharmony_ci (XFS_IALLOC_SPACE_RES(mp) + XFS_DIRENTER_SPACE_RES(mp,nl)) 8162306a36Sopenharmony_ci#define XFS_DIOSTRAT_SPACE_RES(mp, v) \ 8262306a36Sopenharmony_ci (XFS_EXTENTADD_SPACE_RES(mp, XFS_DATA_FORK) + (v)) 8362306a36Sopenharmony_ci#define XFS_GROWFS_SPACE_RES(mp) \ 8462306a36Sopenharmony_ci (2 * (mp)->m_alloc_maxlevels) 8562306a36Sopenharmony_ci#define XFS_GROWFSRT_SPACE_RES(mp,b) \ 8662306a36Sopenharmony_ci ((b) + XFS_EXTENTADD_SPACE_RES(mp, XFS_DATA_FORK)) 8762306a36Sopenharmony_ci#define XFS_LINK_SPACE_RES(mp,nl) \ 8862306a36Sopenharmony_ci XFS_DIRENTER_SPACE_RES(mp,nl) 8962306a36Sopenharmony_ci#define XFS_MKDIR_SPACE_RES(mp,nl) \ 9062306a36Sopenharmony_ci (XFS_IALLOC_SPACE_RES(mp) + XFS_DIRENTER_SPACE_RES(mp,nl)) 9162306a36Sopenharmony_ci#define XFS_QM_DQALLOC_SPACE_RES(mp) \ 9262306a36Sopenharmony_ci (XFS_EXTENTADD_SPACE_RES(mp, XFS_DATA_FORK) + \ 9362306a36Sopenharmony_ci XFS_DQUOT_CLUSTER_SIZE_FSB) 9462306a36Sopenharmony_ci#define XFS_QM_QINOCREATE_SPACE_RES(mp) \ 9562306a36Sopenharmony_ci XFS_IALLOC_SPACE_RES(mp) 9662306a36Sopenharmony_ci#define XFS_REMOVE_SPACE_RES(mp) \ 9762306a36Sopenharmony_ci XFS_DIRREMOVE_SPACE_RES(mp) 9862306a36Sopenharmony_ci#define XFS_RENAME_SPACE_RES(mp,nl) \ 9962306a36Sopenharmony_ci (XFS_DIRREMOVE_SPACE_RES(mp) + XFS_DIRENTER_SPACE_RES(mp,nl)) 10062306a36Sopenharmony_ci#define XFS_SYMLINK_SPACE_RES(mp,nl,b) \ 10162306a36Sopenharmony_ci (XFS_IALLOC_SPACE_RES(mp) + XFS_DIRENTER_SPACE_RES(mp,nl) + (b)) 10262306a36Sopenharmony_ci#define XFS_IFREE_SPACE_RES(mp) \ 10362306a36Sopenharmony_ci (xfs_has_finobt(mp) ? M_IGEO(mp)->inobt_maxlevels : 0) 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci#endif /* __XFS_TRANS_SPACE_H__ */ 107