| 496 | } |
| 497 | |
| 498 | int Ext2Volume::FreeBlock(uint32_t block){ |
| 499 | if(block > super.blockCount) return -1; |
| 500 | |
| 501 | ext2_blockgrp_desc_t& group = blockGroups[block / super.blocksPerGroup]; |
| 502 | |
| 503 | uint8_t bitmap[blocksize / sizeof(uint8_t)]; |
| 504 | |
| 505 | if(uint8_t* cachedBitmap = bitmapCache.get(group.blockBitmap)){ |
| 506 | memcpy(bitmap, cachedBitmap, blocksize); |
| 507 | } else { |
| 508 | if(int e = ReadBlock(group.blockBitmap, bitmap)){ |
| 509 | Log::Error("[Ext2] Disk error (%d) reading block bitmap (group %d)", e, block / super.blocksPerGroup); |
| 510 | error = DiskReadError; |
| 511 | return -1; |
| 512 | } |
| 513 | } |
| 514 | |
| 515 | int bmapIndex = (block % super.blocksPerGroup) / (sizeof(uint8_t) * 8); |
| 516 | int bitmask = ~(1 << (block % 8)); |
| 517 | bitmap[bmapIndex] &= bitmask; |
| 518 | |
| 519 | if(uint8_t* cachedBitmap = bitmapCache.get(group.blockBitmap)){ |
| 520 | memcpy(cachedBitmap, bitmap, blocksize); |
| 521 | } |
| 522 | |
| 523 | if(int e = WriteBlock(group.blockBitmap, bitmap)){ |
| 524 | Log::Error("[Ext2] Disk error (%d) write block bitmap (group %d)", e, block / super.blocksPerGroup); |
| 525 | error = DiskWriteError; |
| 526 | return -1; |
| 527 | } |
| 528 | |
| 529 | super.freeBlockCount++; |
| 530 | blockGroups[block / super.blocksPerGroup].freeBlockCount++; |
| 531 | |
| 532 | WriteBlockGroupDescriptor(block / super.blocksPerGroup); |
| 533 | WriteSuperblock(); |
| 534 | |
| 535 | return 0; |
| 536 | } |
| 537 | |
| 538 | Ext2Node* Ext2Volume::CreateNode(){ |
| 539 | for(unsigned i = 0; i < blockGroupCount; i++){ |