18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (c) 2000,2005 Silicon Graphics, Inc. 48c2ecf20Sopenharmony_ci * All Rights Reserved. 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci#ifndef __XFS_TRANS_SPACE_H__ 78c2ecf20Sopenharmony_ci#define __XFS_TRANS_SPACE_H__ 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci/* 108c2ecf20Sopenharmony_ci * Components of space reservations. 118c2ecf20Sopenharmony_ci */ 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci/* Worst case number of rmaps that can be held in a block. */ 148c2ecf20Sopenharmony_ci#define XFS_MAX_CONTIG_RMAPS_PER_BLOCK(mp) \ 158c2ecf20Sopenharmony_ci (((mp)->m_rmap_mxr[0]) - ((mp)->m_rmap_mnr[0])) 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci/* Adding one rmap could split every level up to the top of the tree. */ 188c2ecf20Sopenharmony_ci#define XFS_RMAPADD_SPACE_RES(mp) ((mp)->m_rmap_maxlevels) 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci/* Blocks we might need to add "b" rmaps to a tree. */ 218c2ecf20Sopenharmony_ci#define XFS_NRMAPADD_SPACE_RES(mp, b)\ 228c2ecf20Sopenharmony_ci (((b + XFS_MAX_CONTIG_RMAPS_PER_BLOCK(mp) - 1) / \ 238c2ecf20Sopenharmony_ci XFS_MAX_CONTIG_RMAPS_PER_BLOCK(mp)) * \ 248c2ecf20Sopenharmony_ci XFS_RMAPADD_SPACE_RES(mp)) 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci#define XFS_MAX_CONTIG_EXTENTS_PER_BLOCK(mp) \ 278c2ecf20Sopenharmony_ci (((mp)->m_alloc_mxr[0]) - ((mp)->m_alloc_mnr[0])) 288c2ecf20Sopenharmony_ci#define XFS_EXTENTADD_SPACE_RES(mp,w) (XFS_BM_MAXLEVELS(mp,w) - 1) 298c2ecf20Sopenharmony_ci#define XFS_NEXTENTADD_SPACE_RES(mp,b,w)\ 308c2ecf20Sopenharmony_ci (((b + XFS_MAX_CONTIG_EXTENTS_PER_BLOCK(mp) - 1) / \ 318c2ecf20Sopenharmony_ci XFS_MAX_CONTIG_EXTENTS_PER_BLOCK(mp)) * \ 328c2ecf20Sopenharmony_ci XFS_EXTENTADD_SPACE_RES(mp,w)) 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci/* Blocks we might need to add "b" mappings & rmappings to a file. */ 358c2ecf20Sopenharmony_ci#define XFS_SWAP_RMAP_SPACE_RES(mp,b,w)\ 368c2ecf20Sopenharmony_ci (XFS_NEXTENTADD_SPACE_RES((mp), (b), (w)) + \ 378c2ecf20Sopenharmony_ci XFS_NRMAPADD_SPACE_RES((mp), (b))) 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci#define XFS_DAENTER_1B(mp,w) \ 408c2ecf20Sopenharmony_ci ((w) == XFS_DATA_FORK ? (mp)->m_dir_geo->fsbcount : 1) 418c2ecf20Sopenharmony_ci#define XFS_DAENTER_DBS(mp,w) \ 428c2ecf20Sopenharmony_ci (XFS_DA_NODE_MAXDEPTH + (((w) == XFS_DATA_FORK) ? 2 : 0)) 438c2ecf20Sopenharmony_ci#define XFS_DAENTER_BLOCKS(mp,w) \ 448c2ecf20Sopenharmony_ci (XFS_DAENTER_1B(mp,w) * XFS_DAENTER_DBS(mp,w)) 458c2ecf20Sopenharmony_ci#define XFS_DAENTER_BMAP1B(mp,w) \ 468c2ecf20Sopenharmony_ci XFS_NEXTENTADD_SPACE_RES(mp, XFS_DAENTER_1B(mp, w), w) 478c2ecf20Sopenharmony_ci#define XFS_DAENTER_BMAPS(mp,w) \ 488c2ecf20Sopenharmony_ci (XFS_DAENTER_DBS(mp,w) * XFS_DAENTER_BMAP1B(mp,w)) 498c2ecf20Sopenharmony_ci#define XFS_DAENTER_SPACE_RES(mp,w) \ 508c2ecf20Sopenharmony_ci (XFS_DAENTER_BLOCKS(mp,w) + XFS_DAENTER_BMAPS(mp,w)) 518c2ecf20Sopenharmony_ci#define XFS_DAREMOVE_SPACE_RES(mp,w) XFS_DAENTER_BMAPS(mp,w) 528c2ecf20Sopenharmony_ci#define XFS_DIRENTER_MAX_SPLIT(mp,nl) 1 538c2ecf20Sopenharmony_ci#define XFS_DIRENTER_SPACE_RES(mp,nl) \ 548c2ecf20Sopenharmony_ci (XFS_DAENTER_SPACE_RES(mp, XFS_DATA_FORK) * \ 558c2ecf20Sopenharmony_ci XFS_DIRENTER_MAX_SPLIT(mp,nl)) 568c2ecf20Sopenharmony_ci#define XFS_DIRREMOVE_SPACE_RES(mp) \ 578c2ecf20Sopenharmony_ci XFS_DAREMOVE_SPACE_RES(mp, XFS_DATA_FORK) 588c2ecf20Sopenharmony_ci#define XFS_IALLOC_SPACE_RES(mp) \ 598c2ecf20Sopenharmony_ci (M_IGEO(mp)->ialloc_blks + \ 608c2ecf20Sopenharmony_ci ((xfs_sb_version_hasfinobt(&mp->m_sb) ? 2 : 1) * \ 618c2ecf20Sopenharmony_ci M_IGEO(mp)->inobt_maxlevels)) 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ci/* 648c2ecf20Sopenharmony_ci * Space reservation values for various transactions. 658c2ecf20Sopenharmony_ci */ 668c2ecf20Sopenharmony_ci#define XFS_ADDAFORK_SPACE_RES(mp) \ 678c2ecf20Sopenharmony_ci ((mp)->m_dir_geo->fsbcount + XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK)) 688c2ecf20Sopenharmony_ci#define XFS_ATTRRM_SPACE_RES(mp) \ 698c2ecf20Sopenharmony_ci XFS_DAREMOVE_SPACE_RES(mp, XFS_ATTR_FORK) 708c2ecf20Sopenharmony_ci/* This macro is not used - see inline code in xfs_attr_set */ 718c2ecf20Sopenharmony_ci#define XFS_ATTRSET_SPACE_RES(mp, v) \ 728c2ecf20Sopenharmony_ci (XFS_DAENTER_SPACE_RES(mp, XFS_ATTR_FORK) + XFS_B_TO_FSB(mp, v)) 738c2ecf20Sopenharmony_ci#define XFS_CREATE_SPACE_RES(mp,nl) \ 748c2ecf20Sopenharmony_ci (XFS_IALLOC_SPACE_RES(mp) + XFS_DIRENTER_SPACE_RES(mp,nl)) 758c2ecf20Sopenharmony_ci#define XFS_DIOSTRAT_SPACE_RES(mp, v) \ 768c2ecf20Sopenharmony_ci (XFS_EXTENTADD_SPACE_RES(mp, XFS_DATA_FORK) + (v)) 778c2ecf20Sopenharmony_ci#define XFS_GROWFS_SPACE_RES(mp) \ 788c2ecf20Sopenharmony_ci (2 * (mp)->m_ag_maxlevels) 798c2ecf20Sopenharmony_ci#define XFS_GROWFSRT_SPACE_RES(mp,b) \ 808c2ecf20Sopenharmony_ci ((b) + XFS_EXTENTADD_SPACE_RES(mp, XFS_DATA_FORK)) 818c2ecf20Sopenharmony_ci#define XFS_LINK_SPACE_RES(mp,nl) \ 828c2ecf20Sopenharmony_ci XFS_DIRENTER_SPACE_RES(mp,nl) 838c2ecf20Sopenharmony_ci#define XFS_MKDIR_SPACE_RES(mp,nl) \ 848c2ecf20Sopenharmony_ci (XFS_IALLOC_SPACE_RES(mp) + XFS_DIRENTER_SPACE_RES(mp,nl)) 858c2ecf20Sopenharmony_ci#define XFS_QM_DQALLOC_SPACE_RES(mp) \ 868c2ecf20Sopenharmony_ci (XFS_EXTENTADD_SPACE_RES(mp, XFS_DATA_FORK) + \ 878c2ecf20Sopenharmony_ci XFS_DQUOT_CLUSTER_SIZE_FSB) 888c2ecf20Sopenharmony_ci#define XFS_QM_QINOCREATE_SPACE_RES(mp) \ 898c2ecf20Sopenharmony_ci XFS_IALLOC_SPACE_RES(mp) 908c2ecf20Sopenharmony_ci#define XFS_REMOVE_SPACE_RES(mp) \ 918c2ecf20Sopenharmony_ci XFS_DIRREMOVE_SPACE_RES(mp) 928c2ecf20Sopenharmony_ci#define XFS_RENAME_SPACE_RES(mp,nl) \ 938c2ecf20Sopenharmony_ci (XFS_DIRREMOVE_SPACE_RES(mp) + XFS_DIRENTER_SPACE_RES(mp,nl)) 948c2ecf20Sopenharmony_ci#define XFS_SYMLINK_SPACE_RES(mp,nl,b) \ 958c2ecf20Sopenharmony_ci (XFS_IALLOC_SPACE_RES(mp) + XFS_DIRENTER_SPACE_RES(mp,nl) + (b)) 968c2ecf20Sopenharmony_ci#define XFS_IFREE_SPACE_RES(mp) \ 978c2ecf20Sopenharmony_ci (xfs_sb_version_hasfinobt(&mp->m_sb) ? \ 988c2ecf20Sopenharmony_ci M_IGEO(mp)->inobt_maxlevels : 0) 998c2ecf20Sopenharmony_ci 1008c2ecf20Sopenharmony_ci 1018c2ecf20Sopenharmony_ci#endif /* __XFS_TRANS_SPACE_H__ */ 102