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

Method Ext2Volume

Kernel/src/fs/ext2.cpp:33–115  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

31 }
32
33 Ext2Volume::Ext2Volume(PartitionDevice* part, const char* name){
34 this->part = part;
35
36 if(part->ReadBlock(EXT2_SUPERBLOCK_LOCATION / part->parentDisk->blocksize, sizeof(ext2_superblock_t), &super)){
37 Log::Error("[Ext2] Disk Error Initializing Volume");
38 error = DiskReadError;
39 return; // Disk Error
40 }
41
42 if(super.revLevel){ // If revision level >= 0 grab the extended superblock as well
43 if(part->ReadBlock(EXT2_SUPERBLOCK_LOCATION / part->parentDisk->blocksize, sizeof(ext2_superblock_t) + sizeof(ext2_superblock_extended_t), &super)){
44 Log::Error("[Ext2] Disk Error Initializing Volume");
45 error = DiskReadError;
46 return; // Disk Error
47 }
48
49 if((superext.featuresIncompat & (~EXT2_INCOMPAT_FEATURE_SUPPORT)) != 0 || (superext.featuresRoCompat & (~EXT2_READONLY_FEATURE_SUPPORT)) != 0){ // Check support for incompatible/read-only compatible features
50 Log::Error("[Ext2] Incompatible Ext2 features present (Incompt: %x, Read-only Compt: %x). Will not mount volume.", superext.featuresIncompat, superext.featuresRoCompat);
51 error = IncompatibleError;
52 return;
53 }
54
55 if(superext.featuresIncompat & IncompatibleFeatures::Filetype) filetype = true;
56 else filetype = false;
57
58 if(superext.featuresRoCompat & ReadonlyFeatures::LargeFiles) largeFiles = true;
59 else largeFiles = false;
60
61 if(superext.featuresRoCompat & ReadonlyFeatures::Sparse) sparse = true;
62 else sparse = false;
63 } else {
64 memset(&superext, 0, sizeof(ext2_superblock_extended_t));
65 }
66
67 blockGroupCount = (super.blockCount % super.blocksPerGroup) ? (super.blockCount / super.blocksPerGroup + 1) : (super.blockCount / super.blocksPerGroup); // Round up
68 uint32_t secondBlockGroupCount = (super.inodeCount % super.inodesPerGroup) ? (super.inodeCount / super.inodesPerGroup + 1) : (super.inodeCount / super.inodesPerGroup); // Round up
69
70 if(blockGroupCount != secondBlockGroupCount){
71 Log::Error("[Ext2] Block group count mismatch.");
72 error = MiscError;
73 return;
74 }
75
76 blocksize = 1024U << super.logBlockSize;
77 superBlockIndex = LocationToBlock(EXT2_SUPERBLOCK_LOCATION);
78
79 if(super.revLevel){
80 inodeSize = superext.inodeSize;
81 } else {
82 inodeSize = 128;
83 }
84
85 Log::Info("[Ext2] Initializing Volume\tRevision: %d, Block Size: %d, %d KB/%d KB used, Last mounted on: %s", super.revLevel, blocksize, super.freeBlockCount * blocksize / 1024, super.blockCount * blocksize / 1024, superext.lastMounted);
86
87 if(debugLevelExt2 >= DebugLevelNormal){
88 Log::Info("[Ext2] Block Group Count: %d, Inodes Per Block Group: %d, Inode Size: %d", blockGroupCount, super.inodesPerGroup, inodeSize);
89 Log::Info("[Ext2] Sparse Superblock? %s Large Files? %s, Filetype Extension? %s", (sparse ? "Yes" : "No"), (largeFiles ? "Yes" : "No"), (filetype ? "Yes" : "No"));
90 }

Callers

nothing calls this directly

Calls 6

ErrorFunction · 0.85
memsetFunction · 0.85
InfoFunction · 0.85
kmallocFunction · 0.85
strcpyFunction · 0.85
ReadBlockMethod · 0.45

Tested by

no test coverage detected