JFS: Don't set log_SYNCBARRIER when log->active == 0
authorDave Kleikamp <shaggy@austin.ibm.com>
Mon, 25 Jul 2005 13:58:54 +0000 (08:58 -0500)
committerDave Kleikamp <shaggy@austin.ibm.com>
Mon, 25 Jul 2005 13:58:54 +0000 (08:58 -0500)
If a metadata page is kept active, it is possible that the sync barrier logic
continues to trigger, even if all active transactions have been phyically
written to the journal.  This can cause a hang, since the completion of the
journal I/O is what unsets the sync barrier flag to allow new transactions
to be created.

Signed-off-by: Dave Kleikamp <shaggy@austin.ibm.com>
fs/jfs/jfs_logmgr.c

index 79d07624bfe1787fff2b5ee3b3c8e1479b34ffe3..22815e88e7cc0caa85ccdf4220d2777b1929b363 100644 (file)
@@ -1030,7 +1030,8 @@ static int lmLogSync(struct jfs_log * log, int nosyncwait)
         * starting until all current transactions are completed
         * by setting syncbarrier flag.
         */
-       if (written > LOGSYNC_BARRIER(logsize) && logsize > 32 * LOGPSIZE) {
+       if (!test_bit(log_SYNCBARRIER, &log->flag) &&
+           (written > LOGSYNC_BARRIER(logsize)) && log->active) {
                set_bit(log_SYNCBARRIER, &log->flag);
                jfs_info("log barrier on: lsn=0x%x syncpt=0x%x", lsn,
                         log->syncpt);