diff options
Diffstat (limited to 'fs/xfs/xfs_trans.c')
| -rw-r--r-- | fs/xfs/xfs_trans.c | 376 | 
1 files changed, 244 insertions, 132 deletions
| diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 06ed520a767f..2fd7c1ff1d21 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -37,14 +37,45 @@  #include "xfs_extent_busy.h"  #include "xfs_bmap.h"  #include "xfs_quota.h" +#include "xfs_qm.h"  #include "xfs_trans_priv.h"  #include "xfs_trans_space.h"  #include "xfs_inode_item.h" +#include "xfs_log_priv.h" +#include "xfs_buf_item.h"  #include "xfs_trace.h"  kmem_zone_t	*xfs_trans_zone;  kmem_zone_t	*xfs_log_item_desc_zone; +/* + * A buffer has a format structure overhead in the log in addition + * to the data, so we need to take this into account when reserving + * space in a transaction for a buffer.  Round the space required up + * to a multiple of 128 bytes so that we don't change the historical + * reservation that has been used for this overhead. + */ +STATIC uint +xfs_buf_log_overhead(void) +{ +	return round_up(sizeof(struct xlog_op_header) + +			sizeof(struct xfs_buf_log_format), 128); +} + +/* + * Calculate out transaction log reservation per item in bytes. + * + * The nbufs argument is used to indicate the number of items that + * will be changed in a transaction.  size is used to tell how many + * bytes should be reserved per item. + */ +STATIC uint +xfs_calc_buf_res( +	uint		nbufs, +	uint		size) +{ +	return nbufs * (size + xfs_buf_log_overhead()); +}  /*   * Various log reservation values. @@ -85,18 +116,15 @@ xfs_calc_write_reservation(  	struct xfs_mount	*mp)  {  	return XFS_DQUOT_LOGRES(mp) + -		MAX((mp->m_sb.sb_inodesize + -		     XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK)) + -		     2 * mp->m_sb.sb_sectsize + -		     mp->m_sb.sb_sectsize + -		     XFS_ALLOCFREE_LOG_RES(mp, 2) + -		     128 * (4 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + -			    XFS_ALLOCFREE_LOG_COUNT(mp, 2))), -		    (2 * mp->m_sb.sb_sectsize + -		     2 * mp->m_sb.sb_sectsize + -		     mp->m_sb.sb_sectsize + -		     XFS_ALLOCFREE_LOG_RES(mp, 2) + -		     128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))); +		MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + +		     xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK), +				      XFS_FSB_TO_B(mp, 1)) + +		     xfs_calc_buf_res(3, mp->m_sb.sb_sectsize) + +		     xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), +				      XFS_FSB_TO_B(mp, 1))), +		    (xfs_calc_buf_res(5, mp->m_sb.sb_sectsize) + +		     xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), +				      XFS_FSB_TO_B(mp, 1))));  }  /* @@ -117,18 +145,17 @@ xfs_calc_itruncate_reservation(  	struct xfs_mount	*mp)  {  	return XFS_DQUOT_LOGRES(mp) + -		MAX((mp->m_sb.sb_inodesize + -		     XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1) + -		     128 * (2 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK))), -		    (4 * mp->m_sb.sb_sectsize + -		     4 * mp->m_sb.sb_sectsize + -		     mp->m_sb.sb_sectsize + -		     XFS_ALLOCFREE_LOG_RES(mp, 4) + -		     128 * (9 + XFS_ALLOCFREE_LOG_COUNT(mp, 4)) + -		     128 * 5 + -		     XFS_ALLOCFREE_LOG_RES(mp, 1) + -		     128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + -			    XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); +		MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + +		     xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1, +				      XFS_FSB_TO_B(mp, 1))), +		    (xfs_calc_buf_res(9, mp->m_sb.sb_sectsize) + +		     xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 4), +				      XFS_FSB_TO_B(mp, 1)) + +		    xfs_calc_buf_res(5, 0) + +		    xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), +				     XFS_FSB_TO_B(mp, 1)) + +		    xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + +				     mp->m_in_maxlevels, 0)));  }  /* @@ -148,14 +175,12 @@ xfs_calc_rename_reservation(  	struct xfs_mount	*mp)  {  	return XFS_DQUOT_LOGRES(mp) + -		MAX((4 * mp->m_sb.sb_inodesize + -		     2 * XFS_DIROP_LOG_RES(mp) + -		     128 * (4 + 2 * XFS_DIROP_LOG_COUNT(mp))), -		    (3 * mp->m_sb.sb_sectsize + -		     3 * mp->m_sb.sb_sectsize + -		     mp->m_sb.sb_sectsize + -		     XFS_ALLOCFREE_LOG_RES(mp, 3) + -		     128 * (7 + XFS_ALLOCFREE_LOG_COUNT(mp, 3)))); +		MAX((xfs_calc_buf_res(4, mp->m_sb.sb_inodesize) + +		     xfs_calc_buf_res(2 * XFS_DIROP_LOG_COUNT(mp), +				      XFS_FSB_TO_B(mp, 1))), +		    (xfs_calc_buf_res(7, mp->m_sb.sb_sectsize) + +		     xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 3), +				      XFS_FSB_TO_B(mp, 1))));  }  /* @@ -175,15 +200,12 @@ xfs_calc_link_reservation(  	struct xfs_mount	*mp)  {  	return XFS_DQUOT_LOGRES(mp) + -		MAX((mp->m_sb.sb_inodesize + -		     mp->m_sb.sb_inodesize + -		     XFS_DIROP_LOG_RES(mp) + -		     128 * (2 + XFS_DIROP_LOG_COUNT(mp))), -		    (mp->m_sb.sb_sectsize + -		     mp->m_sb.sb_sectsize + -		     mp->m_sb.sb_sectsize + -		     XFS_ALLOCFREE_LOG_RES(mp, 1) + -		     128 * (3 + XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); +		MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + +		     xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), +				      XFS_FSB_TO_B(mp, 1))), +		    (xfs_calc_buf_res(3, mp->m_sb.sb_sectsize) + +		     xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), +				      XFS_FSB_TO_B(mp, 1))));  }  /* @@ -203,15 +225,12 @@ xfs_calc_remove_reservation(  	struct xfs_mount	*mp)  {  	return XFS_DQUOT_LOGRES(mp) + -		MAX((mp->m_sb.sb_inodesize + -		     mp->m_sb.sb_inodesize + -		     XFS_DIROP_LOG_RES(mp) + -		     128 * (2 + XFS_DIROP_LOG_COUNT(mp))), -		    (2 * mp->m_sb.sb_sectsize + -		     2 * mp->m_sb.sb_sectsize + -		     mp->m_sb.sb_sectsize + -		     XFS_ALLOCFREE_LOG_RES(mp, 2) + -		     128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))); +		MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + +		     xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), +				      XFS_FSB_TO_B(mp, 1))), +		    (xfs_calc_buf_res(5, mp->m_sb.sb_sectsize) + +		     xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), +				      XFS_FSB_TO_B(mp, 1))));  }  /* @@ -233,18 +252,18 @@ xfs_calc_symlink_reservation(  	struct xfs_mount	*mp)  {  	return XFS_DQUOT_LOGRES(mp) + -		MAX((mp->m_sb.sb_inodesize + -		     mp->m_sb.sb_inodesize + -		     XFS_FSB_TO_B(mp, 1) + -		     XFS_DIROP_LOG_RES(mp) + -		     1024 + -		     128 * (4 + XFS_DIROP_LOG_COUNT(mp))), -		    (2 * mp->m_sb.sb_sectsize + -		     XFS_FSB_TO_B(mp, XFS_IALLOC_BLOCKS(mp)) + -		     XFS_FSB_TO_B(mp, mp->m_in_maxlevels) + -		     XFS_ALLOCFREE_LOG_RES(mp, 1) + -		     128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + -			    XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); +		MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + +		     xfs_calc_buf_res(1, XFS_FSB_TO_B(mp, 1)) + +		     xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), +				      XFS_FSB_TO_B(mp, 1)) + +		     xfs_calc_buf_res(1, 1024)), +		    (xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + +		     xfs_calc_buf_res(XFS_IALLOC_BLOCKS(mp), +				      XFS_FSB_TO_B(mp, 1)) + +		     xfs_calc_buf_res(mp->m_in_maxlevels, +				      XFS_FSB_TO_B(mp, 1)) + +		     xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), +				      XFS_FSB_TO_B(mp, 1))));  }  /* @@ -267,18 +286,19 @@ xfs_calc_create_reservation(  	struct xfs_mount	*mp)  {  	return XFS_DQUOT_LOGRES(mp) + -		MAX((mp->m_sb.sb_inodesize + -		     mp->m_sb.sb_inodesize + +		MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + +		     xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + +		     (uint)XFS_FSB_TO_B(mp, 1) + +		     xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), +				      XFS_FSB_TO_B(mp, 1))), +		    (xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) +  		     mp->m_sb.sb_sectsize + -		     XFS_FSB_TO_B(mp, 1) + -		     XFS_DIROP_LOG_RES(mp) + -		     128 * (3 + XFS_DIROP_LOG_COUNT(mp))), -		    (3 * mp->m_sb.sb_sectsize + -		     XFS_FSB_TO_B(mp, XFS_IALLOC_BLOCKS(mp)) + -		     XFS_FSB_TO_B(mp, mp->m_in_maxlevels) + -		     XFS_ALLOCFREE_LOG_RES(mp, 1) + -		     128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + -			    XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); +		     xfs_calc_buf_res(XFS_IALLOC_BLOCKS(mp), +				      XFS_FSB_TO_B(mp, 1)) + +		     xfs_calc_buf_res(mp->m_in_maxlevels, +				      XFS_FSB_TO_B(mp, 1)) + +		     xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), +				      XFS_FSB_TO_B(mp, 1))));  }  /* @@ -306,16 +326,16 @@ xfs_calc_ifree_reservation(  	struct xfs_mount	*mp)  {  	return XFS_DQUOT_LOGRES(mp) + -		mp->m_sb.sb_inodesize + -		mp->m_sb.sb_sectsize + -		mp->m_sb.sb_sectsize + -		XFS_FSB_TO_B(mp, 1) + +		xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + +		xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + +		xfs_calc_buf_res(1, XFS_FSB_TO_B(mp, 1)) +  		MAX((__uint16_t)XFS_FSB_TO_B(mp, 1),  		    XFS_INODE_CLUSTER_SIZE(mp)) + -		128 * 5 + -		XFS_ALLOCFREE_LOG_RES(mp, 1) + -		128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + -		       XFS_ALLOCFREE_LOG_COUNT(mp, 1)); +		xfs_calc_buf_res(1, 0) + +		xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + +				 mp->m_in_maxlevels, 0) + +		xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), +				 XFS_FSB_TO_B(mp, 1));  }  /* @@ -343,9 +363,9 @@ STATIC uint  xfs_calc_growdata_reservation(  	struct xfs_mount	*mp)  { -	return mp->m_sb.sb_sectsize * 3 + -		XFS_ALLOCFREE_LOG_RES(mp, 1) + -		128 * (3 + XFS_ALLOCFREE_LOG_COUNT(mp, 1)); +	return xfs_calc_buf_res(3, mp->m_sb.sb_sectsize) + +		xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), +				 XFS_FSB_TO_B(mp, 1));  }  /* @@ -362,12 +382,12 @@ STATIC uint  xfs_calc_growrtalloc_reservation(  	struct xfs_mount	*mp)  { -	return 2 * mp->m_sb.sb_sectsize + -		XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK)) + -		mp->m_sb.sb_inodesize + -		XFS_ALLOCFREE_LOG_RES(mp, 1) + -		128 * (3 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + -		       XFS_ALLOCFREE_LOG_COUNT(mp, 1)); +	return xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + +		xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK), +				 XFS_FSB_TO_B(mp, 1)) + +		xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + +		xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), +				 XFS_FSB_TO_B(mp, 1));  }  /* @@ -379,7 +399,7 @@ STATIC uint  xfs_calc_growrtzero_reservation(  	struct xfs_mount	*mp)  { -	return mp->m_sb.sb_blocksize + 128; +	return xfs_calc_buf_res(1, mp->m_sb.sb_blocksize);  }  /* @@ -396,11 +416,10 @@ STATIC uint  xfs_calc_growrtfree_reservation(  	struct xfs_mount	*mp)  { -	return mp->m_sb.sb_sectsize + -		2 * mp->m_sb.sb_inodesize + -		mp->m_sb.sb_blocksize + -		mp->m_rsumsize + -		128 * 5; +	return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + +		xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + +		xfs_calc_buf_res(1, mp->m_sb.sb_blocksize) + +		xfs_calc_buf_res(1, mp->m_rsumsize);  }  /* @@ -411,7 +430,7 @@ STATIC uint  xfs_calc_swrite_reservation(  	struct xfs_mount	*mp)  { -	return mp->m_sb.sb_inodesize + 128; +	return xfs_calc_buf_res(1, mp->m_sb.sb_inodesize);  }  /* @@ -421,7 +440,7 @@ xfs_calc_swrite_reservation(  STATIC uint  xfs_calc_writeid_reservation(xfs_mount_t *mp)  { -	return mp->m_sb.sb_inodesize + 128; +	return xfs_calc_buf_res(1, mp->m_sb.sb_inodesize);  }  /* @@ -437,13 +456,13 @@ xfs_calc_addafork_reservation(  	struct xfs_mount	*mp)  {  	return XFS_DQUOT_LOGRES(mp) + -		mp->m_sb.sb_inodesize + -		mp->m_sb.sb_sectsize * 2 + -		mp->m_dirblksize + -		XFS_FSB_TO_B(mp, XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1) + -		XFS_ALLOCFREE_LOG_RES(mp, 1) + -		128 * (4 + XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1 + -		       XFS_ALLOCFREE_LOG_COUNT(mp, 1)); +		xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + +		xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + +		xfs_calc_buf_res(1, mp->m_dirblksize) + +		xfs_calc_buf_res(XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1, +				 XFS_FSB_TO_B(mp, 1)) + +		xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), +				 XFS_FSB_TO_B(mp, 1));  }  /* @@ -461,35 +480,51 @@ STATIC uint  xfs_calc_attrinval_reservation(  	struct xfs_mount	*mp)  { -	return MAX((mp->m_sb.sb_inodesize + -		    XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)) + -		    128 * (1 + XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))), -		   (4 * mp->m_sb.sb_sectsize + -		    4 * mp->m_sb.sb_sectsize + -		    mp->m_sb.sb_sectsize + -		    XFS_ALLOCFREE_LOG_RES(mp, 4) + -		    128 * (9 + XFS_ALLOCFREE_LOG_COUNT(mp, 4)))); +	return MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + +		    xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK), +				     XFS_FSB_TO_B(mp, 1))), +		   (xfs_calc_buf_res(9, mp->m_sb.sb_sectsize) + +		    xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 4), +				     XFS_FSB_TO_B(mp, 1))));  }  /* - * Setting an attribute. + * Setting an attribute at mount time.   *	the inode getting the attribute   *	the superblock for allocations   *	the agfs extents are allocated from   *	the attribute btree * max depth   *	the inode allocation btree   * Since attribute transaction space is dependent on the size of the attribute, - * the calculation is done partially at mount time and partially at runtime. + * the calculation is done partially at mount time and partially at runtime(see + * below).   */  STATIC uint -xfs_calc_attrset_reservation( +xfs_calc_attrsetm_reservation(  	struct xfs_mount	*mp)  {  	return XFS_DQUOT_LOGRES(mp) + -		mp->m_sb.sb_inodesize + -		mp->m_sb.sb_sectsize + -		XFS_FSB_TO_B(mp, XFS_DA_NODE_MAXDEPTH) + -		128 * (2 + XFS_DA_NODE_MAXDEPTH); +		xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + +		xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + +		xfs_calc_buf_res(XFS_DA_NODE_MAXDEPTH, XFS_FSB_TO_B(mp, 1)); +} + +/* + * Setting an attribute at runtime, transaction space unit per block. + * 	the superblock for allocations: sector size + *	the inode bmap btree could join or split: max depth * block size + * Since the runtime attribute transaction space is dependent on the total + * blocks needed for the 1st bmap, here we calculate out the space unit for + * one block so that the caller could figure out the total space according + * to the attibute extent length in blocks by: ext * XFS_ATTRSETRT_LOG_RES(mp). + */ +STATIC uint +xfs_calc_attrsetrt_reservation( +	struct xfs_mount	*mp) +{ +	return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + +		xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK), +				 XFS_FSB_TO_B(mp, 1));  }  /* @@ -508,16 +543,15 @@ xfs_calc_attrrm_reservation(  	struct xfs_mount	*mp)  {  	return XFS_DQUOT_LOGRES(mp) + -		MAX((mp->m_sb.sb_inodesize + -		     XFS_FSB_TO_B(mp, XFS_DA_NODE_MAXDEPTH) + -		     XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)) + -		     128 * (1 + XFS_DA_NODE_MAXDEPTH + -			    XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK))), -		    (2 * mp->m_sb.sb_sectsize + -		     2 * mp->m_sb.sb_sectsize + -		     mp->m_sb.sb_sectsize + -		     XFS_ALLOCFREE_LOG_RES(mp, 2) + -		     128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))); +		MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + +		     xfs_calc_buf_res(XFS_DA_NODE_MAXDEPTH, +				      XFS_FSB_TO_B(mp, 1)) + +		     (uint)XFS_FSB_TO_B(mp, +					XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)) + +		     xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK), 0)), +		    (xfs_calc_buf_res(5, mp->m_sb.sb_sectsize) + +		     xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), +				      XFS_FSB_TO_B(mp, 1))));  }  /* @@ -527,7 +561,78 @@ STATIC uint  xfs_calc_clear_agi_bucket_reservation(  	struct xfs_mount	*mp)  { -	return mp->m_sb.sb_sectsize + 128; +	return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize); +} + +/* + * Clearing the quotaflags in the superblock. + *	the super block for changing quota flags: sector size + */ +STATIC uint +xfs_calc_qm_sbchange_reservation( +	struct xfs_mount	*mp) +{ +	return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize); +} + +/* + * Adjusting quota limits. + *    the xfs_disk_dquot_t: sizeof(struct xfs_disk_dquot) + */ +STATIC uint +xfs_calc_qm_setqlim_reservation( +	struct xfs_mount	*mp) +{ +	return xfs_calc_buf_res(1, sizeof(struct xfs_disk_dquot)); +} + +/* + * Allocating quota on disk if needed. + *	the write transaction log space: XFS_WRITE_LOG_RES(mp) + *	the unit of quota allocation: one system block size + */ +STATIC uint +xfs_calc_qm_dqalloc_reservation( +	struct xfs_mount	*mp) +{ +	return XFS_WRITE_LOG_RES(mp) + +		xfs_calc_buf_res(1, +			XFS_FSB_TO_B(mp, XFS_DQUOT_CLUSTER_SIZE_FSB) - 1); +} + +/* + * Turning off quotas. + *    the xfs_qoff_logitem_t: sizeof(struct xfs_qoff_logitem) * 2 + *    the superblock for the quota flags: sector size + */ +STATIC uint +xfs_calc_qm_quotaoff_reservation( +	struct xfs_mount	*mp) +{ +	return sizeof(struct xfs_qoff_logitem) * 2 + +		xfs_calc_buf_res(1, mp->m_sb.sb_sectsize); +} + +/* + * End of turning off quotas. + *    the xfs_qoff_logitem_t: sizeof(struct xfs_qoff_logitem) * 2 + */ +STATIC uint +xfs_calc_qm_quotaoff_end_reservation( +	struct xfs_mount	*mp) +{ +	return sizeof(struct xfs_qoff_logitem) * 2; +} + +/* + * Syncing the incore super block changes to disk. + *     the super block to reflect the changes: sector size + */ +STATIC uint +xfs_calc_sb_reservation( +	struct xfs_mount	*mp) +{ +	return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize);  }  /* @@ -555,12 +660,19 @@ xfs_trans_init(  	resp->tr_writeid = xfs_calc_writeid_reservation(mp);  	resp->tr_addafork = xfs_calc_addafork_reservation(mp);  	resp->tr_attrinval = xfs_calc_attrinval_reservation(mp); -	resp->tr_attrset = xfs_calc_attrset_reservation(mp); +	resp->tr_attrsetm = xfs_calc_attrsetm_reservation(mp); +	resp->tr_attrsetrt = xfs_calc_attrsetrt_reservation(mp);  	resp->tr_attrrm = xfs_calc_attrrm_reservation(mp);  	resp->tr_clearagi = xfs_calc_clear_agi_bucket_reservation(mp);  	resp->tr_growrtalloc = xfs_calc_growrtalloc_reservation(mp);  	resp->tr_growrtzero = xfs_calc_growrtzero_reservation(mp);  	resp->tr_growrtfree = xfs_calc_growrtfree_reservation(mp); +	resp->tr_qm_sbchange = xfs_calc_qm_sbchange_reservation(mp); +	resp->tr_qm_setqlim = xfs_calc_qm_setqlim_reservation(mp); +	resp->tr_qm_dqalloc = xfs_calc_qm_dqalloc_reservation(mp); +	resp->tr_qm_quotaoff = xfs_calc_qm_quotaoff_reservation(mp); +	resp->tr_qm_equotaoff = xfs_calc_qm_quotaoff_end_reservation(mp); +	resp->tr_sb = xfs_calc_sb_reservation(mp);  }  /* |