* When aborting a transaction, we also need to revert any changes made to the

cached bfs_inode of all changes inodes.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31859 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2009-07-28 20:33:39 +00:00
parent c9d9b2da7e
commit 0bad839702
4 changed files with 25 additions and 9 deletions
+10 -3
View File
@@ -333,9 +333,7 @@ Inode::Inode(Volume* volume, ino_t id)
{ {
PRINT(("Inode::Inode(volume = %p, id = %Ld) @ %p\n", volume, id, this)); PRINT(("Inode::Inode(volume = %p, id = %Ld) @ %p\n", volume, id, this));
NodeGetter node(volume, this); UpdateNodeFromDisk();
memcpy(&fNode, node.Node(), sizeof(bfs_inode));
fNode.flags &= HOST_ENDIAN_TO_BFS_INT32(INODE_PERMANENT_FLAGS);
char lockName[B_OS_NAME_LENGTH]; char lockName[B_OS_NAME_LENGTH];
snprintf(lockName, sizeof(lockName), "bfs inode %d.%d", snprintf(lockName, sizeof(lockName), "bfs inode %d.%d",
@@ -458,6 +456,15 @@ Inode::WriteBack(Transaction& transaction)
} }
void
Inode::UpdateNodeFromDisk()
{
NodeGetter node(fVolume, this);
memcpy(&fNode, node.Node(), sizeof(bfs_inode));
fNode.flags &= HOST_ENDIAN_TO_BFS_INT32(INODE_PERMANENT_FLAGS);
}
status_t status_t
Inode::CheckPermissions(int accessMode) const Inode::CheckPermissions(int accessMode) const
{ {
@@ -42,7 +42,9 @@ public:
{ transaction.AddInode(this); } { transaction.AddInode(this); }
recursive_lock& SmallDataLock() { return fSmallDataLock; } recursive_lock& SmallDataLock() { return fSmallDataLock; }
status_t WriteBack(Transaction& transaction); status_t WriteBack(Transaction& transaction);
void UpdateNodeFromDisk();
bool IsContainer() const bool IsContainer() const
{ return S_ISDIR(Mode()); } { return S_ISDIR(Mode()); }
@@ -1151,10 +1151,17 @@ Transaction::RemoveInode(Inode* inode)
void void
Transaction::_UnlockInodes() Transaction::_UnlockInodes(bool success)
{ {
while (Inode* inode = fLockedInodes.RemoveHead()) { while (Inode* inode = fLockedInodes.RemoveHead()) {
inode->Node().flags &= ~HOST_ENDIAN_TO_BFS_INT32(INODE_IN_TRANSACTION); if (success) {
inode->Node().flags
&= ~HOST_ENDIAN_TO_BFS_INT32(INODE_IN_TRANSACTION);
} else {
// revert any changes made to the cached bfs_inode
inode->UpdateNodeFromDisk();
}
rw_lock_write_unlock(&inode->Lock()); rw_lock_write_unlock(&inode->Lock());
// See AddInode() why we do this here // See AddInode() why we do this here
@@ -1,5 +1,5 @@
/* /*
* Copyright 2001-2008, Axel Dörfler, axeld@pinc-software.de. * Copyright 2001-2009, Axel Dörfler, axeld@pinc-software.de.
* This file may be used under the terms of the MIT License. * This file may be used under the terms of the MIT License.
*/ */
#ifndef JOURNAL_H #ifndef JOURNAL_H
@@ -108,7 +108,7 @@ public:
{ {
if (fJournal != NULL) { if (fJournal != NULL) {
fJournal->Unlock(this, false); fJournal->Unlock(this, false);
_UnlockInodes(); _UnlockInodes(false);
} }
} }
@@ -119,7 +119,7 @@ public:
{ {
status_t status = B_OK; status_t status = B_OK;
if (fJournal != NULL) { if (fJournal != NULL) {
_UnlockInodes(); _UnlockInodes(true);
status = fJournal->Unlock(this, true); status = fJournal->Unlock(this, true);
if (status == B_OK) if (status == B_OK)
fJournal = NULL; fJournal = NULL;
@@ -172,7 +172,7 @@ private:
Transaction& operator=(const Transaction& other); Transaction& operator=(const Transaction& other);
// no implementation // no implementation
void _UnlockInodes(); void _UnlockInodes(bool success);
Journal* fJournal; Journal* fJournal;
InodeList fLockedInodes; InodeList fLockedInodes;