bugfix: 修复未将子目录项的dentry加入父目录项的dentry的subdirs_list的bug

This commit is contained in:
fslongjin 2022-06-25 21:06:25 +08:00
parent 0d6957294d
commit 9eb9d759e6
3 changed files with 9 additions and 8 deletions

View File

@ -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"

View File

@ -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;
}

View File

@ -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