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: Dave Chinner <dchinner@redhat.com> Reviewed-by: Brian Foster <bfoster@redhat.com> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
This commit is contained in:
Родитель
0c7e5afbea
Коммит
9fe5c77cbe
|
@ -14,6 +14,7 @@
|
||||||
#include "xfs_mount.h"
|
#include "xfs_mount.h"
|
||||||
#include "xfs_trace.h"
|
#include "xfs_trace.h"
|
||||||
#include "xfs_log.h"
|
#include "xfs_log.h"
|
||||||
|
#include "xfs_log_recover.h"
|
||||||
#include "xfs_trans.h"
|
#include "xfs_trans.h"
|
||||||
#include "xfs_buf_item.h"
|
#include "xfs_buf_item.h"
|
||||||
#include "xfs_errortag.h"
|
#include "xfs_errortag.h"
|
||||||
|
@ -1207,6 +1208,15 @@ xfs_buf_ioend(
|
||||||
if (read)
|
if (read)
|
||||||
goto out_finish;
|
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) {
|
if (bp->b_flags & _XBF_INODES) {
|
||||||
xfs_buf_inode_iodone(bp);
|
xfs_buf_inode_iodone(bp);
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
/* buffer type flags for write callbacks */
|
/* buffer type flags for write callbacks */
|
||||||
#define _XBF_INODES (1 << 16)/* inode buffer */
|
#define _XBF_INODES (1 << 16)/* inode buffer */
|
||||||
#define _XBF_DQUOTS (1 << 17)/* dquot buffer */
|
#define _XBF_DQUOTS (1 << 17)/* dquot buffer */
|
||||||
|
#define _XBF_LOGRECOVERY (1 << 18)/* log recovery buffer */
|
||||||
|
|
||||||
/* flags used only internally */
|
/* flags used only internally */
|
||||||
#define _XBF_PAGES (1 << 20)/* backed by refcounted pages */
|
#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_WRITE_FAIL, "WRITE_FAIL" }, \
|
||||||
{ _XBF_INODES, "INODES" }, \
|
{ _XBF_INODES, "INODES" }, \
|
||||||
{ _XBF_DQUOTS, "DQUOTS" }, \
|
{ _XBF_DQUOTS, "DQUOTS" }, \
|
||||||
|
{ _XBF_LOGRECOVERY, "LOG_RECOVERY" }, \
|
||||||
{ _XBF_PAGES, "PAGES" }, \
|
{ _XBF_PAGES, "PAGES" }, \
|
||||||
{ _XBF_KMEM, "KMEM" }, \
|
{ _XBF_KMEM, "KMEM" }, \
|
||||||
{ _XBF_DELWRI_Q, "DELWRI_Q" }, \
|
{ _XBF_DELWRI_Q, "DELWRI_Q" }, \
|
||||||
|
|
|
@ -419,8 +419,7 @@ xlog_recover_validate_buf_type(
|
||||||
if (bp->b_ops) {
|
if (bp->b_ops) {
|
||||||
struct xfs_buf_log_item *bip;
|
struct xfs_buf_log_item *bip;
|
||||||
|
|
||||||
ASSERT(!bp->b_iodone || bp->b_iodone == xlog_recover_iodone);
|
bp->b_flags |= _XBF_LOGRECOVERY;
|
||||||
bp->b_iodone = xlog_recover_iodone;
|
|
||||||
xfs_buf_item_init(bp, mp);
|
xfs_buf_item_init(bp, mp);
|
||||||
bip = bp->b_log_item;
|
bip = bp->b_log_item;
|
||||||
bip->bli_item.li_lsn = current_lsn;
|
bip->bli_item.li_lsn = current_lsn;
|
||||||
|
@ -963,7 +962,7 @@ xlog_recover_buf_commit_pass2(
|
||||||
error = xfs_bwrite(bp);
|
error = xfs_bwrite(bp);
|
||||||
} else {
|
} else {
|
||||||
ASSERT(bp->b_mount == mp);
|
ASSERT(bp->b_mount == mp);
|
||||||
bp->b_iodone = xlog_recover_iodone;
|
bp->b_flags |= _XBF_LOGRECOVERY;
|
||||||
xfs_buf_delwri_queue(bp, buffer_list);
|
xfs_buf_delwri_queue(bp, buffer_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -153,7 +153,7 @@ xlog_recover_dquot_commit_pass2(
|
||||||
|
|
||||||
ASSERT(dq_f->qlf_size == 2);
|
ASSERT(dq_f->qlf_size == 2);
|
||||||
ASSERT(bp->b_mount == mp);
|
ASSERT(bp->b_mount == mp);
|
||||||
bp->b_iodone = xlog_recover_iodone;
|
bp->b_flags |= _XBF_LOGRECOVERY;
|
||||||
xfs_buf_delwri_queue(bp, buffer_list);
|
xfs_buf_delwri_queue(bp, buffer_list);
|
||||||
|
|
||||||
out_release:
|
out_release:
|
||||||
|
|
|
@ -376,7 +376,7 @@ out_owner_change:
|
||||||
xfs_dinode_calc_crc(log->l_mp, dip);
|
xfs_dinode_calc_crc(log->l_mp, dip);
|
||||||
|
|
||||||
ASSERT(bp->b_mount == mp);
|
ASSERT(bp->b_mount == mp);
|
||||||
bp->b_iodone = xlog_recover_iodone;
|
bp->b_flags |= _XBF_LOGRECOVERY;
|
||||||
xfs_buf_delwri_queue(bp, buffer_list);
|
xfs_buf_delwri_queue(bp, buffer_list);
|
||||||
|
|
||||||
out_release:
|
out_release:
|
||||||
|
|
|
@ -287,9 +287,8 @@ xlog_recover_iodone(
|
||||||
if (bp->b_log_item)
|
if (bp->b_log_item)
|
||||||
xfs_buf_item_relse(bp);
|
xfs_buf_item_relse(bp);
|
||||||
ASSERT(bp->b_log_item == NULL);
|
ASSERT(bp->b_log_item == NULL);
|
||||||
|
bp->b_flags &= ~_XBF_LOGRECOVERY;
|
||||||
bp->b_iodone = NULL;
|
xfs_buf_ioend_finish(bp);
|
||||||
xfs_buf_ioend(bp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Загрузка…
Ссылка в новой задаче