]> Zhao Yanbai Git Server - kernel.git/commitdiff
添加了一些vfs_open相关的代码
authoracevest <zhaoyanbai@126.com>
Sat, 14 Sep 2024 15:31:43 +0000 (23:31 +0800)
committeracevest <zhaoyanbai@126.com>
Sat, 14 Sep 2024 15:31:43 +0000 (23:31 +0800)
fs/open.c
fs/path.c
fs/ramfs.c
gdbscript
kernel/irq.c
kernel/task_root.c

index 54c57b365900952c33dc56ec20ea413442f86f1e..86f941703933354b239321f677ea59bf7505c8b4 100644 (file)
--- a/fs/open.c
+++ b/fs/open.c
@@ -32,15 +32,13 @@ int get_unused_fd() {
     return -EMFILE;
 }
 
-file_t *filp_open(const char *path, int flags, mode_t mode) {
+file_t *filp_open(const char *path, int flags, int mode) {
     int ret = 0;
 
-    // ret = open_path(path, flags, mode, nd);
-
     return NULL;
 }
 
-int sysc_open(const char *path, int flags, mode_t mode) {
+int sysc_open(const char *path, int flags, int mode) {
     int fd = 0;
 
     fd = get_unused_fd();
index 905678fe91798e20f77d0f808777691211f2997f..98f5ec11e6a2fd29c35f3ffef7b5a3e98054bdb3 100644 (file)
--- a/fs/path.c
+++ b/fs/path.c
@@ -8,8 +8,10 @@
  */
 
 #include <errno.h>
+#include <fcntl.h>
 #include <fs.h>
 #include <sched.h>
+#include <system.h>
 #include <types.h>
 #include <vfs.h>
 
@@ -371,3 +373,61 @@ dentry_t *path_lookup_create(namei_t *ni) {
 
     return dentry;
 }
+
+int path_open_namei(const char *path, int flags, int mode, namei_t *ni) {
+    int ret = 0;
+    dentry_t *dentry = NULL;
+    dentry_t *dir = NULL;
+    inode_t *inode = NULL;
+
+    if (flags % O_CREAT == 0) {
+        path_init(path, flags, ni);
+        ret = path_walk(path, ni);
+        if (0 != ret) {
+            return ret;
+        }
+        dentry = ni->path.dentry;
+        goto ok;
+    }
+
+    path_init(path, PATH_LOOKUP_PARENT, ni);
+    ret = path_walk(path, ni);
+    if (0 != ret) {
+        return ret;
+    }
+
+    if (ni->last_type != LAST_NORMAL) {
+        ret = -EISDIR;
+        goto end;
+    }
+
+    dir = ni->path.dentry;
+    assert(NULL != dir);
+
+    down(&dir->d_inode->i_sem);
+
+    dentry = dentry_cached_lookup(dir, &ni->last);
+    if (IS_ERR(dentry)) {
+        ret = PTR_ERR(dentry);
+        up(&dir->d_inode->i_sem);
+        goto end;
+    }
+
+    if (NULL == dentry->d_inode) {
+        // vfs_create();
+        up(&dir->d_inode->i_sem);
+        dentry_put(ni->path.dentry);
+        goto ok;
+    }
+
+ok:
+    inode = dentry->d_inode;
+    if (NULL == inode) {
+        ret = -ENOENT;
+        goto end;
+    }
+
+end:
+
+    return ret;
+}
index f4b15e42a0086351f8861bc97c0023cb856fc5f7..93a225e69a84383f8e9ba6cd69ca88779ed9dab4 100644 (file)
@@ -78,6 +78,9 @@ static int ramfs_mkdir(inode_t *dir, dentry_t *dentry, umode_t mode) {
 }
 
 static dentry_t *ramfs_lookup(inode_t *dir, dentry_t *dentry) {
+    // 不用上dir去找了,直接用dentry就可以了
+
+    // dentry对应的inode在ramfs_mkdir等里去分配的
     dentry_add(dentry, NULL);
 
     return NULL;
index 8ff45da0a5dbcd3e7bde3558e2ce43c17ec6431d..0cb0213e1f9483132267aeeed53c583d7df7ac2f 100644 (file)
--- a/gdbscript
+++ b/gdbscript
@@ -13,7 +13,7 @@ set confirm off
 
 #handle SIGINT nostop noprint
 
-b root_task_entry
+#b root_task_entry
 
 target remote localhost:1234
 
@@ -29,6 +29,9 @@ set pagination off
 
 #b setup_kernel
 #b e820_init_bootmem_data
+
+#b root_task_entry
+
 c
 
 
index 83cfada5abfa4a30e7b608735edb30d174e97ee1..701513ad35ad3010be3c9a7020bc01ee056801d8 100644 (file)
@@ -160,6 +160,8 @@ __attribute__((regparm(1))) void irq_handler(pt_regs_t *regs) {
         return;
     }
 
+    enable_irq();
+
     // 如果需要调度程序
     schedule();
 }
index 858d3c508218f37ba75a8c8a77ef01b4aa760bf4..b71231d3dc9845e3c4f586ece685cfa4e687bae0 100644 (file)
@@ -166,6 +166,7 @@ void root_task_entry() {
 
     extern __attribute__((regparm(0))) long sysc_mkdir(const char *path, int mode);
     sysc_mkdir("/root", 0777);
+    sysc_mkdir("/root/aaa", 0777);
 
     {
         namei_t ni;