diff --git a/src/add-ons/kernel/file_systems/ext2/kernel_interface.cpp b/src/add-ons/kernel/file_systems/ext2/kernel_interface.cpp index b6773001b8..942cb5f754 100644 --- a/src/add-ons/kernel/file_systems/ext2/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/ext2/kernel_interface.cpp @@ -7,6 +7,7 @@ #include #include +#include #include #include @@ -574,6 +575,33 @@ ext2_ioctl(fs_volume* _volume, fs_vnode* _node, void* _cookie, uint32 cmd, return B_OK; } + + case FIOSEEKDATA: + case FIOSEEKHOLE: + { + off_t* offset = (off_t*)buffer; + Inode* inode = (Inode*)_node->private_node; + + if (*offset >= inode->Size()) + return ENXIO; + + while (*offset < inode->Size()) { + fsblock_t block; + uint32 count = 1; + status_t status = inode->FindBlock(*offset, block, &count); + if (status != B_OK) + return status; + if ((block != 0 && cmd == FIOSEEKDATA) + || (block == 0 && cmd == FIOSEEKHOLE)) { + return B_OK; + } + *offset += count * volume->BlockSize(); + } + + if (*offset > inode->Size()) + *offset = inode->Size(); + return cmd == FIOSEEKDATA ? ENXIO : B_OK; + } } return B_DEV_INVALID_IOCTL;