1/*
2 * Copyright 2001-2013, Axel D��rfler, axeld@pinc-software.de.
3 * This file may be used under the terms of the MIT License.
4 */
5#ifndef BLOCK_ALLOCATOR_H
6#define BLOCK_ALLOCATOR_H
7
8
9#include "system_dependencies.h"
10
11
12class AllocationGroup;
13class Inode;
14class Transaction;
15class Volume;
16struct disk_super_block;
17struct block_run;
18
19
20//#define DEBUG_ALLOCATION_GROUPS
21//#define DEBUG_FRAGMENTER
22
23
24class BlockAllocator {
25public:
26							BlockAllocator(Volume* volume);
27							~BlockAllocator();
28
29			status_t		Initialize(bool full = true);
30			status_t		InitializeAndClearBitmap(Transaction& transaction);
31
32			void			Uninitialize();
33
34			status_t		AllocateForInode(Transaction& transaction,
35								const block_run* parent, mode_t type,
36								block_run& run);
37			status_t		Allocate(Transaction& transaction, Inode* inode,
38								off_t numBlocks, block_run& run,
39								uint16 minimum = 1);
40			status_t		Free(Transaction& transaction, block_run run);
41
42			status_t		AllocateBlocks(Transaction& transaction,
43								int32 group, uint16 start, uint16 numBlocks,
44								uint16 minimum, block_run& run);
45
46			status_t		Trim(uint64 offset, uint64 size,
47								uint64& trimmedSize);
48
49			status_t		CheckBlocks(off_t start, off_t length,
50								bool allocated = true,
51								off_t* firstError = NULL);
52			status_t		CheckBlockRun(block_run run,
53								const char* type = NULL,
54								bool allocated = true);
55			bool			IsValidBlockRun(block_run run,
56								const char* type = NULL);
57
58			recursive_lock&	Lock() { return fLock; }
59
60#ifdef BFS_DEBUGGER_COMMANDS
61			void			Dump(int32 index);
62#endif
63#ifdef DEBUG_FRAGMENTER
64			void			Fragment();
65#endif
66
67private:
68#ifdef DEBUG_ALLOCATION_GROUPS
69			void			_CheckGroup(int32 group) const;
70#endif
71			bool			_AddTrim(fs_trim_data& trimData, uint32 maxRanges,
72								uint64 offset, uint64 size);
73			status_t		_TrimNext(fs_trim_data& trimData, uint32 maxRanges,
74								uint64 offset, uint64 size, bool force,
75								uint64& trimmedSize);
76
77	static	status_t		_Initialize(BlockAllocator* self);
78
79private:
80			Volume*			fVolume;
81			recursive_lock	fLock;
82			AllocationGroup* fGroups;
83			int32			fNumGroups;
84			uint32			fBlocksPerGroup;
85			uint32			fNumBlocks;
86};
87
88#ifdef BFS_DEBUGGER_COMMANDS
89#if BFS_TRACING
90int dump_block_allocator_blocks(int argc, char** argv);
91#endif
92int dump_block_allocator(int argc, char** argv);
93#endif
94
95#endif	// BLOCK_ALLOCATOR_H
96