CHUNK = 128*512 LV_START = 5120000*512 BSIZE = 4096 found_byte = 47323856896 block_num = (found_byte - LV_START) // BSIZE print(f'Found at md0 byte: {found_byte}') print(f'LV_START: {LV_START}') print(f'Offset from LV: {found_byte - LV_START}') print(f'Block number: {block_num}') virt = block_num * BSIZE group = virt // (5*CHUNK) in_group = virt % (5*CHUNK) chunk_idx = in_group // CHUNK intra = in_group % CHUNK print(f'chunk_group={group} chunk_idx={chunk_idx} intra={intra}') print() # The block was found at chunk_idx=4 but IS readable # This means our assumption that chunk_idx=4 = unreadable is WRONG # The data IS there, we just need to read it # Our current translation SKIPS chunk_idx=4 # But the data exists at: LV_START + group*5*CHUNK + 4*CHUNK + intra # We've been computing: LV_START + group*4*CHUNK + chunk_idx*CHUNK + intra # For chunk_idx < 4 these are equivalent # For chunk_idx = 4 we skip it entirely # So the fix is: for chunk_idx=4, read from the 5th physical chunk # phys = LV_START + group*5*CHUNK + 4*CHUNK + intra phys_5chunk = LV_START + group*5*CHUNK + 4*CHUNK + intra print(f'Physical via 5-chunk formula: {phys_5chunk}') print(f'Found at: {found_byte}') print(f'Match: {phys_5chunk == found_byte}')