xref: /openbmc/linux/fs/xfs/libxfs/xfs_trans_resv.h (revision 6ed7e509)
10b61f8a4SDave Chinner // SPDX-License-Identifier: GPL-2.0
284be0ffcSDave Chinner /*
384be0ffcSDave Chinner  * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc.
484be0ffcSDave Chinner  * All Rights Reserved.
584be0ffcSDave Chinner  */
684be0ffcSDave Chinner #ifndef	__XFS_TRANS_RESV_H__
784be0ffcSDave Chinner #define	__XFS_TRANS_RESV_H__
884be0ffcSDave Chinner 
984be0ffcSDave Chinner struct xfs_mount;
1084be0ffcSDave Chinner 
1184be0ffcSDave Chinner /*
1284be0ffcSDave Chinner  * structure for maintaining pre-calculated transaction reservations.
1384be0ffcSDave Chinner  */
1484be0ffcSDave Chinner struct xfs_trans_res {
1584be0ffcSDave Chinner 	uint	tr_logres;	/* log space unit in bytes per log ticket */
1684be0ffcSDave Chinner 	int	tr_logcount;	/* number of log operations per log ticket */
1784be0ffcSDave Chinner 	int	tr_logflags;	/* log flags, currently only used for indicating
1884be0ffcSDave Chinner 				 * a reservation request is permanent or not */
1984be0ffcSDave Chinner };
2084be0ffcSDave Chinner 
2184be0ffcSDave Chinner struct xfs_trans_resv {
2284be0ffcSDave Chinner 	struct xfs_trans_res	tr_write;	/* extent alloc trans */
2384be0ffcSDave Chinner 	struct xfs_trans_res	tr_itruncate;	/* truncate trans */
2484be0ffcSDave Chinner 	struct xfs_trans_res	tr_rename;	/* rename trans */
2584be0ffcSDave Chinner 	struct xfs_trans_res	tr_link;	/* link trans */
2684be0ffcSDave Chinner 	struct xfs_trans_res	tr_remove;	/* unlink trans */
2784be0ffcSDave Chinner 	struct xfs_trans_res	tr_symlink;	/* symlink trans */
2884be0ffcSDave Chinner 	struct xfs_trans_res	tr_create;	/* create trans */
2984be0ffcSDave Chinner 	struct xfs_trans_res	tr_create_tmpfile; /* create O_TMPFILE trans */
3084be0ffcSDave Chinner 	struct xfs_trans_res	tr_mkdir;	/* mkdir trans */
3184be0ffcSDave Chinner 	struct xfs_trans_res	tr_ifree;	/* inode free trans */
3284be0ffcSDave Chinner 	struct xfs_trans_res	tr_ichange;	/* inode update trans */
3384be0ffcSDave Chinner 	struct xfs_trans_res	tr_growdata;	/* fs data section grow trans */
3484be0ffcSDave Chinner 	struct xfs_trans_res	tr_addafork;	/* add inode attr fork trans */
3584be0ffcSDave Chinner 	struct xfs_trans_res	tr_writeid;	/* write setuid/setgid file */
3684be0ffcSDave Chinner 	struct xfs_trans_res	tr_attrinval;	/* attr fork buffer
3784be0ffcSDave Chinner 						 * invalidation */
3884be0ffcSDave Chinner 	struct xfs_trans_res	tr_attrsetm;	/* set/create an attribute at
3984be0ffcSDave Chinner 						 * mount time */
4084be0ffcSDave Chinner 	struct xfs_trans_res	tr_attrsetrt;	/* set/create an attribute at
4184be0ffcSDave Chinner 						 * runtime */
4284be0ffcSDave Chinner 	struct xfs_trans_res	tr_attrrm;	/* remove an attribute */
4384be0ffcSDave Chinner 	struct xfs_trans_res	tr_clearagi;	/* clear agi unlinked bucket */
4484be0ffcSDave Chinner 	struct xfs_trans_res	tr_growrtalloc;	/* grow realtime allocations */
4584be0ffcSDave Chinner 	struct xfs_trans_res	tr_growrtzero;	/* grow realtime zeroing */
4684be0ffcSDave Chinner 	struct xfs_trans_res	tr_growrtfree;	/* grow realtime freeing */
4784be0ffcSDave Chinner 	struct xfs_trans_res	tr_qm_setqlim;	/* adjust quota limits */
4884be0ffcSDave Chinner 	struct xfs_trans_res	tr_qm_dqalloc;	/* allocate quota on disk */
4984be0ffcSDave Chinner 	struct xfs_trans_res	tr_sb;		/* modify superblock */
5084be0ffcSDave Chinner 	struct xfs_trans_res	tr_fsyncts;	/* update timestamps on fsync */
5184be0ffcSDave Chinner };
5284be0ffcSDave Chinner 
5384be0ffcSDave Chinner /* shorthand way of accessing reservation structure */
5484be0ffcSDave Chinner #define M_RES(mp)	(&(mp)->m_resv)
5584be0ffcSDave Chinner 
5684be0ffcSDave Chinner /*
5784be0ffcSDave Chinner  * Per-directory log reservation for any directory change.
5884be0ffcSDave Chinner  * dir blocks: (1 btree block per level + data block + free block) * dblock size
5984be0ffcSDave Chinner  * bmap btree: (levels + 2) * max depth * block size
6084be0ffcSDave Chinner  * v2 directory blocks can be fragmented below the dirblksize down to the fsb
6184be0ffcSDave Chinner  * size, so account for that in the DAENTER macros.
6284be0ffcSDave Chinner  */
6384be0ffcSDave Chinner #define	XFS_DIROP_LOG_RES(mp)	\
6484be0ffcSDave Chinner 	(XFS_FSB_TO_B(mp, XFS_DAENTER_BLOCKS(mp, XFS_DATA_FORK)) + \
6584be0ffcSDave Chinner 	 (XFS_FSB_TO_B(mp, XFS_DAENTER_BMAPS(mp, XFS_DATA_FORK) + 1)))
6684be0ffcSDave Chinner #define	XFS_DIROP_LOG_COUNT(mp)	\
6784be0ffcSDave Chinner 	(XFS_DAENTER_BLOCKS(mp, XFS_DATA_FORK) + \
6884be0ffcSDave Chinner 	 XFS_DAENTER_BMAPS(mp, XFS_DATA_FORK) + 1)
6984be0ffcSDave Chinner 
7084be0ffcSDave Chinner /*
7184be0ffcSDave Chinner  * Various log count values.
7284be0ffcSDave Chinner  */
7384be0ffcSDave Chinner #define	XFS_DEFAULT_LOG_COUNT		1
7484be0ffcSDave Chinner #define	XFS_DEFAULT_PERM_LOG_COUNT	2
7584be0ffcSDave Chinner #define	XFS_ITRUNCATE_LOG_COUNT		2
7684be0ffcSDave Chinner #define XFS_INACTIVE_LOG_COUNT		2
7784be0ffcSDave Chinner #define	XFS_CREATE_LOG_COUNT		2
7884be0ffcSDave Chinner #define	XFS_CREATE_TMPFILE_LOG_COUNT	2
7984be0ffcSDave Chinner #define	XFS_MKDIR_LOG_COUNT		3
8084be0ffcSDave Chinner #define	XFS_SYMLINK_LOG_COUNT		3
8184be0ffcSDave Chinner #define	XFS_REMOVE_LOG_COUNT		2
8284be0ffcSDave Chinner #define	XFS_LINK_LOG_COUNT		2
8384be0ffcSDave Chinner #define	XFS_RENAME_LOG_COUNT		2
8484be0ffcSDave Chinner #define	XFS_WRITE_LOG_COUNT		2
8584be0ffcSDave Chinner #define	XFS_ADDAFORK_LOG_COUNT		2
8684be0ffcSDave Chinner #define	XFS_ATTRINVAL_LOG_COUNT		1
8784be0ffcSDave Chinner #define	XFS_ATTRSET_LOG_COUNT		3
8884be0ffcSDave Chinner #define	XFS_ATTRRM_LOG_COUNT		3
8984be0ffcSDave Chinner 
904ecf9e7cSDarrick J. Wong /*
914ecf9e7cSDarrick J. Wong  * Original log operation counts were overestimated in the early days of
924ecf9e7cSDarrick J. Wong  * reflink.  These are retained here purely for minimum log size calculations
934ecf9e7cSDarrick J. Wong  * and must not be used for runtime reservations.
944ecf9e7cSDarrick J. Wong  */
954ecf9e7cSDarrick J. Wong #define	XFS_ITRUNCATE_LOG_COUNT_REFLINK	8
964ecf9e7cSDarrick J. Wong #define	XFS_WRITE_LOG_COUNT_REFLINK	8
974ecf9e7cSDarrick J. Wong 
9884be0ffcSDave Chinner void xfs_trans_resv_calc(struct xfs_mount *mp, struct xfs_trans_resv *resp);
99*6ed7e509SDarrick J. Wong uint xfs_allocfree_block_count(struct xfs_mount *mp, uint num_ops);
10084be0ffcSDave Chinner 
101b037c4eeSDarrick J. Wong unsigned int xfs_calc_itruncate_reservation_minlogsize(struct xfs_mount *mp);
102b037c4eeSDarrick J. Wong unsigned int xfs_calc_write_reservation_minlogsize(struct xfs_mount *mp);
103b037c4eeSDarrick J. Wong unsigned int xfs_calc_qm_dqalloc_reservation_minlogsize(struct xfs_mount *mp);
104b037c4eeSDarrick J. Wong 
10584be0ffcSDave Chinner #endif	/* __XFS_TRANS_RESV_H__ */
106