ファイル最大長
Rev.1を表示中。最新版はこちら。
ファイル最大長は、ブロックサイズ/ブロックビット長で決定されファイルシステムに依存しますが、カーネルとしてサポートする最大長さを超えてはいけません。カーネルとしてサポートする最大長は以下の通りです。#define MAX_NON_LFS ((1UL<<31) - 1) typedef unsigned long long u64; #define PAGE_SHIFT 12 #define PAGE_SIZE (1 << PAGE_SHIFT) #define PAGE_CACHE_SIZE PAGE_SIZE #ifdef CONFIG_64BIT #define BITS_PER_LONG 64 #else #define BITS_PER_LONG 32 #endif /* CONFIG_64BIT */O_LARGEFILEでない時、
MAX_NON_LFS=((1UL<<31) - 1)=2^30x2^1 - 1 = 2G - 1O_LARGEFILEの時
・longが32ビットの時
MAX_NON_LFS= (((u64)PAGE_CACHE_SIZE << (BITS_PER_LONG-1))-1) = 2^12x2^31 - 1 = 2^40x2^3 - 1 = 8T - 1・longが64ビットの時
MAX_NON_LFS=(((u64)PAGE_CACHE_SIZE << (BITS_PER_LONG-1))-1) = 2^12x2^63 - 1 = 2^70x2^5 - 1 = 32Z - 1 ですが、32Z - 1は64ビットのサイズを超えてしまうので、64ビットの符号有りの最大値となり MAX_NON_LFS= 0x7fffffffffffffffUL = (((u64)1 << (BITS_PER_LONG-1))-1) = 2^63 - 1 = 2^60x2^3 - 1 = 8E - 1ファイルサイズはstruct super_blockのloff_t s_maxbytesに設定され、loff_tはlong long型で64ビット故、32ビット/64ビットに関係なく、O_LARGEFILE時も0x7fffffffffffffffULとしてもいいのではと。思ってしまいます。
ファイルの参照は、ファイルそのもの実装だけでなくキャッシュサイズにも影響されます。キャッシュを超えるファイルサイズを参照すると、意味もなくキャッシュ設定/破棄を繰り返すことになり、従ってファイルサイズはキャッシュサイズを超えないようになっています。
キャッシュサイズはpage->indexにf_posをpageサイズ毎の位置をインデックスとし、page->indexをradix treeのインデックスとしてに設定していきます。従ってpage->indexを超えるpageを設定することはできない故の設定となっています。
page->indexの型はunsigned longで、故32ビット時は、ファイルサイズは(((u64)PAGE_CACHE_SIZE << (BITS_PER_LONG-1))-1)で最大キャッシュサイズとなっているのではと思います。たぶん。
補足
単位は以下の通りです。2^10:K(キロ) 2^20:M(メガ) 2^30:G(ギガ) 2^40:T(テラ) 2^50:P(ペタ) 2^60:E(エクサ) 2^70:Z(ゼタ) 2^80:Y(ヨタ)