From 602051e8eb17ee5fdc54324a1a22f25e947105d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Mon, 9 Nov 2020 11:36:30 +0100 Subject: [PATCH] ext2: implement FIOSEEKDATA and FIOSEEKHOLE ioctl commands Change-Id: I5f267620e904fe7bb294a4864a8ed017d27a7e68 Reviewed-on: https://review.haiku-os.org/c/haiku/+/3387 Reviewed-by: Adrien Destugues --- .../file_systems/ext2/kernel_interface.cpp | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) 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;