diff --git a/kernel/fs/vfs.c b/kernel/fs/vfs.c index 00f8056..6681ef2 100644 --- a/kernel/fs/vfs.c +++ b/kernel/fs/vfs.c @@ -12,7 +12,7 @@ #include "lang/lang.h" vfs_fs_t *fses[VFS_MAX_FS]; // a vfs_fs structure for every filesystem we support -vfs_mount_node_t *mounts; +vfs_mount_t *mounts; // basic initialization routine, init all filesystem drivers int vfs_init() @@ -43,24 +43,26 @@ int vfs_mount(major_t maj, minor_t min, int fsType, char *mountPoint) if (mounts) return -2; // root already mounted void *super = fses[fsType]->mount_super(maj, min); + if (!super) + return -3; // didn't mount superblock vfs_mount_t *mnt = New(vfs_mount_t); mnt->refs = 0; mnt->fs = fsType; mnt->major = maj; mnt->minor = min; mnt->super = super; - vfs_mount_node_t *node = New(vfs_mount_node_t); - mount = node; - node->next = NULL; - node->mount = mnt; - node->vfs_inode = 0; - return 0; + mnt->next = NULL; + mnt->prev = NULL; + node->vfs_mount_inode = 0; // root not mounted on another fs + node->vfs_up_inode = 0; + mounts = mnt; + return 0; // successfully mounted root } if (mountPoint[0] != '/') return -3; // mount point must be absolute int l = strlen(mountPoint); if (l < 2) - return -4; // mount point must be non-null string + return -4; // mount point is too short return -5; } @@ -68,10 +70,29 @@ vfs_inode_t vfs_get_inode_number(char *path) { if (path[0] != '/') return 0; - vfs_file_addr_t file_addr; - file_addr.mount = mounts->mount; - file_addr.inode = fses[file_addr.mount->fsType]->get_root_inode(file_addr.mount); + vfs_inode_t vfs_inode = 0; + +} + +// look for entry in dir_inode, return the vfs_inode for the entry +vfs_inode_t vfs_entry_lookup(vfs_inode_t dir_inode, char *entry) +{ + vfs_open_file_t *open_dir = vfs_open_dir_inode(dir_inode); + if (!open_dir) + return 0x8000000000000001ULL; + vfs_dir_entry_t dentry; + vfs_inode_t vfs_inode = 0; + while (!vfs_read_dir(open_dir, &dentry)) + { + if (!strcmp(dentry.name, entry)) + { + vfs_inode = (dir_inode & 0xFFFFFFFF00000000ULL) | dentry.inode_number; + break; + } + } + vfs_close_dir(open_dir); + return vfs_inode; } diff --git a/kernel/fs/vfs.h b/kernel/fs/vfs.h index 68142fb..74b977e 100644 --- a/kernel/fs/vfs.h +++ b/kernel/fs/vfs.h @@ -39,28 +39,20 @@ typedef u64_t vfs_inode_t; /* Structure to hold information about a mount point */ -typedef struct +struct vfs_mount_s { int refs; void *super; int fs; major_t major; minor_t minor; -} vfs_mount_t; - -struct vfs_mount_node_s -{ - vfs_mount_t *mount; - vfs_inode_t vfs_inode; - struct vfs_mount_node_s *next; + char *mountPoint; + vfs_inode_t vfs_mount_inode; + vfs_inode_t vfs_up_inode; + struct vfs_mount_s *next; + struct vfs_mount_s *prev; }; -typedef struct vfs_mount_node_s vfs_mount_node_t; - -typedef struct -{ - vfs_mount_t *mount; - u32_t inode; -} vfs_file_addr_t; +typedef struct vfs_mount_s vfs_mount_t; typedef struct { @@ -86,7 +78,7 @@ typedef struct typedef struct { char name[257]; - u32_t inode_number; + u32_t inode_number; // relative inode number returned from fs } vfs_dir_entry_t; /* Every filesystem must provide pointers to its respective functions in a structure like this */ diff --git a/make.grc b/make.grc deleted file mode 100644 index b8a9385..0000000 --- a/make.grc +++ /dev/null @@ -1,18 +0,0 @@ -regexp=.*In.function.* -colours=green -- -regexp=.*warning\:.* -colours=yellow -- -regexp=In.file.included.* -colours=green -- -regexp=\s*from.*\:\s* -colours=green -- -regexp=.*error\:.* -colours=red -- -regexp=.*\*\*\*.* -colours=red -