[haiku-commits] haiku: hrev54714 - src/add-ons/kernel/file_systems/ext2

  • From: Jérôme Duval <jerome.duval@xxxxxxxxx>
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Mon, 16 Nov 2020 05:22:11 -0500 (EST)

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;


Other related posts:

  • » [haiku-commits] haiku: hrev54714 - src/add-ons/kernel/file_systems/ext2 - Jérôme Duval