⛏️ index : haiku.git

/*
 * Copyright 2002-2012, Axel DΓΆrfler, axeld@pinc-software.de.
 * Copyright 2012, Andreas Henriksson, sausageboy@gmail.com
 * This file may be used under the terms of the MIT License.
 */
#ifndef CHECK_VISITOR_H
#define CHECK_VISITOR_H


#include "system_dependencies.h"


#include "bfs_control.h"
#include "FileSystemVisitor.h"


class BlockAllocator;
class BPlusTree;
struct check_index;

typedef Stack<check_index*> IndexStack;


class CheckVisitor : public FileSystemVisitor {
public:
								CheckVisitor(Volume* volume);
	virtual						~CheckVisitor();

			check_control&		Control() { return control; }
			IndexStack&			Indices() { return indices; }
			uint32				Pass() { return control.pass; }

			status_t			StartBitmapPass();
			status_t			WriteBackCheckBitmap();
			status_t			StartIndexPass();
			status_t			StopChecking();

	virtual status_t			VisitDirectoryEntry(Inode* inode,
									Inode* parent, const char* treeName);
	virtual status_t			VisitInode(Inode* inode, const char* treeName);

	virtual status_t			OpenInodeFailed(status_t reason, ino_t id,
									Inode* parent, char* treeName,
									TreeIterator* iterator);
	virtual status_t			OpenBPlusTreeFailed(Inode* inode);
	virtual status_t			TreeIterationFailed(status_t reason,
									Inode* parent);

private:
			status_t			_RemoveInvalidNode(Inode* parent,
									BPlusTree* tree, Inode* inode,
									const char* name);

			bool				_ControlValid();
			bool				_CheckBitmapIsUsedAt(off_t block) const;
			void				_SetCheckBitmapAt(off_t block);
			status_t			_CheckInodeBlocks(Inode* inode,
									const char* name);
			status_t			_CheckAllocated(block_run run,
									const char* type);

			size_t				_BitmapSize() const;

			status_t			_PrepareIndices();
			void				_FreeIndices();
			status_t			_AddInodeToIndex(Inode* inode);

private:
			check_control		control;
			IndexStack			indices;

			uint32*				fCheckBitmap;
};


#endif	// CHECK_VISITOR_H