hrev54714 adds 1 changeset to branch 'master'
old head: dfb36b35b94318fa81319ce25a0b6288901b9b24
new head: 602051e8eb17ee5fdc54324a1a22f25e947105d8
overview:
https://git.haiku-os.org/haiku/log/?qt=range&q=602051e8eb17+%5Edfb36b35b943
----------------------------------------------------------------------------
602051e8eb17: ext2: implement FIOSEEKDATA and FIOSEEKHOLE ioctl commands
Change-Id: I5f267620e904fe7bb294a4864a8ed017d27a7e68
Reviewed-on: https://review.haiku-os.org/c/haiku/+/3387
Reviewed-by: Adrien Destugues <pulkomandy@xxxxxxxxx>
[ Jérôme Duval <jerome.duval@xxxxxxxxx> ]
----------------------------------------------------------------------------
Revision: hrev54714
Commit: 602051e8eb17ee5fdc54324a1a22f25e947105d8
URL: https://git.haiku-os.org/haiku/commit/?id=602051e8eb17
Author: Jérôme Duval <jerome.duval@xxxxxxxxx>
Date: Mon Nov 9 10:36:30 2020 UTC
----------------------------------------------------------------------------
1 file changed, 28 insertions(+)
.../file_systems/ext2/kernel_interface.cpp | 28 ++++++++++++++++++++
----------------------------------------------------------------------------
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 <algorithm>
#include <dirent.h>
+#include <sys/ioctl.h>
#include <util/kernel_cpp.h>
#include <string.h>
@@ -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;