Файловая система хранит, из каких блоков состоит файл, в его 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 с блоками по 4 КБ)
MaxFileSize(8, 2, 4)
// p = 2
// blocks = 2 + 2 + 4 + 8 = 16
// → 128
Краевые случаи: если blockSize <= 0 или ptrSize <= 0, верните 0. При direct = 0
прямых блоков нет, но косвенные всё равно учитываются.
Как inode ссылается на блоки данных, разобрано в главе
«Реализация файловой системы».