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