aboutsummaryrefslogtreecommitdiff
path: root/kernel/fs
diff options
context:
space:
mode:
authorsotech117 <michael_foiani@brown.edu>2024-05-13 09:27:24 +0000
committersotech117 <michael_foiani@brown.edu>2024-05-13 09:27:24 +0000
commitf09878f6327426631d9419d825a4e8396e3b9dc4 (patch)
tree009d1f1b1386baf6d07b3b7d9a436590ada14094 /kernel/fs
parent0e2acbe54e5800621692c2f6e9e9590aa369e165 (diff)
weenix
Diffstat (limited to 'kernel/fs')
-rw-r--r--kernel/fs/s5fs/s5fs.c6
-rw-r--r--kernel/fs/vnode_specials.c39
2 files changed, 38 insertions, 7 deletions
diff --git a/kernel/fs/s5fs/s5fs.c b/kernel/fs/s5fs/s5fs.c
index 602c7aa..ba406e7 100644
--- a/kernel/fs/s5fs/s5fs.c
+++ b/kernel/fs/s5fs/s5fs.c
@@ -400,7 +400,11 @@ static ssize_t s5fs_write(vnode_t *vnode, size_t pos, const void *buf,
*/
static long s5fs_mmap(vnode_t *file, mobj_t **ret)
{
- NOT_YET_IMPLEMENTED("VM: s5fs_mmap");
+ // NOT_YET_IMPLEMENTED("VM: s5fs_mmap");
+
+ // Add a reference to the underlying mobj and return it
+ mobj_ref(&file->vn_mobj);
+ *ret = &file->vn_mobj;
return 0;
}
diff --git a/kernel/fs/vnode_specials.c b/kernel/fs/vnode_specials.c
index fb6df0b..d8c79bd 100644
--- a/kernel/fs/vnode_specials.c
+++ b/kernel/fs/vnode_specials.c
@@ -159,20 +159,47 @@ static long chardev_file_write(vnode_t *file, size_t pos, const void *buf,
*/
static long chardev_file_mmap(vnode_t *file, mobj_t **ret)
{
- NOT_YET_IMPLEMENTED("VM: chardev_file_mmap");
- return 0;
+ // NOT_YET_IMPLEMENTED("VM: chardev_file_mmap");
+
+ // check if the vnode represents a chardev
+ chardev_t *dev = file->vn_dev.chardev;
+ if (dev == NULL)
+ {
+ return -ENXIO;
+ }
+
+ // call the chardev's mmap operation
+ return dev->cd_ops->mmap(file, ret);
}
static long chardev_file_fill_pframe(vnode_t *file, pframe_t *pf)
{
- NOT_YET_IMPLEMENTED("VM: chardev_file_fill_pframe");
- return 0;
+ // NOT_YET_IMPLEMENTED("VM: chardev_file_fill_pframe");
+
+ // check if the vnode represents a chardev
+ chardev_t *dev = file->vn_dev.chardev;
+ if (dev == NULL)
+ {
+ return -ENXIO;
+ }
+
+ // call the chardev's fill_pframe operation
+ return dev->cd_ops->fill_pframe(file, pf);
}
static long chardev_file_flush_pframe(vnode_t *file, pframe_t *pf)
{
- NOT_YET_IMPLEMENTED("VM: chardev_file_flush_pframe");
- return 0;
+ // NOT_YET_IMPLEMENTED("VM: chardev_file_flush_pframe");
+
+ // check if the vnode represents a chardev
+ chardev_t *dev = file->vn_dev.chardev;
+ if (dev == NULL)
+ {
+ return -ENXIO;
+ }
+
+ // call the chardev's flush_pframe operation
+ return dev->cd_ops->flush_pframe(file, pf);
}
static ssize_t blockdev_file_read(vnode_t *file, size_t pos, void *buf,