| 610 | } |
| 611 | |
| 612 | int Ext2Volume::EraseInode(ext2_inode_t& e2inode, uint32_t inode){ |
| 613 | if(inode > super.inodeCount) return -1; |
| 614 | |
| 615 | if(e2inode.linkCount > 0){ |
| 616 | Log::Warning("[Ext2] EraseInode: inode %d contains %d links! Will not erase.", inode, e2inode.linkCount); |
| 617 | return -2; |
| 618 | } |
| 619 | |
| 620 | for(unsigned i = 0; i < e2inode.blockCount * (blocksize / 512); i++){ |
| 621 | uint32_t block = GetInodeBlock(i, e2inode); |
| 622 | FreeBlock(block); |
| 623 | if(blockCache.get(block)){ |
| 624 | blockCache.remove(block); |
| 625 | } |
| 626 | } |
| 627 | |
| 628 | if(e2inode.blocks[EXT2_SINGLY_INDIRECT_INDEX]){ |
| 629 | FreeBlock(e2inode.blocks[EXT2_SINGLY_INDIRECT_INDEX]); |
| 630 | if(e2inode.blocks[EXT2_DOUBLY_INDIRECT_INDEX]){ |
| 631 | uint32_t blockPointers[blocksize / sizeof(uint32_t)]; |
| 632 | |
| 633 | if(int e = ReadBlockCached(e2inode.blocks[EXT2_DOUBLY_INDIRECT_INDEX], blockPointers)){ |
| 634 | (void)e; |
| 635 | error = DiskReadError; |
| 636 | return 0; |
| 637 | } |
| 638 | |
| 639 | for(unsigned i = 0; i < (blocksize / sizeof(uint32_t)) && blockPointers[i] != 0; i++){ |
| 640 | FreeBlock(blockPointers[i]); |
| 641 | if(blockCache.get(blockPointers[i])){ |
| 642 | blockCache.remove(blockPointers[i]); |
| 643 | } |
| 644 | } |
| 645 | |
| 646 | FreeBlock(e2inode.blocks[EXT2_DOUBLY_INDIRECT_INDEX]); |
| 647 | |
| 648 | if(e2inode.blocks[EXT2_TRIPLY_INDIRECT_INDEX]){ |
| 649 | Log::Error("[Ext2] We do not support triply indirect blocks, will not free them."); |
| 650 | } |
| 651 | } |
| 652 | } |
| 653 | |
| 654 | ext2_blockgrp_desc_t& group = blockGroups[inode / super.inodesPerGroup]; |
| 655 | |
| 656 | uint8_t bitmap[blocksize / sizeof(uint8_t)]; |
| 657 | |
| 658 | if(uint8_t* cachedBitmap = bitmapCache.get(group.inodeBitmap)){ |
| 659 | memcpy(bitmap, cachedBitmap, blocksize); |
| 660 | } else { |
| 661 | if(int e = ReadBlock(group.inodeBitmap, bitmap)){ |
| 662 | Log::Error("[Ext2] Disk error (%d) reading inode bitmap (group %d)", e, inode / super.inodesPerGroup); |
| 663 | error = DiskReadError; |
| 664 | return -1; |
| 665 | } |
| 666 | } |
| 667 | |
| 668 | int bmapIndex = (inode % super.inodesPerGroup) / (sizeof(uint8_t) * 8); |
| 669 | int bitmask = ~(1 << (inode % 8)); |