diff options
Diffstat (limited to 'kernel/fs')
-rw-r--r-- | kernel/fs/s5fs/s5fs.c | 6 | ||||
-rw-r--r-- | kernel/fs/vnode_specials.c | 39 |
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, |