Existe uma pergunta semelhante em SO . A resposta atualmente aceita por @ephemient sugere o uso de um ioctl chamado fiemap , documentado em linux/Documentation/filesystems/fiemap.txt . Citando esse arquivo:
The fiemap ioctl is an efficient method for userspace to get file extent mappings. Instead of block-by-block mapping (such as bmap), fiemap returns a list of extents.
Parece que esse é o tipo de informação que você está procurando. O suporte por sistemas de arquivos é novamente opcional:
File systems wishing to support fiemap must implement a
->fiemapcallback on theirinode_operationsstructure.
Suporte para os argumentos SEEK_DATA e SEEK_HOLE para lseek you mencionado do Solaris foi adicionado no Linux 3.1 de acordo com a página man , então você pode usar isso também. O fiemap ioctl parece ser mais antigo, por isso pode ser mais portátil em diferentes versões do Linux, enquanto o lseek pode ser mais portátil em sistemas operacionais se o Solaris tiver o mesmo.