1272286Sjkim/*
2272286Sjkim * Copyright 2001-2010, Haiku Inc. All rights reserved.
3272286Sjkim * This file may be used under the terms of the MIT License.
4272286Sjkim *
5272286Sjkim * Authors:
6272286Sjkim *		Janito V. Ferreira Filho
7272286Sjkim */
8306536Sjkim
9272286Sjkim
10272286Sjkim#include "InodeJournal.h"
11272286Sjkim
12272286Sjkim#include <new>
13272286Sjkim
14272286Sjkim#include <fs_cache.h>
15272286Sjkim
16272286Sjkim#include "HashRevokeManager.h"
17272286Sjkim
18272286Sjkim
19272286Sjkim//#define TRACE_EXT2
20272286Sjkim#ifdef TRACE_EXT2
21272286Sjkim#	define TRACE(x...) dprintf("\33[34mext2:\33[0m " x)
22272286Sjkim#else
23272286Sjkim#	define TRACE(x...) ;
24272286Sjkim#endif
25272286Sjkim
26272286Sjkim
27272286SjkimInodeJournal::InodeJournal(Inode* inode)
28272286Sjkim	:
29272286Sjkim	Journal(),
30272286Sjkim	fInode(inode)
31272286Sjkim{
32272286Sjkim	if (inode == NULL)
33272286Sjkim		fInitStatus = B_BAD_DATA;
34272286Sjkim	else {
35272286Sjkim		Volume* volume = inode->GetVolume();
36272286Sjkim
37272286Sjkim		fFilesystemVolume = volume;
38272286Sjkim		fFilesystemBlockCache = volume->BlockCache();
39272286Sjkim		fJournalVolume = volume;
40272286Sjkim		fJournalBlockCache = volume->BlockCache();
41272286Sjkim
42272286Sjkim		if (!inode->IsFileCacheDisabled())
43272286Sjkim			fInitStatus = inode->DisableFileCache();
44272444Sjkim		else
45272444Sjkim			fInitStatus = B_OK;
46272444Sjkim
47272444Sjkim		if (fInitStatus == B_OK) {
48272286Sjkim			TRACE("InodeJournal::InodeJournal(): Inode's file cache disabled "
49272444Sjkim				"successfully\n");
50272444Sjkim			HashRevokeManager* revokeManager = new(std::nothrow)
51272444Sjkim				HashRevokeManager;
52272444Sjkim			TRACE("InodeJournal::InodeJournal(): Allocated a hash revoke "
53272286Sjkim				"manager at %p\n", revokeManager);
54272286Sjkim
55272286Sjkim			if (revokeManager == NULL) {
56272286Sjkim				TRACE("InodeJournal::InodeJournal(): Insufficient memory to "
57272286Sjkim					"create the hash revoke manager\n");
58272286Sjkim				fInitStatus = B_NO_MEMORY;
59272286Sjkim			} else {
60272286Sjkim				fInitStatus = revokeManager->Init();
61272286Sjkim
62272286Sjkim				if (fInitStatus == B_OK) {
63272286Sjkim					fRevokeManager = revokeManager;
64272286Sjkim					fInitStatus = _LoadSuperBlock();
65272286Sjkim				} else
66272286Sjkim					delete revokeManager;
67272286Sjkim			}
68272286Sjkim		}
69272286Sjkim	}
70272286Sjkim}
71272286Sjkim
72272286Sjkim
73272286SjkimInodeJournal::~InodeJournal()
74272286Sjkim{
75272286Sjkim}
76272286Sjkim
77272286Sjkim
78272286Sjkimstatus_t
79272286SjkimInodeJournal::InitCheck()
80272286Sjkim{
81272286Sjkim	if (fInitStatus != B_OK)
82272286Sjkim		TRACE("InodeJournal: Initialization error\n");
83272286Sjkim	return fInitStatus;
84272286Sjkim}
85272286Sjkim
86272286Sjkim
87272286Sjkimstatus_t
88272286SjkimInodeJournal::MapBlock(off_t logical, fsblock_t& physical)
89272286Sjkim{
90272286Sjkim	TRACE("InodeJournal::MapBlock()\n");
91272286Sjkim	return fInode->FindBlock(logical * fBlockSize, physical);
92272286Sjkim}
93272286Sjkim