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