2018-06-06 05:42:14 +03:00
// SPDX-License-Identifier: GPL-2.0
2005-04-17 02:20:36 +04:00
/*
2005-11-02 06:58:39 +03:00
* Copyright ( c ) 2000 , 2005 Silicon Graphics , Inc .
* All Rights Reserved .
2005-04-17 02:20:36 +04:00
*/
# ifndef __XFS_TRANS_SPACE_H__
# define __XFS_TRANS_SPACE_H__
/*
* Components of space reservations .
*/
2017-04-12 22:26:07 +03:00
/* Worst case number of rmaps that can be held in a block. */
2016-10-03 19:11:53 +03:00
# define XFS_MAX_CONTIG_RMAPS_PER_BLOCK(mp) \
( ( ( mp ) - > m_rmap_mxr [ 0 ] ) - ( ( mp ) - > m_rmap_mnr [ 0 ] ) )
2017-04-12 22:26:07 +03:00
/* Adding one rmap could split every level up to the top of the tree. */
# define XFS_RMAPADD_SPACE_RES(mp) ((mp)->m_rmap_maxlevels)
2021-09-16 22:27:43 +03:00
/*
* Note that we historically set m_rmap_maxlevels to 9 when reflink is enabled ,
* so we must preserve this behavior to avoid changing the transaction space
* reservations and minimum log size calculations for existing filesystems .
*/
# define XFS_OLD_REFLINK_RMAP_MAXLEVELS 9
2017-04-12 22:26:07 +03:00
/* Blocks we might need to add "b" rmaps to a tree. */
# define XFS_NRMAPADD_SPACE_RES(mp, b)\
( ( ( b + XFS_MAX_CONTIG_RMAPS_PER_BLOCK ( mp ) - 1 ) / \
XFS_MAX_CONTIG_RMAPS_PER_BLOCK ( mp ) ) * \
XFS_RMAPADD_SPACE_RES ( mp ) )
2005-04-17 02:20:36 +04:00
# define XFS_MAX_CONTIG_EXTENTS_PER_BLOCK(mp) \
( ( ( mp ) - > m_alloc_mxr [ 0 ] ) - ( ( mp ) - > m_alloc_mnr [ 0 ] ) )
# define XFS_EXTENTADD_SPACE_RES(mp,w) (XFS_BM_MAXLEVELS(mp,w) - 1)
# define XFS_NEXTENTADD_SPACE_RES(mp,b,w)\
( ( ( b + XFS_MAX_CONTIG_EXTENTS_PER_BLOCK ( mp ) - 1 ) / \
XFS_MAX_CONTIG_EXTENTS_PER_BLOCK ( mp ) ) * \
XFS_EXTENTADD_SPACE_RES ( mp , w ) )
2017-04-12 22:26:07 +03:00
/* Blocks we might need to add "b" mappings & rmappings to a file. */
2016-10-03 19:11:53 +03:00
# define XFS_SWAP_RMAP_SPACE_RES(mp,b,w)\
2017-04-12 22:26:07 +03:00
( XFS_NEXTENTADD_SPACE_RES ( ( mp ) , ( b ) , ( w ) ) + \
XFS_NRMAPADD_SPACE_RES ( ( mp ) , ( b ) ) )
2014-06-06 09:14:11 +04:00
# define XFS_DAENTER_1B(mp,w) \
( ( w ) = = XFS_DATA_FORK ? ( mp ) - > m_dir_geo - > fsbcount : 1 )
2005-04-17 02:20:36 +04:00
# define XFS_DAENTER_DBS(mp,w) \
2006-06-20 07:04:51 +04:00
( XFS_DA_NODE_MAXDEPTH + ( ( ( w ) = = XFS_DATA_FORK ) ? 2 : 0 ) )
2005-04-17 02:20:36 +04:00
# define XFS_DAENTER_BLOCKS(mp,w) \
( XFS_DAENTER_1B ( mp , w ) * XFS_DAENTER_DBS ( mp , w ) )
# define XFS_DAENTER_BMAP1B(mp,w) \
XFS_NEXTENTADD_SPACE_RES ( mp , XFS_DAENTER_1B ( mp , w ) , w )
# define XFS_DAENTER_BMAPS(mp,w) \
( XFS_DAENTER_DBS ( mp , w ) * XFS_DAENTER_BMAP1B ( mp , w ) )
# define XFS_DAENTER_SPACE_RES(mp,w) \
( XFS_DAENTER_BLOCKS ( mp , w ) + XFS_DAENTER_BMAPS ( mp , w ) )
# define XFS_DAREMOVE_SPACE_RES(mp,w) XFS_DAENTER_BMAPS(mp,w)
2006-06-20 07:04:51 +04:00
# define XFS_DIRENTER_MAX_SPLIT(mp,nl) 1
2005-04-17 02:20:36 +04:00
# define XFS_DIRENTER_SPACE_RES(mp,nl) \
( XFS_DAENTER_SPACE_RES ( mp , XFS_DATA_FORK ) * \
XFS_DIRENTER_MAX_SPLIT ( mp , nl ) )
# define XFS_DIRREMOVE_SPACE_RES(mp) \
XFS_DAREMOVE_SPACE_RES ( mp , XFS_DATA_FORK )
# define XFS_IALLOC_SPACE_RES(mp) \
2019-06-05 21:19:34 +03:00
( M_IGEO ( mp ) - > ialloc_blks + \
2021-08-19 04:46:55 +03:00
( ( xfs_has_finobt ( mp ) ? 2 : 1 ) * M_IGEO ( mp ) - > inobt_maxlevels ) )
2005-04-17 02:20:36 +04:00
/*
* Space reservation values for various transactions .
*/
# define XFS_ADDAFORK_SPACE_RES(mp) \
2014-06-06 09:14:11 +04:00
( ( mp ) - > m_dir_geo - > fsbcount + XFS_DAENTER_BMAP1B ( mp , XFS_DATA_FORK ) )
2005-04-17 02:20:36 +04:00
# define XFS_ATTRRM_SPACE_RES(mp) \
XFS_DAREMOVE_SPACE_RES ( mp , XFS_ATTR_FORK )
/* This macro is not used - see inline code in xfs_attr_set */
# define XFS_ATTRSET_SPACE_RES(mp, v) \
( XFS_DAENTER_SPACE_RES ( mp , XFS_ATTR_FORK ) + XFS_B_TO_FSB ( mp , v ) )
# define XFS_CREATE_SPACE_RES(mp,nl) \
( XFS_IALLOC_SPACE_RES ( mp ) + XFS_DIRENTER_SPACE_RES ( mp , nl ) )
# define XFS_DIOSTRAT_SPACE_RES(mp, v) \
( XFS_EXTENTADD_SPACE_RES ( mp , XFS_DATA_FORK ) + ( v ) )
# define XFS_GROWFS_SPACE_RES(mp) \
2021-10-13 20:02:19 +03:00
( 2 * ( mp ) - > m_alloc_maxlevels )
2005-04-17 02:20:36 +04:00
# define XFS_GROWFSRT_SPACE_RES(mp,b) \
( ( b ) + XFS_EXTENTADD_SPACE_RES ( mp , XFS_DATA_FORK ) )
# define XFS_LINK_SPACE_RES(mp,nl) \
XFS_DIRENTER_SPACE_RES ( mp , nl )
# define XFS_MKDIR_SPACE_RES(mp,nl) \
( XFS_IALLOC_SPACE_RES ( mp ) + XFS_DIRENTER_SPACE_RES ( mp , nl ) )
# define XFS_QM_DQALLOC_SPACE_RES(mp) \
( XFS_EXTENTADD_SPACE_RES ( mp , XFS_DATA_FORK ) + \
XFS_DQUOT_CLUSTER_SIZE_FSB )
# define XFS_QM_QINOCREATE_SPACE_RES(mp) \
XFS_IALLOC_SPACE_RES ( mp )
# define XFS_REMOVE_SPACE_RES(mp) \
XFS_DIRREMOVE_SPACE_RES ( mp )
# define XFS_RENAME_SPACE_RES(mp,nl) \
( XFS_DIRREMOVE_SPACE_RES ( mp ) + XFS_DIRENTER_SPACE_RES ( mp , nl ) )
# define XFS_SYMLINK_SPACE_RES(mp,nl,b) \
( XFS_IALLOC_SPACE_RES ( mp ) + XFS_DIRENTER_SPACE_RES ( mp , nl ) + ( b ) )
2014-04-24 10:00:52 +04:00
# define XFS_IFREE_SPACE_RES(mp) \
2021-08-19 04:46:55 +03:00
( xfs_has_finobt ( mp ) ? M_IGEO ( mp ) - > inobt_maxlevels : 0 )
2014-04-24 10:00:52 +04:00
2005-04-17 02:20:36 +04:00
# endif /* __XFS_TRANS_SPACE_H__ */