mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-11-02 07:28:21 +00:00
ext2: readonly support
This commit is contained in:
@@ -28,6 +28,7 @@
|
|||||||
#include <kernel/pci.h>
|
#include <kernel/pci.h>
|
||||||
#include <kernel/nvme.h>
|
#include <kernel/nvme.h>
|
||||||
#include <kernel/block.h>
|
#include <kernel/block.h>
|
||||||
|
#include <kernel/ext2.h>
|
||||||
|
|
||||||
static cpu_t bsp_cpu;
|
static cpu_t bsp_cpu;
|
||||||
|
|
||||||
@@ -56,6 +57,7 @@ void kernel_entry() {
|
|||||||
tmpfs_init();
|
tmpfs_init();
|
||||||
devfs_init();
|
devfs_init();
|
||||||
pipefs_init();
|
pipefs_init();
|
||||||
|
ext2_init();
|
||||||
printf("mounting tmpfs on /\n");
|
printf("mounting tmpfs on /\n");
|
||||||
__assert(vfs_mount(NULL, vfsroot, "/", "tmpfs", NULL) == 0);
|
__assert(vfs_mount(NULL, vfsroot, "/", "tmpfs", NULL) == 0);
|
||||||
initrd_unpack();
|
initrd_unpack();
|
||||||
|
|||||||
+87
-1
@@ -527,6 +527,76 @@ static int ext2_getdents(vnode_t *vnode, dent_t *buffer, size_t count, uintmax_t
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int ext2_access(vnode_t *vnode, mode_t mode, cred_t *cred) {
|
||||||
|
// TODO permission checks
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ext2_readlink(vnode_t *vnode, char **link, cred_t *cred) {
|
||||||
|
ext2node_t *node = (ext2node_t *)vnode;
|
||||||
|
ext2fs_t *fs = (ext2fs_t *)vnode->vfs;
|
||||||
|
if (vnode->type != V_TYPE_LINK)
|
||||||
|
return EINVAL;
|
||||||
|
|
||||||
|
VOP_LOCK(vnode);
|
||||||
|
int err = 0;
|
||||||
|
|
||||||
|
size_t linksize = INODE_SIZE(&node->inode);
|
||||||
|
char *buf = alloc(linksize + 1);
|
||||||
|
|
||||||
|
// if the length of a symlink is larger than 60 bytes, its stored normally
|
||||||
|
// otherwise, its stored in the inode strucutre itself
|
||||||
|
if (linksize > 60)
|
||||||
|
err = rwbytes(fs, node, buf, linksize, 0, false);
|
||||||
|
else
|
||||||
|
memcpy(buf, node->inode.directpointer, linksize);
|
||||||
|
|
||||||
|
buf[linksize] = '\0';
|
||||||
|
|
||||||
|
VOP_UNLOCK(vnode);
|
||||||
|
if (err)
|
||||||
|
free(buf);
|
||||||
|
else
|
||||||
|
*link = buf;
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ext2_read(vnode_t *vnode, void *buffer, size_t size, uintmax_t offset, int flags, size_t *readc, cred_t *cred) {
|
||||||
|
ext2node_t *node = (ext2node_t *)vnode;
|
||||||
|
ext2fs_t *fs = (ext2fs_t *)vnode->vfs;
|
||||||
|
uintmax_t endoffset = offset + size;
|
||||||
|
int err = 0;
|
||||||
|
VOP_LOCK(vnode);
|
||||||
|
|
||||||
|
size_t inodesize = INODE_SIZE(&node->inode);
|
||||||
|
|
||||||
|
if (offset >= inodesize) {
|
||||||
|
*readc = 0;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check for overflow
|
||||||
|
if (offset > endoffset)
|
||||||
|
endoffset = -1ll;
|
||||||
|
|
||||||
|
if (endoffset > inodesize) {
|
||||||
|
endoffset = inodesize;
|
||||||
|
size = endoffset - offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size == 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
err = rwbytes(fs, node, buffer, size, offset, false);
|
||||||
|
|
||||||
|
*readc = err ? -1 : size;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
VOP_UNLOCK(vnode);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
// TODO move root variable to vfs
|
// TODO move root variable to vfs
|
||||||
static int ext2_root(vfs_t *vfs, vnode_t **vnodep) {
|
static int ext2_root(vfs_t *vfs, vnode_t **vnodep) {
|
||||||
ext2fs_t *fs = (ext2fs_t *)vfs;
|
ext2fs_t *fs = (ext2fs_t *)vfs;
|
||||||
@@ -639,13 +709,29 @@ static vfsops_t vfsops = {
|
|||||||
.root = ext2_root
|
.root = ext2_root
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
int (*write)(vnode_t *node, void *buffer, size_t size, uintmax_t offset, int flags, size_t *writec, cred_t *cred);
|
||||||
|
int (*create)(vnode_t *parent, char *name, vattr_t *attr, int type, vnode_t **result, cred_t *cred);
|
||||||
|
int (*unlink)(vnode_t *node, char *name, cred_t *cred);
|
||||||
|
int (*link)(vnode_t *node, vnode_t *dir, char *name, cred_t *cred);
|
||||||
|
int (*symlink)(vnode_t *parent, char *name, vattr_t *attr, char *path, cred_t *cred);
|
||||||
|
int (*inactive)(vnode_t *node);
|
||||||
|
int (*mmap)(vnode_t *node, void *addr, uintmax_t offset, int flags, cred_t *cred);
|
||||||
|
int (*munmap)(vnode_t *node, void *addr, uintmax_t offset, int flags, cred_t *cred);
|
||||||
|
int (*resize)(vnode_t *node, size_t newsize, cred_t *cred);
|
||||||
|
*/
|
||||||
|
|
||||||
static vops_t vnops = {
|
static vops_t vnops = {
|
||||||
|
.read = ext2_read,
|
||||||
.getdents = ext2_getdents,
|
.getdents = ext2_getdents,
|
||||||
.lookup = ext2_lookup,
|
.lookup = ext2_lookup,
|
||||||
.getattr = ext2_getattr,
|
.getattr = ext2_getattr,
|
||||||
.setattr = ext2_setattr,
|
.setattr = ext2_setattr,
|
||||||
.open = ext2_open,
|
.open = ext2_open,
|
||||||
.close = ext2_close
|
.close = ext2_close,
|
||||||
|
.poll = vfs_pollstub,
|
||||||
|
.access = ext2_access,
|
||||||
|
.readlink = ext2_readlink
|
||||||
};
|
};
|
||||||
|
|
||||||
void ext2_init() {
|
void ext2_init() {
|
||||||
|
|||||||
Reference in New Issue
Block a user