From 9eb9d759e6bc24ee70cc76bbd391d007b1cee53c Mon Sep 17 00:00:00 2001 From: fslongjin Date: Sat, 25 Jun 2022 21:06:25 +0800 Subject: [PATCH] =?UTF-8?q?bugfix:=20=E4=BF=AE=E5=A4=8D=E6=9C=AA=E5=B0=86?= =?UTF-8?q?=E5=AD=90=E7=9B=AE=E5=BD=95=E9=A1=B9=E7=9A=84dentry=E5=8A=A0?= =?UTF-8?q?=E5=85=A5=E7=88=B6=E7=9B=AE=E5=BD=95=E9=A1=B9=E7=9A=84dentry?= =?UTF-8?q?=E7=9A=84subdirs=5Flist=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/common/glib.h | 2 +- kernel/filesystem/VFS/VFS.c | 13 +++++++------ kernel/filesystem/VFS/VFS.h | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/kernel/common/glib.h b/kernel/common/glib.h index d07073ad..d9983cb3 100644 --- a/kernel/common/glib.h +++ b/kernel/common/glib.h @@ -231,7 +231,7 @@ void *memset_c(void* dst, uint8_t c, size_t count) * @param Num 字节数 * @return void* */ -static void *memcpy(void *dst, void *src, long Num) +static void *memcpy(void *dst, const void *src, long Num) { int d0=0, d1=0, d2=0; __asm__ __volatile__("cld \n\t" diff --git a/kernel/filesystem/VFS/VFS.c b/kernel/filesystem/VFS/VFS.c index ed406484..b1cd0c7f 100644 --- a/kernel/filesystem/VFS/VFS.c +++ b/kernel/filesystem/VFS/VFS.c @@ -78,7 +78,7 @@ uint64_t vfs_unregister_filesystem(struct vfs_filesystem_type_t *fs) * @param flags 1:返回父目录项, 0:返回结果目录项 * @return struct vfs_dir_entry_t* 目录项 */ -struct vfs_dir_entry_t *vfs_path_walk(char *path, uint64_t flags) +struct vfs_dir_entry_t *vfs_path_walk(const char *path, uint64_t flags) { struct vfs_dir_entry_t *parent = vfs_root_sb->root; @@ -94,7 +94,7 @@ struct vfs_dir_entry_t *vfs_path_walk(char *path, uint64_t flags) while (true) { // 提取出下一级待搜索的目录名或文件名,并保存在dEntry_name中 - char *tmp_path = path; + const char *tmp_path = path; while ((*path && *path != '\0') && (*path != '/')) ++path; int tmp_path_len = path - tmp_path; @@ -106,7 +106,7 @@ struct vfs_dir_entry_t *vfs_path_walk(char *path, uint64_t flags) // 貌似这里不需要memset,因为空间会被覆盖 // memset(dentry->name, 0, tmp_path_len+1); - memcpy(dentry->name, tmp_path, tmp_path_len); + memcpy(dentry->name, (void*)tmp_path, tmp_path_len); dentry->name[tmp_path_len] = '\0'; dentry->name_length = tmp_path_len; @@ -124,6 +124,7 @@ struct vfs_dir_entry_t *vfs_path_walk(char *path, uint64_t flags) list_init(&dentry->subdirs_list); dentry->parent = parent; + list_add(&parent->subdirs_list, &dentry->child_node_list); while (*path == '/') ++path; @@ -170,7 +171,7 @@ int vfs_fill_dentry(void *buf, ino_t d_ino, char *name, int namelen, unsigned ch /** * @brief 创建文件夹 - * + * * @param path(r8) 路径 * @param mode(r9) 模式 * @return uint64_t @@ -225,7 +226,7 @@ uint64_t sys_mkdir(struct pt_regs *regs) kfree(buf); // 检查父目录中是否已经有相同的目录项 - if (vfs_path_walk(path, 0) != NULL) + if (vfs_path_walk((const char *)path, 0) != NULL) { // 目录中已有对应的文件夹 kwarn("Dir '%s' aleardy exists.", path); @@ -242,7 +243,6 @@ uint64_t sys_mkdir(struct pt_regs *regs) subdir_dentry->name = (char *)kmalloc(subdir_dentry->name_length + 1, 0); memset((void *)subdir_dentry->name, 0, subdir_dentry->name_length + 1); - for (int i = last_slash + 1, cnt = 0; i < pathlen && cnt < subdir_dentry->name_length; ++i, ++cnt) { subdir_dentry->name[cnt] = path[i]; @@ -254,6 +254,7 @@ uint64_t sys_mkdir(struct pt_regs *regs) subdir_dentry->parent = parent_dir; kdebug("to mkdir, parent name=%s", parent_dir->name); int retval = parent_dir->dir_inode->inode_ops->mkdir(parent_dir->dir_inode, subdir_dentry, 0); + list_add(&parent_dir->subdirs_list, &subdir_dentry->child_node_list); kdebug("retval = %d", retval); return 0; } \ No newline at end of file diff --git a/kernel/filesystem/VFS/VFS.h b/kernel/filesystem/VFS/VFS.h index e8da7b6e..a0746705 100644 --- a/kernel/filesystem/VFS/VFS.h +++ b/kernel/filesystem/VFS/VFS.h @@ -181,7 +181,7 @@ struct vfs_superblock_t *vfs_mount_fs(char *name, void *DPTE, uint8_t DPT_type, * @param flags 1:返回父目录项, 0:返回结果目录项 * @return struct vfs_dir_entry_t* 目录项 */ -struct vfs_dir_entry_t *vfs_path_walk(char *path, uint64_t flags); +struct vfs_dir_entry_t *vfs_path_walk(const char *path, uint64_t flags); /** * @brief 填充dentry