2010年7月23日金曜日

Btrfsでinline extentが使われる上限サイズは3916バイト

日経Linux 2010年9月号に掲載する「Linuxカーネルの新機能」で必要になったので、Btrfsでinline extentが使われる上限ファイルサイズを調べてみた。まずソースを見ると、fs/btrfs/ctree.cで次のようなマクロが定義してあるのが分かる(ソースはカーネル2.6.34のものを参照)。


#define BTRFS_MAX_INLINE_DATA_SIZE(r) (BTRFS_LEAF_DATA_SIZE(r) - \
sizeof(struct btrfs_item) - \
sizeof(struct btrfs_file_extent_item))

このうちBTRFS_LEAF_DATA_SIZE(r)は「ブロックサイズ - btrfs_header構造体のサイズ」と同ファイルで定義してある。構造体のそれぞれのサイズは、btrfs_headerが101バイト、btrfs_itemが25バイト、btrfs_file_extent_itemが53バイトである。ブロックサイズが4096の場合は、計算するとBTRFS_MAX_INLINE_DATA_SIZE(r)は、3917バイトになる。


さらにfs/btrfs/inode.c内を調べると、「data_len >= BTRFS_MAX_INLINE_DATA_SIZE(root)」の際にinline extentの使用をやめるというコードがある。つまり、inline extentが使われるファイルサイズの上限は3916バイトになるはずだ。実際に3916バイトのファイルと3917バイトのファイルをBtrfs上に作成し、btrfs-debug-treeコマンドで調べてみても、3916バイトのファイルの方でだけinline extentが使われているのが分かる。というわけで、すっきりした。(追記)……と思ったのだが、別の問題があった。それについては次のエントリで。


leaf 30482432 items 1 free space 33 generation 64 owner 5
fs uuid f248dfb4-b961-411a-b8fd-4f7915f261cf
chunk uuid 2a415519-8ad9-4d1b-a6ec-c19cc6f89e96
item 0 key (288 EXTENT_DATA 0) itemoff 58 itemsize 3937
inline extent data size 3916 ram 3916 compress 0

leaf 30556160 items 7 free space 3259 generation 68 owner 5
fs uuid f248dfb4-b961-411a-b8fd-4f7915f261cf
chunk uuid 2a415519-8ad9-4d1b-a6ec-c19cc6f89e96
item 0 key (289 INODE_ITEM 0) itemoff 3835 itemsize 160
inode generation 64 size 3917 block group 29360128 mode 100644 links 1
item 1 key (289 INODE_REF 256) itemoff 3819 itemsize 16
inode ref index 17 namelen 6 name: test22
item 2 key (289 XATTR_ITEM 3817753667) itemoff 3741 itemsize 78
location key (0 UNKNOWN 0) type 8
namelen 16 datalen 32 name: security.selinux
item 3 key (289 EXTENT_DATA 0) itemoff 3688 itemsize 53
extent data disk byte 12615680 nr 4096
extent data offset 0 nr 4096 ram 4096
extent compression 0

0 件のコメント: