1 /* 2 * Copyright 2022, Raghav Sharma, raghavself28@gmail.com 3 * Distributed under the terms of the MIT License. 4 */ 5 #ifndef _XFS_VHEADER_H 6 #define _XFS_VHEADER_H 7 8 9 #include "BPlusTree.h" 10 #include "Checksum.h" 11 #include "Extent.h" 12 #include "Inode.h" 13 #include "LeafDirectory.h" 14 #include "Node.h" 15 #include "xfs_types.h" 16 #include "system_dependencies.h" 17 18 19 // Common template function to Verify all forms of header 20 template<class T> 21 bool VerifyHeader(T* header, char* buffer, Inode* inode, 22 int howManyBlocksFurther, ExtentMapEntry* map, int8 WhichDirectory) 23 { 24 if (header->Magic() != T::ExpectedMagic(WhichDirectory, inode)) { 25 ERROR("Bad magic number"); 26 return false; 27 } 28 29 if (inode->Version() == 1 || inode->Version() == 2) 30 return true; 31 32 if (!xfs_verify_cksum(buffer, inode->DirBlockSize(), T::CRCOffset())) { 33 ERROR("CRC is invalid"); 34 return false; 35 } 36 37 // For Block header we pass NULL 38 if(map != NULL) { 39 uint64 actualBlockToRead = inode->FileSystemBlockToAddr(map->br_startblock 40 + howManyBlocksFurther) / XFS_MIN_BLOCKSIZE; 41 42 if (actualBlockToRead != header->Blockno()) { 43 ERROR("Wrong Block number"); 44 return false; 45 } 46 } 47 48 if (!inode->GetVolume()->UuidEquals(header->Uuid())) { 49 ERROR("UUID is incorrect"); 50 return false; 51 } 52 53 if (inode->ID() != header->Owner()) { 54 ERROR("Wrong data owner"); 55 return false; 56 } 57 58 return true; 59 } 60 61 #endif