Commit 1c6278295d6482edaaaef5faa64b18f17b3319b7
Committed by
Linus Torvalds
1 parent
7fab479beb
[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>
Showing 4 changed files with 27 additions and 9 deletions Side-by-side Diff
fs/jfs/jfs_logmgr.c
... | ... | @@ -927,10 +927,9 @@ |
927 | 927 | * calculate new value of i_nextsync which determines when |
928 | 928 | * this code is called again. |
929 | 929 | * |
930 | - * this is called only from lmLog(). | |
930 | + * PARAMETERS: log - log structure | |
931 | + * nosyncwait - 1 if called asynchronously | |
931 | 932 | * |
932 | - * PARAMETER: ip - pointer to logs inode. | |
933 | - * | |
934 | 933 | * RETURN: 0 |
935 | 934 | * |
936 | 935 | * serialization: LOG_LOCK() held on entry/exit |
... | ... | @@ -1051,6 +1050,18 @@ |
1051 | 1050 | return lsn; |
1052 | 1051 | } |
1053 | 1052 | |
1053 | +/* | |
1054 | + * NAME: jfs_syncpt | |
1055 | + * | |
1056 | + * FUNCTION: write log SYNCPT record for specified log | |
1057 | + * | |
1058 | + * PARAMETERS: log - log structure | |
1059 | + */ | |
1060 | +void jfs_syncpt(struct jfs_log *log) | |
1061 | +{ LOG_LOCK(log); | |
1062 | + lmLogSync(log, 1); | |
1063 | + LOG_UNLOCK(log); | |
1064 | +} | |
1054 | 1065 | |
1055 | 1066 | /* |
1056 | 1067 | * NAME: lmLogOpen() |
fs/jfs/jfs_logmgr.h
... | ... | @@ -508,6 +508,7 @@ |
508 | 508 | extern int lmLogInit(struct jfs_log * log); |
509 | 509 | extern int lmLogFormat(struct jfs_log *log, s64 logAddress, int logSize); |
510 | 510 | extern void jfs_flush_journal(struct jfs_log * log, int wait); |
511 | +extern void jfs_syncpt(struct jfs_log *log); | |
511 | 512 | |
512 | 513 | #endif /* _H_JFS_LOGMGR */ |
fs/jfs/jfs_txnmgr.c
... | ... | @@ -567,9 +567,6 @@ |
567 | 567 | * synchronize with logsync barrier |
568 | 568 | */ |
569 | 569 | if (test_bit(log_SYNCBARRIER, &log->flag)) { |
570 | - /* forward log syncpt */ | |
571 | - /* lmSync(log); */ | |
572 | - | |
573 | 570 | jfs_info("log barrier off: 0x%x", log->lsn); |
574 | 571 | |
575 | 572 | /* enable new transactions start */ |
576 | 573 | |
577 | 574 | |
... | ... | @@ -577,15 +574,22 @@ |
577 | 574 | |
578 | 575 | /* wakeup all waitors for logsync barrier */ |
579 | 576 | TXN_WAKEUP(&log->syncwait); |
577 | + | |
578 | + TXN_UNLOCK(); | |
579 | + | |
580 | + /* forward log syncpt */ | |
581 | + jfs_syncpt(log); | |
582 | + | |
583 | + goto wakeup; | |
580 | 584 | } |
581 | 585 | } |
582 | 586 | |
587 | + TXN_UNLOCK(); | |
588 | +wakeup: | |
583 | 589 | /* |
584 | 590 | * wakeup all waitors for a free tblock |
585 | 591 | */ |
586 | 592 | TXN_WAKEUP(&TxAnchor.freewait); |
587 | - | |
588 | - TXN_UNLOCK(); | |
589 | 593 | } |
590 | 594 | |
591 | 595 |
fs/jfs/super.c