Commit 9590e9c6 authored by Dave Chinner's avatar Dave Chinner Committed by Darrick J. Wong
Browse files

xfs: re-order initial space accounting checks in xlog_write



Commit and unmount records records do not need start records to be
written, so rearrange the logic in xlog_write() to remove the need
to check for XLOG_TIC_INITED to determine if we should account for
the space used by a start record.

Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
parent 7ec94921
Loading
Loading
Loading
Loading
+10 −21
Original line number Diff line number Diff line
@@ -2356,10 +2356,10 @@ xlog_write(
	bool			need_start_rec)
{
	struct xlog_in_core	*iclog = NULL;
	struct xfs_log_iovec	*vecp;
	struct xfs_log_vec	*lv;
	struct xfs_log_vec	*lv = log_vector;
	struct xfs_log_iovec	*vecp = lv->lv_iovecp;
	int			index = 0;
	int			len;
	int			index;
	int			partial_copy = 0;
	int			partial_copy_len = 0;
	int			contwr = 0;
@@ -2367,24 +2367,16 @@ xlog_write(
	int			data_cnt = 0;
	int			error = 0;

	*start_lsn = 0;


	/*
	 * Region headers and bytes are already accounted for.  We only need to
	 * take into account start records and split regions in this function.
	 * If this is a commit or unmount transaction, we don't need a start
	 * record to be written.  We do, however, have to account for the
	 * commit or unmount header that gets written. Hence we always have
	 * to account for an extra xlog_op_header here.
	 */
	if (ticket->t_flags & XLOG_TIC_INITED) {
	ticket->t_curr_res -= sizeof(struct xlog_op_header);
	if (ticket->t_flags & XLOG_TIC_INITED)
		ticket->t_flags &= ~XLOG_TIC_INITED;
	}

	/*
	 * Commit record headers and unmount records need to be accounted for.
	 * These come in as separate writes so are easy to detect.
	 */
	if (!need_start_rec)
		ticket->t_curr_res -= sizeof(struct xlog_op_header);
	if (ticket->t_curr_res < 0) {
		xfs_alert_tag(log->l_mp, XFS_PTAG_LOGRES,
		     "ctx ticket reservation ran out. Need to up reservation");
@@ -2393,10 +2385,7 @@ xlog_write(
	}

	len = xlog_write_calc_vec_length(ticket, log_vector, need_start_rec);

	index = 0;
	lv = log_vector;
	vecp = lv->lv_iovecp;
	*start_lsn = 0;
	while (lv && (!lv->lv_niovecs || index < lv->lv_niovecs)) {
		void		*ptr;
		int		log_offset;