2010年7月26日月曜日

Btrfsのsymlinkパス名は3917バイトが上限

前回のエントリの続き。fs/btrfs/inode.cを読むと、シンボリックリンクファイルのリンク先パス名もinline extentとして保存されることが分かる。そして次のようなチェックコードがある。


name_len = strlen(symname) + 1;
if (name_len > BTRFS_MAX_INLINE_DATA_SIZE(root))
return -ENAMETOOLONG;

なぜかパス名については、終端文字を含めて3917バイトまで格納できることになっている。実際に試してみると、リンク先のパス名が3916文字(+終端文字)のシンボリックリンクは問題なく作成できた。3917文字ではエラーになってリンクが作成できない。


        item 17 key (318 INODE_ITEM 0) itemoff 794 itemsize 160
inode generation 87 size 3916 block group 29360128 mode 120777 links 1
item 18 key (318 INODE_REF 256) itemoff 777 itemsize 17
inode ref index 31 namelen 7 name: symlink
item 19 key (318 XATTR_ITEM 3817753667) itemoff 699 itemsize 78
location key (0 UNKNOWN 0) type 8
namelen 16 datalen 32 name: security.selinux
leaf 29605888 items 1 free space 32 generation 88 owner 5
fs uuid f248dfb4-b961-411a-b8fd-4f7915f261cf
chunk uuid 2a415519-8ad9-4d1b-a6ec-c19cc6f89e96
item 0 key (318 EXTENT_DATA 0) itemoff 57 itemsize 3938
inline extent data size 3917 ram 3917 compress 0

どうもすっきりしないなぁ。ファイルサイズの場合との1バイトの違いは何なんだろうか。バグか?バグなのか? バグだとするとファイルサイズの方が間違いっぽいよね。


しかもよく見ると、3917バイトのinline extentがある場合でも「free space 32」という空き領域があるよ。本当に空き領域なんだったら、BTRFS_MAX_INLINE_DATA_SIZE(r)を+32すればきっちり使えそうだけど、よく分からん。

0 件のコメント: