Skip to content

Commit

Permalink
[PATCH] JFS: Write journal sync points more often
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Dave Kleikamp authored and Linus Torvalds committed May 3, 2005
1 parent 7fab479 commit 1c62782
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 9 deletions.
17 changes: 14 additions & 3 deletions fs/jfs/jfs_logmgr.c
Original file line number Diff line number Diff line change
Expand Up @@ -927,9 +927,8 @@ static void lmPostGC(struct lbuf * bp)
* calculate new value of i_nextsync which determines when
* this code is called again.
*
* this is called only from lmLog().
*
* PARAMETER: ip - pointer to logs inode.
* PARAMETERS: log - log structure
* nosyncwait - 1 if called asynchronously
*
* RETURN: 0
*
Expand Down Expand Up @@ -1051,6 +1050,18 @@ static int lmLogSync(struct jfs_log * log, int nosyncwait)
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()
Expand Down
1 change: 1 addition & 0 deletions fs/jfs/jfs_logmgr.h
Original file line number Diff line number Diff line change
Expand Up @@ -508,5 +508,6 @@ extern int lmLogShutdown(struct jfs_log * log);
extern int lmLogInit(struct jfs_log * log);
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_syncpt(struct jfs_log *log);

#endif /* _H_JFS_LOGMGR */
14 changes: 9 additions & 5 deletions fs/jfs/jfs_txnmgr.c
Original file line number Diff line number Diff line change
Expand Up @@ -567,25 +567,29 @@ void txEnd(tid_t tid)
* synchronize with logsync barrier
*/
if (test_bit(log_SYNCBARRIER, &log->flag)) {
/* forward log syncpt */
/* lmSync(log); */

jfs_info("log barrier off: 0x%x", log->lsn);

/* enable new transactions start */
clear_bit(log_SYNCBARRIER, &log->flag);

/* wakeup all waitors for logsync barrier */
TXN_WAKEUP(&log->syncwait);

TXN_UNLOCK();

/* forward log syncpt */
jfs_syncpt(log);

goto wakeup;
}
}

TXN_UNLOCK();
wakeup:
/*
* wakeup all waitors for a free tblock
*/
TXN_WAKEUP(&TxAnchor.freewait);

TXN_UNLOCK();
}


Expand Down
4 changes: 3 additions & 1 deletion fs/jfs/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -558,8 +558,10 @@ static int jfs_sync_fs(struct super_block *sb, int wait)
struct jfs_log *log = JFS_SBI(sb)->log;

/* log == NULL indicates read-only mount */
if (log)
if (log) {
jfs_flush_journal(log, wait);
jfs_syncpt(log);
}

return 0;
}
Expand Down

0 comments on commit 1c62782

Please sign in to comment.