Есть такой ioctl, называется FIEMAP. Он служит для той же цели, что и FIBMAP - узнать, где на диске расположен файл. Основное отличие - FIEMAP сообщает не о блоках, а об экстентах файла, причём сразу о нескольких за раз. На файловых системах, поддерживающих FIEMAP, такие программы, как filefrag (сообщает о количестве фрагментов файла), отрабатывают на два порядка быстрее (меньше накладные расходы) и требует только право открыть файл, а не прав root'а, как для FIBMAP.
К сожалению, не все ФС поддерживают FIEMAP, и среди них reiserfs. Так получилось, что у меня на компьютере она используются, и для неё мне очень хочется иметь этот самый FIEMAP. К счастью, есть обобщенная функция, которая позволяет добавить этот FIEMAP с минимальными усилиями, ей только надо передать ссылку на get_block конкретной ФС.
Тут я наконец подхожу к своему вопросу. Так уж получилось, что reiserfs_get_block отдаёт/распределяет только один блок за раз. И это приводит к тому, что даже если файл лежит на диске одним сплошным куском, FIEMAP выдаёт столько экстентов, сколько блоков в файле, и это смущает утилиту filefrag, которая в обычном режиме просто печатает число экстентов, которые возвратил вызов FIEMAP. Очевидно это не совсем то, что можно было бы ожидать. Если попросить filefrag быть более подробной, она начинает замечать, что экстенты лежат рядом, обсчитывает всё более корректно и выдаёт то, что я от неё жду.
И вот вопрос: где надо чинить - в ядре или в filefrag? Ядро должно сливать соседствующие экстенты в один или этим должны заниматься прикладные программы?