[PATCH] JFS: Write journal sync points more often
This patch adds jfs_syncpt, which calls lmLogSync to write sync points to the journal both in jfs_sync_fs and when sync barrier processing completes. lmLogSync accomplishes two things: 1) it pushes logged-but-dirty metadata pages to disk, and 2) it writes a sync record to the journal so that jfs_fsck doesn't need to replay more transactions than is necessary. Signed-off-by: Dave Kleikamp <shaggy@austin.ibm.com> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
7fab479beb
commit
1c6278295d
4 changed files with 27 additions and 9 deletions
|
@ -927,9 +927,8 @@ static void lmPostGC(struct lbuf * bp)
|
||||||
* calculate new value of i_nextsync which determines when
|
* calculate new value of i_nextsync which determines when
|
||||||
* this code is called again.
|
* this code is called again.
|
||||||
*
|
*
|
||||||
* this is called only from lmLog().
|
* PARAMETERS: log - log structure
|
||||||
*
|
* nosyncwait - 1 if called asynchronously
|
||||||
* PARAMETER: ip - pointer to logs inode.
|
|
||||||
*
|
*
|
||||||
* RETURN: 0
|
* RETURN: 0
|
||||||
*
|
*
|
||||||
|
@ -1051,6 +1050,18 @@ static int lmLogSync(struct jfs_log * log, int nosyncwait)
|
||||||
return lsn;
|
return lsn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NAME: jfs_syncpt
|
||||||
|
*
|
||||||
|
* FUNCTION: write log SYNCPT record for specified log
|
||||||
|
*
|
||||||
|
* PARAMETERS: log - log structure
|
||||||
|
*/
|
||||||
|
void jfs_syncpt(struct jfs_log *log)
|
||||||
|
{ LOG_LOCK(log);
|
||||||
|
lmLogSync(log, 1);
|
||||||
|
LOG_UNLOCK(log);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NAME: lmLogOpen()
|
* NAME: lmLogOpen()
|
||||||
|
|
|
@ -508,5 +508,6 @@ extern int lmLogShutdown(struct jfs_log * log);
|
||||||
extern int lmLogInit(struct jfs_log * log);
|
extern int lmLogInit(struct jfs_log * log);
|
||||||
extern int lmLogFormat(struct jfs_log *log, s64 logAddress, int logSize);
|
extern int lmLogFormat(struct jfs_log *log, s64 logAddress, int logSize);
|
||||||
extern void jfs_flush_journal(struct jfs_log * log, int wait);
|
extern void jfs_flush_journal(struct jfs_log * log, int wait);
|
||||||
|
extern void jfs_syncpt(struct jfs_log *log);
|
||||||
|
|
||||||
#endif /* _H_JFS_LOGMGR */
|
#endif /* _H_JFS_LOGMGR */
|
||||||
|
|
|
@ -567,9 +567,6 @@ void txEnd(tid_t tid)
|
||||||
* synchronize with logsync barrier
|
* synchronize with logsync barrier
|
||||||
*/
|
*/
|
||||||
if (test_bit(log_SYNCBARRIER, &log->flag)) {
|
if (test_bit(log_SYNCBARRIER, &log->flag)) {
|
||||||
/* forward log syncpt */
|
|
||||||
/* lmSync(log); */
|
|
||||||
|
|
||||||
jfs_info("log barrier off: 0x%x", log->lsn);
|
jfs_info("log barrier off: 0x%x", log->lsn);
|
||||||
|
|
||||||
/* enable new transactions start */
|
/* enable new transactions start */
|
||||||
|
@ -577,15 +574,22 @@ void txEnd(tid_t tid)
|
||||||
|
|
||||||
/* wakeup all waitors for logsync barrier */
|
/* wakeup all waitors for logsync barrier */
|
||||||
TXN_WAKEUP(&log->syncwait);
|
TXN_WAKEUP(&log->syncwait);
|
||||||
|
|
||||||
|
TXN_UNLOCK();
|
||||||
|
|
||||||
|
/* forward log syncpt */
|
||||||
|
jfs_syncpt(log);
|
||||||
|
|
||||||
|
goto wakeup;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TXN_UNLOCK();
|
||||||
|
wakeup:
|
||||||
/*
|
/*
|
||||||
* wakeup all waitors for a free tblock
|
* wakeup all waitors for a free tblock
|
||||||
*/
|
*/
|
||||||
TXN_WAKEUP(&TxAnchor.freewait);
|
TXN_WAKEUP(&TxAnchor.freewait);
|
||||||
|
|
||||||
TXN_UNLOCK();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -558,8 +558,10 @@ static int jfs_sync_fs(struct super_block *sb, int wait)
|
||||||
struct jfs_log *log = JFS_SBI(sb)->log;
|
struct jfs_log *log = JFS_SBI(sb)->log;
|
||||||
|
|
||||||
/* log == NULL indicates read-only mount */
|
/* log == NULL indicates read-only mount */
|
||||||
if (log)
|
if (log) {
|
||||||
jfs_flush_journal(log, wait);
|
jfs_flush_journal(log, wait);
|
||||||
|
jfs_syncpt(log);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue