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

Commit e773fc93 authored by Jie Liu's avatar Jie Liu Committed by Ben Myers
Browse files

xfs: Refactor xfs_ticket_alloc() to extract a new helper



Refactor xlog_ticket_alloc() to extract a new helper, i.e.
xfs_log_calc_unit_res().

This helper would be used to calculate the total log reservation
size by adding extra log operation/transation headers for a new
log ticket.

Signed-off-by: default avatarJie Liu <jeff.liu@oracle.com>
Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
Reviewed-by: default avatarMark Tinguely <tinguely@sgi.com>
Signed-off-by: default avatarBen Myers <bpm@sgi.com>
parent f749278c
Loading
Loading
Loading
Loading
+38 −22
Original line number Diff line number Diff line
@@ -3391,24 +3391,17 @@ xfs_log_ticket_get(
}

/*
 * Allocate and initialise a new log ticket.
 * Figure out the total log space unit (in bytes) that would be
 * required for a log ticket.
 */
struct xlog_ticket *
xlog_ticket_alloc(
	struct xlog	*log,
	int		unit_bytes,
	int		cnt,
	char		client,
	bool		permanent,
	xfs_km_flags_t	alloc_flags)
int
xfs_log_calc_unit_res(
	struct xfs_mount	*mp,
	int			unit_bytes)
{
	struct xlog_ticket *tic;
	uint		num_headers;
	struct xlog		*log = mp->m_log;
	int			iclog_space;

	tic = kmem_zone_zalloc(xfs_log_ticket_zone, alloc_flags);
	if (!tic)
		return NULL;
	uint			num_headers;

	/*
	 * Permanent reservations have up to 'cnt'-1 active log operations
@@ -3483,20 +3476,43 @@ xlog_ticket_alloc(
	unit_bytes += log->l_iclog_hsize;

	/* for roundoff padding for transaction data and one for commit record */
	if (xfs_sb_version_haslogv2(&log->l_mp->m_sb) &&
	    log->l_mp->m_sb.sb_logsunit > 1) {
	if (xfs_sb_version_haslogv2(&mp->m_sb) && mp->m_sb.sb_logsunit > 1) {
		/* log su roundoff */
		unit_bytes += 2*log->l_mp->m_sb.sb_logsunit;
		unit_bytes += 2 * mp->m_sb.sb_logsunit;
	} else {
		/* BB roundoff */
		unit_bytes += 2 * BBSIZE;
        }

	return unit_bytes;
}

/*
 * Allocate and initialise a new log ticket.
 */
struct xlog_ticket *
xlog_ticket_alloc(
	struct xlog		*log,
	int			unit_bytes,
	int			cnt,
	char			client,
	bool			permanent,
	xfs_km_flags_t		alloc_flags)
{
	struct xlog_ticket	*tic;
	int			unit_res;

	tic = kmem_zone_zalloc(xfs_log_ticket_zone, alloc_flags);
	if (!tic)
		return NULL;

	unit_res = xfs_log_calc_unit_res(log->l_mp, unit_bytes);

	atomic_set(&tic->t_ref, 1);
	tic->t_task		= current;
	INIT_LIST_HEAD(&tic->t_queue);
	tic->t_unit_res		= unit_bytes;
	tic->t_curr_res		= unit_bytes;
	tic->t_unit_res		= unit_res;
	tic->t_curr_res		= unit_res;
	tic->t_cnt		= cnt;
	tic->t_ocnt		= cnt;
	tic->t_tid		= prandom_u32();
+4 −0
Original line number Diff line number Diff line
@@ -18,6 +18,8 @@
#ifndef	__XFS_LOG_FORMAT_H__
#define __XFS_LOG_FORMAT_H__

struct xfs_mount;

/*
 * On-disk Log Format definitions.
 *
@@ -834,4 +836,6 @@ struct xfs_icreate_log {
	__be32		icl_gen;	/* inode generation number to use */
};

int	xfs_log_calc_unit_res(struct xfs_mount *mp, int unit_bytes);

#endif /* __XFS_LOG_FORMAT_H__ */