確認にはColin King氏のfiemap.cを使わせてもらった。
1. ftruncate(fd, size)
sparseファイルができるだけ。データブロックの確保はされず
2. pwrite(fd, "", 1, size-1);
samba hack! sambaがファイルを書き込む際、領域予約するのにつかってる?でもNFSしか効果ないぽい?
ext2ではsparseファイルで最後のブロックが確保されるだけ。
3. b = malloc(size); pwrite(fd, b, size, 0);
データブロック確保されてる!でもなんかmallocが邪魔。
4. fallocate(fd, 0, 0, size);
データブロック確保されてるしmalloc排除できた...! でもext4じゃないと動かない
5. posix_fallocate(fd, 0, size);
せいかい。なければ3にfallbackする方針で。
追記:straceみてる限りファイルシステムのサポートがない場合は2にfallbackしてるみたい?