Commit 9fe5c77c authored by Dave Chinner's avatar Dave Chinner Committed by Darrick J. Wong
Browse files

xfs: mark log recovery buffers for completion



Log recovery has it's own buffer write completion handler for
buffers that it directly recovers. Convert these to direct calls by
flagging these buffers as being log recovery buffers. The flag will
get cleared by the log recovery IO completion routine, so it will
never leak out of log recovery.

Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
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 0c7e5afb
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@
#include "xfs_mount.h"
#include "xfs_trace.h"
#include "xfs_log.h"
#include "xfs_log_recover.h"
#include "xfs_trans.h"
#include "xfs_buf_item.h"
#include "xfs_errortag.h"
@@ -1207,6 +1208,15 @@ xfs_buf_ioend(
	if (read)
		goto out_finish;

	/*
	 * If this is a log recovery buffer, we aren't doing transactional IO
	 * yet so we need to let it handle IO completions.
	 */
	if (bp->b_flags & _XBF_LOGRECOVERY) {
		xlog_recover_iodone(bp);
		return;
	}

	if (bp->b_flags & _XBF_INODES) {
		xfs_buf_inode_iodone(bp);
		return;
+2 −0
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@
/* buffer type flags for write callbacks */
#define _XBF_INODES	 (1 << 16)/* inode buffer */
#define _XBF_DQUOTS	 (1 << 17)/* dquot buffer */
#define _XBF_LOGRECOVERY	 (1 << 18)/* log recovery buffer */

/* flags used only internally */
#define _XBF_PAGES	 (1 << 20)/* backed by refcounted pages */
@@ -56,6 +57,7 @@ typedef unsigned int xfs_buf_flags_t;
	{ XBF_WRITE_FAIL,	"WRITE_FAIL" }, \
	{ _XBF_INODES,		"INODES" }, \
	{ _XBF_DQUOTS,		"DQUOTS" }, \
	{ _XBF_LOGRECOVERY,		"LOG_RECOVERY" }, \
	{ _XBF_PAGES,		"PAGES" }, \
	{ _XBF_KMEM,		"KMEM" }, \
	{ _XBF_DELWRI_Q,	"DELWRI_Q" }, \
+2 −3
Original line number Diff line number Diff line
@@ -419,8 +419,7 @@ xlog_recover_validate_buf_type(
	if (bp->b_ops) {
		struct xfs_buf_log_item	*bip;

		ASSERT(!bp->b_iodone || bp->b_iodone == xlog_recover_iodone);
		bp->b_iodone = xlog_recover_iodone;
		bp->b_flags |= _XBF_LOGRECOVERY;
		xfs_buf_item_init(bp, mp);
		bip = bp->b_log_item;
		bip->bli_item.li_lsn = current_lsn;
@@ -963,7 +962,7 @@ xlog_recover_buf_commit_pass2(
		error = xfs_bwrite(bp);
	} else {
		ASSERT(bp->b_mount == mp);
		bp->b_iodone = xlog_recover_iodone;
		bp->b_flags |= _XBF_LOGRECOVERY;
		xfs_buf_delwri_queue(bp, buffer_list);
	}

+1 −1
Original line number Diff line number Diff line
@@ -153,7 +153,7 @@ xlog_recover_dquot_commit_pass2(

	ASSERT(dq_f->qlf_size == 2);
	ASSERT(bp->b_mount == mp);
	bp->b_iodone = xlog_recover_iodone;
	bp->b_flags |= _XBF_LOGRECOVERY;
	xfs_buf_delwri_queue(bp, buffer_list);

out_release:
+1 −1
Original line number Diff line number Diff line
@@ -376,7 +376,7 @@ xlog_recover_inode_commit_pass2(
	xfs_dinode_calc_crc(log->l_mp, dip);

	ASSERT(bp->b_mount == mp);
	bp->b_iodone = xlog_recover_iodone;
	bp->b_flags |= _XBF_LOGRECOVERY;
	xfs_buf_delwri_queue(bp, buffer_list);

out_release:
Loading