Файловая система хранит, из каких блоков состоит файл, в его inode. У классического
inode есть несколько прямых указателей (каждый ссылается на один блок данных) плюс
один single-indirect, один double-indirect и один triple-indirect указатель.
Косвенные указатели ссылаются не на данные, а на блок, целиком заполненный другими
указателями. В один блок помещается ptrsPerBlock = blockSize / ptrSize указателей.
- single-indirect: блок указателей →
p блоков данных;
- double-indirect: блок указателей →
p блоков указателей → p*p блоков данных;
- triple-indirect: ещё на уровень глубже →
p*p*p блоков данных.
Реализуй функцию, которая считает максимальный размер файла в байтах:
func MaxFileSize(blockSize, direct, ptrSize int) int
blockSize — размер блока в байтах;
direct — число прямых указателей в inode;
ptrSize — размер одного указателя в байтах.
Считай, что blockSize кратен ptrSize, а ptrSize >= 1. Ёмкость файла в блоках:
p = blockSize / ptrSize
blocks = direct + p + p*p + p*p*p
размер = blocks * blockSize (в байтах)
Примеры:
MaxFileSize(4096, 12, 4)
// p = 1024
// blocks = 12 + 1024 + 1048576 + 1073741824 = 1074791436
// → 4402345721856 (≈ 4 ТБ — классическое число ext2)
MaxFileSize(8, 2, 4)
// p = 2
// blocks = 2 + 2 + 4 + 8 = 16
// → 128
Краевые случаи: если blockSize <= 0 или ptrSize <= 0, верни 0. При direct = 0
прямых блоков нет, но косвенные всё равно учитываются.
Как inode ссылается на блоки данных — разбирается в главе
«Реализация файловой системы».