[haiku-commits] Change in haiku[master]: ufs2: Implementing read function

  • From: Gerrit <review@xxxxxxxxxxxxxxxxxxx>
  • To: waddlesplash <waddlesplash@xxxxxxxxx>, haiku-commits@xxxxxxxxxxxxx
  • Date: Sat, 25 Jul 2020 19:11:15 +0000

From Suhel Mehta <suhelmehta@xxxxxxxxxxx>:

Suhel Mehta has uploaded this change for review. ( 
https://review.haiku-os.org/c/haiku/+/3088 ;)


Change subject: ufs2: Implementing read function
......................................................................

ufs2: Implementing read function

Right now it is reading directly from disk and it is reading very less
data from disk.
---
M src/add-ons/kernel/file_systems/ufs2/DirectoryIterator.cpp
M src/add-ons/kernel/file_systems/ufs2/Inode.cpp
M src/add-ons/kernel/file_systems/ufs2/Inode.h
M src/add-ons/kernel/file_systems/ufs2/kernel_interface.cpp
M src/add-ons/kernel/file_systems/ufs2/ufs2.h
5 files changed, 47 insertions(+), 7 deletions(-)



  git pull ssh://git.haiku-os.org:22/haiku refs/changes/88/3088/1

diff --git a/src/add-ons/kernel/file_systems/ufs2/DirectoryIterator.cpp 
b/src/add-ons/kernel/file_systems/ufs2/DirectoryIterator.cpp
index 272be1a..cf57207 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
@@ -81,10 +81,10 @@
                remainder = direct.namlen + 4;
        }

+       TRACE("offset is %d\n",fOffset);
        fOffset = fOffset + 8 + remainder;

        if (direct.next_ino > 0) {
-               TRACE("direct.next_ino %d\n",direct.next_ino);

                strlcpy(name, direct.name, remainder);
                *_id = direct.next_ino;
diff --git a/src/add-ons/kernel/file_systems/ufs2/Inode.cpp 
b/src/add-ons/kernel/file_systems/ufs2/Inode.cpp
index 455e753..4ea6d5e 100644
--- a/src/add-ons/kernel/file_systems/ufs2/Inode.cpp
+++ b/src/add-ons/kernel/file_systems/ufs2/Inode.cpp
@@ -36,6 +36,7 @@
        int64_t offset_in_block = ino_to_fsbo(superblock, id);
        int64_t offset = fs_block * MINBSIZE + offset_in_block * 256;

+       ERROR("%ld\n\n",offset);
        if (read_pos(fd, offset, (void*)&fNode, sizeof(fNode)) != sizeof(fNode))
                ERROR("Inode::Inode(): IO Error\n");

@@ -85,3 +86,12 @@
 {
        return fInitStatus;
 }
+
+
+status_t
+Inode::ReadAt(off_t pos, uint8* buffer, size_t* _length)
+{
+       int fd = fVolume->Device();
+       return read_pos(fd, pos, buffer, *_length);
+       //return file_cache_read(FileCache(), NULL, pos, buffer, _length);
+}
diff --git a/src/add-ons/kernel/file_systems/ufs2/Inode.h 
b/src/add-ons/kernel/file_systems/ufs2/Inode.h
index f76cd1a..a34f793 100644
--- a/src/add-ons/kernel/file_systems/ufs2/Inode.h
+++ b/src/add-ons/kernel/file_systems/ufs2/Inode.h
@@ -123,7 +123,7 @@

 //                     status_t        FindBlock(off_t logical, off_t& 
physical,
 //                                                     off_t* _length = NULL);
-//                     status_t        ReadAt(off_t pos, uint8* buffer, 
size_t* length);
+                       status_t        ReadAt(off_t pos, uint8* buffer, 
size_t* length);
 //                     status_t        FillGapWithZeros(off_t start, off_t 
end);

                        void*           FileCache() const { return fCache; }
diff --git a/src/add-ons/kernel/file_systems/ufs2/kernel_interface.cpp 
b/src/add-ons/kernel/file_systems/ufs2/kernel_interface.cpp
index c978553..43dd19d 100644
--- a/src/add-ons/kernel/file_systems/ufs2/kernel_interface.cpp
+++ b/src/add-ons/kernel/file_systems/ufs2/kernel_interface.cpp
@@ -3,7 +3,6 @@
  * All rights reserved. Distributed under the terms of the MIT License.
  */

-
 #include "DirectoryIterator.h"
 #include "Inode.h"
 #include "system_dependencies.h"
@@ -251,10 +250,27 @@


 static status_t
-ufs2_open(fs_volume * /*_volume*/, fs_vnode *_node, int openMode,
+ufs2_open(fs_volume * _volume, fs_vnode *_node, int openMode,
                 void **_cookie)
 {
-       return B_NOT_SUPPORTED;
+       Volume* volume = (Volume*)_volume->private_volume;
+       Inode* inode = (Inode*)_node->private_node;
+       TRACE("in open %d \n", openMode);
+       if (inode->IsDirectory())
+               return B_IS_A_DIRECTORY;
+
+       file_cookie* cookie = new(std::nothrow) file_cookie;
+       if (cookie == NULL)
+               return B_NO_MEMORY;
+       ObjectDeleter<file_cookie> cookieDeleter(cookie);
+
+       cookie->last_size = inode->Size();
+       cookie->last_notification = system_time();
+
+//     fileCacheEnabler.Detach();
+       cookieDeleter.Detach();
+       *_cookie = cookie;
+       return B_OK;
 }


@@ -262,7 +278,15 @@
 ufs2_read(fs_volume *_volume, fs_vnode *_node, void *_cookie, off_t pos,
                 void *buffer, size_t *_length)
 {
-       return B_NOT_SUPPORTED;
+       Inode* inode = (Inode*)_node->private_node;
+
+       if (!inode->IsFile()) {
+               *_length = 0;
+               return inode->IsDirectory() ? B_IS_A_DIRECTORY : B_BAD_VALUE;
+       }
+
+       pos = inode->GetBlockPointer() * MINBSIZE;
+       return inode->ReadAt(pos, (uint8*)buffer, _length);
 }


diff --git a/src/add-ons/kernel/file_systems/ufs2/ufs2.h 
b/src/add-ons/kernel/file_systems/ufs2/ufs2.h
index 00366f9..ca55fc2 100644
--- a/src/add-ons/kernel/file_systems/ufs2/ufs2.h
+++ b/src/add-ons/kernel/file_systems/ufs2/ufs2.h
@@ -354,6 +354,12 @@
        bool            IsValid();
 };

+struct file_cookie {
+       bigtime_t       last_notification;
+       off_t           last_size;
+       int             open_mode;
+};
+
 /* Sanity checking. */
 #ifdef CTASSERT
 CTASSERT(sizeof(struct fs) == 1376);

--
To view, visit https://review.haiku-os.org/c/haiku/+/3088
To unsubscribe, or for help writing mail filters, visit 
https://review.haiku-os.org/settings

Gerrit-Project: haiku
Gerrit-Branch: master
Gerrit-Change-Id: I8156aba53782da8c2bb4481db611ae26d8881b35
Gerrit-Change-Number: 3088
Gerrit-PatchSet: 1
Gerrit-Owner: Suhel Mehta <suhelmehta@xxxxxxxxxxx>
Gerrit-MessageType: newchange

Other related posts:

  • » [haiku-commits] Change in haiku[master]: ufs2: Implementing read function - Gerrit