Commit 1c627829 authored by Dave Kleikamp's avatar Dave Kleikamp Committed by Linus Torvalds

[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: default avatarDave Kleikamp <shaggy@austin.ibm.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 7fab479b
...@@ -927,9 +927,8 @@ static void lmPostGC(struct lbuf * bp) ...@@ -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) ...@@ -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); ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment