From aeb099b317eda4eb3c4b3318222e0a7d3ed2867f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Tue, 20 Oct 2009 00:23:53 +0000 Subject: [PATCH] * Added a very simple way to fragment your disk. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33674 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../file_systems/bfs/BlockAllocator.cpp | 31 +++++++++++++++++++ .../kernel/file_systems/bfs/BlockAllocator.h | 4 +++ .../file_systems/bfs/kernel_interface.cpp | 10 ++++++ 3 files changed, 45 insertions(+) diff --git a/src/add-ons/kernel/file_systems/bfs/BlockAllocator.cpp b/src/add-ons/kernel/file_systems/bfs/BlockAllocator.cpp index 54560b6759..552a884fc6 100644 --- a/src/add-ons/kernel/file_systems/bfs/BlockAllocator.cpp +++ b/src/add-ons/kernel/file_systems/bfs/BlockAllocator.cpp @@ -1062,6 +1062,37 @@ BlockAllocator::BitmapSize() const } +#ifdef DEBUG_FRAGMENTER +void +BlockAllocator::Fragment() +{ + AllocationBlock cached(fVolume); + MutexLocker lock(fLock); + + // only leave 4 block holes + static const uint32 kMask = 0x0f0f0f0f; + uint32 valuesPerBlock = fVolume->BlockSize() / 4; + + for (int32 i = 0; i < fNumGroups; i++) { + AllocationGroup& group = fGroups[i]; + + for (uint32 block = 0; block < group.NumBlocks(); block++) { + Transaction transaction(fVolume, 0); + + if (cached.SetToWritable(transaction, group, block) != B_OK) + return; + + for (int32 index = 0; index < valuesPerBlock; index++) { + cached.Block(index) |= HOST_ENDIAN_TO_BFS_INT32(kMask); + } + + transaction.Done(); + } + } +} +#endif // DEBUG_FRAGMENTER + + #ifdef DEBUG_ALLOCATION_GROUPS void BlockAllocator::_CheckGroup(int32 groupIndex) const diff --git a/src/add-ons/kernel/file_systems/bfs/BlockAllocator.h b/src/add-ons/kernel/file_systems/bfs/BlockAllocator.h index 383df9e068..17a79b69e5 100644 --- a/src/add-ons/kernel/file_systems/bfs/BlockAllocator.h +++ b/src/add-ons/kernel/file_systems/bfs/BlockAllocator.h @@ -21,6 +21,7 @@ struct check_cookie; //#define DEBUG_ALLOCATION_GROUPS +//#define DEBUG_FRAGMENTER class BlockAllocator { @@ -63,6 +64,9 @@ public: #ifdef BFS_DEBUGGER_COMMANDS void Dump(int32 index); #endif +#ifdef DEBUG_FRAGMENTER + void Fragment(); +#endif private: status_t _RemoveInvalidNode(Inode* parent, BPlusTree* tree, diff --git a/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp b/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp index 1221d83e64..20bd6ccb83 100644 --- a/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp @@ -682,6 +682,16 @@ bfs_ioctl(fs_volume* _volume, fs_vnode* _node, void* _cookie, ulong cmd, return volume->WriteSuperBlock(); } + +#ifdef DEBUG_FRAGMENTER + case 56741: + { + BlockAllocator& allocator = volume->Allocator(); + allocator.Fragment(); + return B_OK; + } +#endif + #ifdef DEBUG case 56742: {