ext3のファイル最大長2
Rev.1を表示中。最新版はこちら。
ext3のファイル最大長の実装をふまえて、実際の最大サイズを計算してみました。ブロックが1K=2^10、2K=2^1×2^10、4K=2^2×2^10で、ビットシフトは10、11、12となります。#include <stdio.h> #include <stdlib.h> typedef unsigned long long u64; typedef long long l64; #define EXT3_NDIR_BLOCKS 12 void get_size(int bits); void get_limit(int bits); void main() { printf("limit size\n"); get_limit(10); get_limit(11); get_limit(12); putchar('\n'); printf("slot size\n"); get_size(10); get_size(11); get_size(12); } void get_size(int bits) { u64 res = EXT3_NDIR_BLOCKS; res += 1LL << (bits-2); res += 1LL << (2*(bits-2)); res += 1LL << (3*(bits-2)); res <<= bits; printf("%llu\n", res); } void get_limit(int bits) { u64 meta_blocks; u64 upper_limit; meta_blocks = 1; meta_blocks += 1 + (1LL << (bits-2)); meta_blocks += 1 + (1LL << (bits-2)) + (1LL << (2*(bits-2))); upper_limit = (1LL << 32) - 1; upper_limit >>= (bits - 9); upper_limit -= meta_blocks; upper_limit <<= bits; printf("%llu\n", upper_limit); }
[root@localhost test]# ./a.out limit size 2198955618304 2198484279296 2194719883264 slot size 17247252480 275415851008 4402345721856最大サイズは、limit sizeを超えないslot sizeということで以下のようになります。
ブロックサイズが1Kの時、 17247252480(slot size)
ブロックサイズが2Kの時、 275415851008(slot size)
ブロックサイズが4Kの時、2194719883264(limit size)
[root@localhost test]# 10to2 17247252480 0000-0000000000-0000000000-0000010000-0001000000-0100001100-0000000000 16G 64M 268K [root@localhost test]# 10to2 275415851008 0000-0000000000-0000000000-0100000000-1000000001-0000011000-0000000000 256G 513M 16K [root@localhost test]# 10to2 2194719883264 0000-0000000000-0000000001-1111111011-1111110111-1111110000-0000000000 1T 1019G 1015M 1008K資料等には、16G/256G/2Tとされていますが、厳密にいうと上記サイズ正しいところです。