Commit 1c6278295d6482edaaaef5faa64b18f17b3319b7

Authored by Dave Kleikamp
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

... ... @@ -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()
... ... @@ -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 */
... ... @@ -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  
... ... @@ -558,8 +558,10 @@
558 558 struct jfs_log *log = JFS_SBI(sb)->log;
559 559  
560 560 /* log == NULL indicates read-only mount */
561   - if (log)
  561 + if (log) {
562 562 jfs_flush_journal(log, wait);
  563 + jfs_syncpt(log);
  564 + }
563 565  
564 566 return 0;
565 567 }