⛏️ index : haiku.git

/*
 * Copyright 2001-2010, Haiku Inc. All rights reserved.
 * This file may be used under the terms of the MIT License.
 *
 * Authors:
 *		Janito V. Ferreira Filho
 */
#ifndef INODEALLOCATOR_H
#define INODEALLOCATOR_H

#include <lock.h>

#include "ext2.h"
#include "Transaction.h"


class Inode;
class Volume;


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

	virtual	status_t	New(Transaction& transaction, Inode* parent,
							int32 mode, ino_t& id);
	virtual	status_t	Free(Transaction& transaction, ino_t id,
							bool isDirectory);

private:
			status_t	_Allocate(Transaction& transaction,
							uint32 preferredBlockGroup, bool isDirectory,
							ino_t& id);
			status_t	_AllocateInGroup(Transaction& transaction,
							uint32 blockGroup, bool isDirectory,
							ino_t& id, uint32 numInodes);
			status_t	_MarkInBitmap(Transaction& transaction,
							fsblock_t bitmapBlock, uint32 blockGroup,
							uint32 numInodes, uint32& pos, uint32& checksum);
			status_t	_UnmarkInBitmap(Transaction& transaction,
							fsblock_t bitmapBlock, uint32 numInodes, ino_t id,
							uint32& checksum);
			status_t	_InitGroup(Transaction& transaction,
							ext2_block_group* group, fsblock_t bitmapBlock,
							uint32 numInodes);
			void		_SetInodeBitmapChecksum(ext2_block_group* group,
							uint32 checksum);

			Volume*		fVolume;
			mutex		fLock;
};

#endif	// INODEALLOCATOR_H