Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 48001044 authored by Jeff Liu's avatar Jeff Liu Committed by Ben Myers
Browse files

xfs: calculate XFS_TRANS_QM_DQALLOC space log reservation at mount time



The disk quota allocation log space reservation is calcuated at runtime,
this patch does it at mount time.

Signed-off-by: default avatarJie Liu <jeff.liu@oracle.com>
CC: Dave Chinner <david@fromorbit.com>
Reviewed-by: default avatarMark Tinguely <tinguely@sgi.com>
Signed-off-by: default avatarBen Myers <bpm@sgi.com>
parent f0f2df94
Loading
Loading
Loading
Loading
+3 −9
Original line number Diff line number Diff line
@@ -612,13 +612,7 @@ xfs_qm_dqread(
	if (flags & XFS_QMOPT_DQALLOC) {
		tp = xfs_trans_alloc(mp, XFS_TRANS_QM_DQALLOC);
		error = xfs_trans_reserve(tp, XFS_QM_DQALLOC_SPACE_RES(mp),
				XFS_WRITE_LOG_RES(mp) +
				/*
				 * Round the chunklen up to the next multiple
				 * of 128 (buf log item chunk size)).
				 */
				BBTOB(mp->m_quotainfo->qi_dqchunklen) - 1 + 128,
				0,
					  XFS_QM_DQALLOC_LOG_RES(mp), 0,
					  XFS_TRANS_PERM_LOG_RES,
					  XFS_WRITE_LOG_COUNT);
		if (error)
+1 −0
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ typedef struct xfs_trans_reservations {
	uint	tr_growrtfree;	/* grow realtime freeing */
	uint	tr_qm_sbchange;	/* change quota flags */
	uint	tr_qm_setqlim;	/* adjust quota limits */
	uint	tr_qm_dqalloc;	/* allocate quota on disk */
} xfs_trans_reservations_t;

#ifndef __KERNEL__
+15 −0
Original line number Diff line number Diff line
@@ -567,6 +567,20 @@ xfs_calc_qm_setqlim_reservation(
	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);
}

/*
 * Initialize the precomputed transaction reservation values
 * in the mount structure.
@@ -600,6 +614,7 @@ xfs_trans_init(
	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);
}

/*
+1 −0
Original line number Diff line number Diff line
@@ -264,6 +264,7 @@ struct xfs_log_item_desc {
#define	XFS_CLEAR_AGI_BUCKET_LOG_RES(mp)  ((mp)->m_reservations.tr_clearagi)
#define XFS_QM_SBCHANGE_LOG_RES(mp)	((mp)->m_reservations.tr_qm_sbchange)
#define XFS_QM_SETQLIM_LOG_RES(mp)	((mp)->m_reservations.tr_qm_setqlim)
#define XFS_QM_DQALLOC_LOG_RES(mp)	((mp)->m_reservations.tr_qm_dqalloc)

/*
 * Various log count values.