From 82b3bdd45c2e1ccf7b80729aa9b52926b95d232b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Sat, 6 Nov 2010 14:29:15 +0000 Subject: [PATCH] Stop the journal on Sync(), start the journal when a transaction is written. This helps with fs state on shutdown. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@39325 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/kernel/file_systems/ext2/Journal.cpp | 9 +++++++++ src/add-ons/kernel/file_systems/ext2/Journal.h | 1 + src/add-ons/kernel/file_systems/ext2/Volume.cpp | 2 +- .../kernel/file_systems/ext2/kernel_interface.cpp | 10 +++++++++- 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/add-ons/kernel/file_systems/ext2/Journal.cpp b/src/add-ons/kernel/file_systems/ext2/Journal.cpp index 80a10d959e..0f9984d4f7 100644 --- a/src/add-ons/kernel/file_systems/ext2/Journal.cpp +++ b/src/add-ons/kernel/file_systems/ext2/Journal.cpp @@ -137,6 +137,7 @@ Journal::Journal() fFirstLogBlock(1), fLogSize(0), fVersion(0), + fIsStarted(false), fLogStart(0), fLogEnd(0), fFreeBlocks(0), @@ -175,6 +176,9 @@ Journal::InitCheck() status_t Journal::Uninit() { + if (!fIsStarted) + return B_OK; + status_t status = FlushLogAndBlocks(); if (status == B_OK) { @@ -183,6 +187,8 @@ Journal::Uninit() status = _SaveSuperBlock(); } + fIsStarted = false; + return status; } @@ -193,6 +199,7 @@ Journal::StartLog() fLogStart = fFirstLogBlock; fLogEnd = fFirstLogBlock; fFreeBlocks = 0; + fIsStarted = true; fCurrentCommitID = fFirstCommitID; @@ -497,6 +504,8 @@ Journal::_WriteTransactionToLog() "the transaction\n"); fHasSubTransaction = false; + if (!fIsStarted) + StartLog(); // Prepare Descriptor block TRACE("Journal::_WriteTransactionToLog(): attempting to allocate space for " diff --git a/src/add-ons/kernel/file_systems/ext2/Journal.h b/src/add-ons/kernel/file_systems/ext2/Journal.h index 23ded822da..d95d489661 100644 --- a/src/add-ons/kernel/file_systems/ext2/Journal.h +++ b/src/add-ons/kernel/file_systems/ext2/Journal.h @@ -216,6 +216,7 @@ protected: uint32 fLogSize; uint32 fVersion; + bool fIsStarted; uint32 fLogStart; uint32 fLogEnd; uint32 fFreeBlocks; diff --git a/src/add-ons/kernel/file_systems/ext2/Volume.cpp b/src/add-ons/kernel/file_systems/ext2/Volume.cpp index 8a2dffb305..54519e1aaa 100644 --- a/src/add-ons/kernel/file_systems/ext2/Volume.cpp +++ b/src/add-ons/kernel/file_systems/ext2/Volume.cpp @@ -848,7 +848,7 @@ status_t Volume::Sync() { TRACE("Volume::Sync()\n"); - return fJournal->FlushLogAndBlocks(); + return fJournal->Uninit(); } diff --git a/src/add-ons/kernel/file_systems/ext2/kernel_interface.cpp b/src/add-ons/kernel/file_systems/ext2/kernel_interface.cpp index e8fe552579..beb78a8889 100644 --- a/src/add-ons/kernel/file_systems/ext2/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/ext2/kernel_interface.cpp @@ -176,6 +176,14 @@ ext2_read_fs_info(fs_volume* _volume, struct fs_info* info) } +static status_t +ext2_sync(fs_volume* _volume) +{ + Volume* volume = (Volume*)_volume->private_volume; + return volume->Sync(); +} + + // #pragma mark - @@ -1598,7 +1606,7 @@ fs_volume_ops gExt2VolumeOps = { &ext2_unmount, &ext2_read_fs_info, NULL, // write_fs_info() - NULL, // sync() + &ext2_sync, &ext2_get_vnode, };