[haiku-commits] haiku: hrev54456 - src/add-ons/kernel/file_systems/ufs2

  • From: Adrien Destugues <pulkomandy@xxxxxxxxx>
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Wed, 22 Jul 2020 03:42:09 -0400 (EDT)

hrev54456 adds 1 changeset to branch 'master'
old head: f79386adb739142a42fe95fcda428c42878cd252
new head: 788899a8c2ecd992efec63d9b0e614a4f988db07
overview: 
https://git.haiku-os.org/haiku/log/?qt=range&q=788899a8c2ec+%5Ef79386adb739

----------------------------------------------------------------------------

788899a8c2ec: ufs2: All directories are read sucessfully.
  
  Change-Id: I87d3d77d48396ecd0e8fa649169f6e899d161f66
  Reviewed-on: https://review.haiku-os.org/c/haiku/+/3028
  Reviewed-by: Adrien Destugues <pulkomandy@xxxxxxxxx>

                                      [ Suhel Mehta <mehtasuhel@xxxxxxxxx> ]

----------------------------------------------------------------------------

Revision:    hrev54456
Commit:      788899a8c2ecd992efec63d9b0e614a4f988db07
URL:         https://git.haiku-os.org/haiku/commit/?id=788899a8c2ec
Author:      Suhel Mehta <mehtasuhel@xxxxxxxxx>
Date:        Sun Jul 12 18:48:29 2020 UTC
Committer:   Adrien Destugues <pulkomandy@xxxxxxxxx>
Commit-Date: Wed Jul 22 07:42:04 2020 UTC

----------------------------------------------------------------------------

2 files changed, 29 insertions(+), 62 deletions(-)
.../file_systems/ufs2/DirectoryIterator.cpp      | 86 ++++++--------------
.../kernel/file_systems/ufs2/DirectoryIterator.h |  5 +-

----------------------------------------------------------------------------

diff --git a/src/add-ons/kernel/file_systems/ufs2/DirectoryIterator.cpp 
b/src/add-ons/kernel/file_systems/ufs2/DirectoryIterator.cpp
index 36dd4d3d82..272be1ad8e 100644
--- a/src/add-ons/kernel/file_systems/ufs2/DirectoryIterator.cpp
+++ b/src/add-ons/kernel/file_systems/ufs2/DirectoryIterator.cpp
@@ -10,7 +10,7 @@
 
 #include "Inode.h"
 
-#define TRACE_UFS2
+//#define TRACE_UFS2
 #ifdef TRACE_UFS2
 #      define TRACE(x...) dprintf("\33[34mufs2:\33[0m " x)
 #else
@@ -24,12 +24,11 @@ DirectoryIterator::DirectoryIterator(Inode* inode)
        :
        fInode(inode)
 {
+       fOffset = fInode->GetBlockPointer() * MINBSIZE;
        TRACE("DirectoryIterator::DirectoryIterator() \n");
 }
 
 
-int DirectoryIterator::countDir = 0;
-
 DirectoryIterator::~DirectoryIterator()
 {
 }
