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

Method FreeBlock

Kernel/src/fs/ext2.cpp:498–536  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

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++){

Callers

nothing calls this directly

Calls 3

memcpyFunction · 0.85
ErrorFunction · 0.85
getMethod · 0.45

Tested by

no test coverage detected