1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (c) 2000,2005 Silicon Graphics, Inc. 4*4882a593Smuzhiyun * All Rights Reserved. 5*4882a593Smuzhiyun */ 6*4882a593Smuzhiyun #ifndef __XFS_TRANS_SPACE_H__ 7*4882a593Smuzhiyun #define __XFS_TRANS_SPACE_H__ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun /* 10*4882a593Smuzhiyun * Components of space reservations. 11*4882a593Smuzhiyun */ 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun /* Worst case number of rmaps that can be held in a block. */ 14*4882a593Smuzhiyun #define XFS_MAX_CONTIG_RMAPS_PER_BLOCK(mp) \ 15*4882a593Smuzhiyun (((mp)->m_rmap_mxr[0]) - ((mp)->m_rmap_mnr[0])) 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun /* Adding one rmap could split every level up to the top of the tree. */ 18*4882a593Smuzhiyun #define XFS_RMAPADD_SPACE_RES(mp) ((mp)->m_rmap_maxlevels) 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun /* Blocks we might need to add "b" rmaps to a tree. */ 21*4882a593Smuzhiyun #define XFS_NRMAPADD_SPACE_RES(mp, b)\ 22*4882a593Smuzhiyun (((b + XFS_MAX_CONTIG_RMAPS_PER_BLOCK(mp) - 1) / \ 23*4882a593Smuzhiyun XFS_MAX_CONTIG_RMAPS_PER_BLOCK(mp)) * \ 24*4882a593Smuzhiyun XFS_RMAPADD_SPACE_RES(mp)) 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun #define XFS_MAX_CONTIG_EXTENTS_PER_BLOCK(mp) \ 27*4882a593Smuzhiyun (((mp)->m_alloc_mxr[0]) - ((mp)->m_alloc_mnr[0])) 28*4882a593Smuzhiyun #define XFS_EXTENTADD_SPACE_RES(mp,w) (XFS_BM_MAXLEVELS(mp,w) - 1) 29*4882a593Smuzhiyun #define XFS_NEXTENTADD_SPACE_RES(mp,b,w)\ 30*4882a593Smuzhiyun (((b + XFS_MAX_CONTIG_EXTENTS_PER_BLOCK(mp) - 1) / \ 31*4882a593Smuzhiyun XFS_MAX_CONTIG_EXTENTS_PER_BLOCK(mp)) * \ 32*4882a593Smuzhiyun XFS_EXTENTADD_SPACE_RES(mp,w)) 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun /* Blocks we might need to add "b" mappings & rmappings to a file. */ 35*4882a593Smuzhiyun #define XFS_SWAP_RMAP_SPACE_RES(mp,b,w)\ 36*4882a593Smuzhiyun (XFS_NEXTENTADD_SPACE_RES((mp), (b), (w)) + \ 37*4882a593Smuzhiyun XFS_NRMAPADD_SPACE_RES((mp), (b))) 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun #define XFS_DAENTER_1B(mp,w) \ 40*4882a593Smuzhiyun ((w) == XFS_DATA_FORK ? (mp)->m_dir_geo->fsbcount : 1) 41*4882a593Smuzhiyun #define XFS_DAENTER_DBS(mp,w) \ 42*4882a593Smuzhiyun (XFS_DA_NODE_MAXDEPTH + (((w) == XFS_DATA_FORK) ? 2 : 0)) 43*4882a593Smuzhiyun #define XFS_DAENTER_BLOCKS(mp,w) \ 44*4882a593Smuzhiyun (XFS_DAENTER_1B(mp,w) * XFS_DAENTER_DBS(mp,w)) 45*4882a593Smuzhiyun #define XFS_DAENTER_BMAP1B(mp,w) \ 46*4882a593Smuzhiyun XFS_NEXTENTADD_SPACE_RES(mp, XFS_DAENTER_1B(mp, w), w) 47*4882a593Smuzhiyun #define XFS_DAENTER_BMAPS(mp,w) \ 48*4882a593Smuzhiyun (XFS_DAENTER_DBS(mp,w) * XFS_DAENTER_BMAP1B(mp,w)) 49*4882a593Smuzhiyun #define XFS_DAENTER_SPACE_RES(mp,w) \ 50*4882a593Smuzhiyun (XFS_DAENTER_BLOCKS(mp,w) + XFS_DAENTER_BMAPS(mp,w)) 51*4882a593Smuzhiyun #define XFS_DAREMOVE_SPACE_RES(mp,w) XFS_DAENTER_BMAPS(mp,w) 52*4882a593Smuzhiyun #define XFS_DIRENTER_MAX_SPLIT(mp,nl) 1 53*4882a593Smuzhiyun #define XFS_DIRENTER_SPACE_RES(mp,nl) \ 54*4882a593Smuzhiyun (XFS_DAENTER_SPACE_RES(mp, XFS_DATA_FORK) * \ 55*4882a593Smuzhiyun XFS_DIRENTER_MAX_SPLIT(mp,nl)) 56*4882a593Smuzhiyun #define XFS_DIRREMOVE_SPACE_RES(mp) \ 57*4882a593Smuzhiyun XFS_DAREMOVE_SPACE_RES(mp, XFS_DATA_FORK) 58*4882a593Smuzhiyun #define XFS_IALLOC_SPACE_RES(mp) \ 59*4882a593Smuzhiyun (M_IGEO(mp)->ialloc_blks + \ 60*4882a593Smuzhiyun ((xfs_sb_version_hasfinobt(&mp->m_sb) ? 2 : 1) * \ 61*4882a593Smuzhiyun M_IGEO(mp)->inobt_maxlevels)) 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun /* 64*4882a593Smuzhiyun * Space reservation values for various transactions. 65*4882a593Smuzhiyun */ 66*4882a593Smuzhiyun #define XFS_ADDAFORK_SPACE_RES(mp) \ 67*4882a593Smuzhiyun ((mp)->m_dir_geo->fsbcount + XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK)) 68*4882a593Smuzhiyun #define XFS_ATTRRM_SPACE_RES(mp) \ 69*4882a593Smuzhiyun XFS_DAREMOVE_SPACE_RES(mp, XFS_ATTR_FORK) 70*4882a593Smuzhiyun /* This macro is not used - see inline code in xfs_attr_set */ 71*4882a593Smuzhiyun #define XFS_ATTRSET_SPACE_RES(mp, v) \ 72*4882a593Smuzhiyun (XFS_DAENTER_SPACE_RES(mp, XFS_ATTR_FORK) + XFS_B_TO_FSB(mp, v)) 73*4882a593Smuzhiyun #define XFS_CREATE_SPACE_RES(mp,nl) \ 74*4882a593Smuzhiyun (XFS_IALLOC_SPACE_RES(mp) + XFS_DIRENTER_SPACE_RES(mp,nl)) 75*4882a593Smuzhiyun #define XFS_DIOSTRAT_SPACE_RES(mp, v) \ 76*4882a593Smuzhiyun (XFS_EXTENTADD_SPACE_RES(mp, XFS_DATA_FORK) + (v)) 77*4882a593Smuzhiyun #define XFS_GROWFS_SPACE_RES(mp) \ 78*4882a593Smuzhiyun (2 * (mp)->m_ag_maxlevels) 79*4882a593Smuzhiyun #define XFS_GROWFSRT_SPACE_RES(mp,b) \ 80*4882a593Smuzhiyun ((b) + XFS_EXTENTADD_SPACE_RES(mp, XFS_DATA_FORK)) 81*4882a593Smuzhiyun #define XFS_LINK_SPACE_RES(mp,nl) \ 82*4882a593Smuzhiyun XFS_DIRENTER_SPACE_RES(mp,nl) 83*4882a593Smuzhiyun #define XFS_MKDIR_SPACE_RES(mp,nl) \ 84*4882a593Smuzhiyun (XFS_IALLOC_SPACE_RES(mp) + XFS_DIRENTER_SPACE_RES(mp,nl)) 85*4882a593Smuzhiyun #define XFS_QM_DQALLOC_SPACE_RES(mp) \ 86*4882a593Smuzhiyun (XFS_EXTENTADD_SPACE_RES(mp, XFS_DATA_FORK) + \ 87*4882a593Smuzhiyun XFS_DQUOT_CLUSTER_SIZE_FSB) 88*4882a593Smuzhiyun #define XFS_QM_QINOCREATE_SPACE_RES(mp) \ 89*4882a593Smuzhiyun XFS_IALLOC_SPACE_RES(mp) 90*4882a593Smuzhiyun #define XFS_REMOVE_SPACE_RES(mp) \ 91*4882a593Smuzhiyun XFS_DIRREMOVE_SPACE_RES(mp) 92*4882a593Smuzhiyun #define XFS_RENAME_SPACE_RES(mp,nl) \ 93*4882a593Smuzhiyun (XFS_DIRREMOVE_SPACE_RES(mp) + XFS_DIRENTER_SPACE_RES(mp,nl)) 94*4882a593Smuzhiyun #define XFS_SYMLINK_SPACE_RES(mp,nl,b) \ 95*4882a593Smuzhiyun (XFS_IALLOC_SPACE_RES(mp) + XFS_DIRENTER_SPACE_RES(mp,nl) + (b)) 96*4882a593Smuzhiyun #define XFS_IFREE_SPACE_RES(mp) \ 97*4882a593Smuzhiyun (xfs_sb_version_hasfinobt(&mp->m_sb) ? \ 98*4882a593Smuzhiyun M_IGEO(mp)->inobt_maxlevels : 0) 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun #endif /* __XFS_TRANS_SPACE_H__ */ 102