MCPcopy Create free account
hub / github.com/LemonOSProject/LemonOS / EraseInode

Method EraseInode

Kernel/src/fs/ext2.cpp:612–689  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

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));

Callers

nothing calls this directly

Calls 5

WarningFunction · 0.85
ErrorFunction · 0.85
memcpyFunction · 0.85
getMethod · 0.45
removeMethod · 0.45

Tested by

no test coverage detected