@@ -45,86 +44,55 @@ DirectoryIterator::InitCheck()
 status_t
 DirectoryIterator::Lookup(const char* name, size_t length, ino_t* _id)
 {
-       int count = 0;
        if (strcmp(name, ".") == 0) {
                *_id = fInode->ID();
                return B_OK;
-       } else if (strcmp(name, "..") == 0) {
-               if (fInode->ID() == 1)
-                       *_id = fInode->ID();
+       }
 
-       /*      else
-                       *_id = fInode->Parent();*/
+       char getname[B_FILE_NAME_LENGTH];
 
+       status_t status;
+       while(true) {
+               status = GetNext(getname, &length, _id);
+               if (status != B_OK)
+                       return status;
+               if (strcmp(getname, name) == 0)
+                       return B_OK;
        }
-       while(_GetNext(name, &length, _id, count) != B_OK) {
-               count++;
-       }
-       return B_OK;
+
 }
 
 
 status_t
 DirectoryIterator::GetNext(char* name, size_t* _nameLength, ino_t* _id)
 {
-       TRACE("In GetNext function\n");
-       int64_t offset = fInode->GetBlockPointer() * MINBSIZE;
        dir direct;
-       dir_info direct_info;
        int fd = fInode->GetVolume()->Device();
-       if (read_pos(fd, offset, &direct_info,
-                               sizeof(dir_info)) != sizeof(dir_info)) {
-               return B_BAD_DATA;
-       }
 
-       offset = offset + sizeof(dir_info) + 16 * countDir;
-       if (read_pos(fd, offset, &direct, sizeof(dir)) != sizeof(dir)) {
+       if (read_pos(fd, fOffset, &direct, sizeof(dir)) != sizeof(dir)) {
                return B_BAD_DATA;
        }
 
-       if (direct.next_ino != 0) {
-       strlcpy(name, direct.name, sizeof(name));
-       *_id = direct.next_ino;
-       *_nameLength = direct.namlen;
-       countDir++;
-       return B_OK;
+       int remainder = direct.namlen % 4;
+       if(remainder != 0) {
+               remainder = 4 - remainder;
+               remainder = direct.namlen + remainder;
+       } else {
+               remainder = direct.namlen + 4;
        }
-       countDir = 0;
-       return B_ENTRY_NOT_FOUND;
-}
 
+       fOffset = fOffset + 8 + remainder;
 
-status_t
-DirectoryIterator::_GetNext(const char* name, size_t* _nameLength,
-                                               ino_t* _id, int count)
-{
-       TRACE("In GetNext function\n");
-       int64_t offset = fInode->GetBlockPointer() * MINBSIZE;
-       dir direct;
-       dir_info direct_info;
-       int fd = fInode->GetVolume()->Device();
-       if (read_pos(fd, offset, &direct_info,
-                               sizeof(dir_info)) != sizeof(dir_info)) {
-               return B_BAD_DATA;
-       }
-       if(strcmp(name, "..") == 0)
-       {
-               *_id = direct_info.dotdot_ino;
-               return B_OK;
-       }
-
-       offset = offset + sizeof(dir_info) + (16 * count);
-       if (read_pos(fd, offset, &direct, sizeof(dir)) != sizeof(dir)) {
-               return B_BAD_DATA;
-       }
+       if (direct.next_ino > 0) {
+               TRACE("direct.next_ino %d\n",direct.next_ino);
 
-       char getname;
-       strlcpy(&getname, direct.name, sizeof(name));
-       if(strcmp(name, &getname) == 0) {
+               strlcpy(name, direct.name, remainder);
                *_id = direct.next_ino;
+               *_nameLength = direct.namlen;
                return B_OK;
        }
-       else {
+
        return B_ENTRY_NOT_FOUND;
-       }
+
 }
+
diff --git a/src/add-ons/kernel/file_systems/ufs2/DirectoryIterator.h 
b/src/add-ons/kernel/file_systems/ufs2/DirectoryIterator.h
index 5da9f9fa0c..72fe3a744c 100644
--- a/src/add-ons/kernel/file_systems/ufs2/DirectoryIterator.h
+++ b/src/add-ons/kernel/file_systems/ufs2/DirectoryIterator.h
@@ -47,13 +47,12 @@ public:
                        status_t                        GetNext(char* name, 
size_t* _nameLength,
                                                                                
ino_t* _id);
                        status_t                        _GetNext(const char* 
name, size_t* _nameLength,
-                                                                               
ino_t* _id, int count);
+                                                                               
ino_t* _id, int64_t* offset);
                        dir*                            DirectContent() { 
return direct; }
                        dir_info*                       DirectInfo() { return 
direct_info; }
-       static  int                                     countDir;
 
 private:
-
+                       int                             fCountDir;
                        int64                           fOffset;
                        cluster_t                       fCluster;
                        Inode*                          fInode;


Other related posts:

  • » [haiku-commits] haiku: hrev54456 - src/add-ons/kernel/file_systems/ufs2 - Adrien Destugues