_____ _ _ _____ _____ _____ _ | ___| \_/ |_ _|___ \ |_ _| | | | |___ \ / | | __) | | | _____ ___ ___| |_____ | ___| | | | | / ___/ | | | _ \/ _ \/ _ | __ \ | |___ / _ \ | | / /___ _| |_| | | | (_) | (_| | ___/ |_____|_/ \_| |_| |_____| |_____|_| |_|\___/\_____|_____| Reference (All these are absolute block numbers): [P] Direct pointer [S] Single indirect [D] Double indirect [T] Triple indirect Amount of block pointers (32 bit numbers) per block: bn_per_block = block_size / sizeof(uint32_t) fs_file fields: single_index (0 means there is no single indirect block loaded) double_index (0 means there is no double indirect block loaded) There is no triple_index because there is only one Inode block fields: [P] block_index = 0 [P] block_index = 1 [P] block_index = 2 [P] block_index = 3 [P] block_index = 4 [P] block_index = 5 [P] block_index = 6 [P] block_index = 7 [P] block_index = 8 [P] block_index = 9 [P] block_index = 10 [P] block_index = 11 [S] single_index = 1 -------> [P] block_index = 12 [D] double_index = 1 ---. [P] block_index = 13 [T] (Only one) ----. | [P] block_index = 14 | | [P] block_index = 15 .---------------' | ... | | [P] block_index = 12 + bn_per_block - 1 | .-----------------' | | | | .- This is why is doubly_indirect[single_index - 2] | | | in ext2_seek | | | | | v | '-> [S] single_index = 2 --> [P] block_index = (12 + bn_per_block) | [S] single_index = 3 [P] block_index = (12 + bn_per_block) + 1 | [S] single_index = 4 [P] block_index = (12 + bn_per_block) + 2 | [S] single_index = 5 ... | [S] single_index = 6 [P] block_index = 12 + (2 * bn_per_block) - 1 | ... | [S] single_index = 1 + bn_per_block | | | .- This is why is triply_indirect[double_index - 2] | | in ext2_seek | | | v '-> [D] double_index = 2 --> [S] single_index = (1 + bn_per_block) + 1 ----. [D] double_index = 3 [S] single_index = (1 + bn_per_block) + 2 | [D] double_index = 4 ... | [D] double_index = 5 [S] single_index = 1 + (2 * bn_per_block) + 1 | ... | [D] double_index = 1 + bn_per_block | | .--------------------------------------------------------------------------' | '-> [P] block_index = 12 + bn_per_block + bn_per_block * bn_per_block [P] block_index = 12 + bn_per_block + bn_per_block * bn_per_block + 1 [P] block_index = 12 + bn_per_block + bn_per_block * bn_per_block + 2 ... [P] block_index = 12 + 2 * bn_per_block + bn_per_block * bn_per_block - 1