mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-09 19:36:47 +00:00
bugfix: 修复未将子目录项的dentry加入父目录项的dentry的subdirs_list的bug
This commit is contained in:
parent
0d6957294d
commit
9eb9d759e6
@ -231,7 +231,7 @@ void *memset_c(void* dst, uint8_t c, size_t count)
|
|||||||
* @param Num 字节数
|
* @param Num 字节数
|
||||||
* @return void*
|
* @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;
|
int d0=0, d1=0, d2=0;
|
||||||
__asm__ __volatile__("cld \n\t"
|
__asm__ __volatile__("cld \n\t"
|
||||||
|
@ -78,7 +78,7 @@ uint64_t vfs_unregister_filesystem(struct vfs_filesystem_type_t *fs)
|
|||||||
* @param flags 1:返回父目录项, 0:返回结果目录项
|
* @param flags 1:返回父目录项, 0:返回结果目录项
|
||||||
* @return struct vfs_dir_entry_t* 目录项
|
* @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;
|
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)
|
while (true)
|
||||||
{
|
{
|
||||||
// 提取出下一级待搜索的目录名或文件名,并保存在dEntry_name中
|
// 提取出下一级待搜索的目录名或文件名,并保存在dEntry_name中
|
||||||
char *tmp_path = path;
|
const char *tmp_path = path;
|
||||||
while ((*path && *path != '\0') && (*path != '/'))
|
while ((*path && *path != '\0') && (*path != '/'))
|
||||||
++path;
|
++path;
|
||||||
int tmp_path_len = path - tmp_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,因为空间会被覆盖
|
||||||
// memset(dentry->name, 0, tmp_path_len+1);
|
// 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[tmp_path_len] = '\0';
|
||||||
dentry->name_length = tmp_path_len;
|
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);
|
list_init(&dentry->subdirs_list);
|
||||||
dentry->parent = parent;
|
dentry->parent = parent;
|
||||||
|
|
||||||
|
list_add(&parent->subdirs_list, &dentry->child_node_list);
|
||||||
while (*path == '/')
|
while (*path == '/')
|
||||||
++path;
|
++path;
|
||||||
|
|
||||||
@ -225,7 +226,7 @@ uint64_t sys_mkdir(struct pt_regs *regs)
|
|||||||
kfree(buf);
|
kfree(buf);
|
||||||
|
|
||||||
// 检查父目录中是否已经有相同的目录项
|
// 检查父目录中是否已经有相同的目录项
|
||||||
if (vfs_path_walk(path, 0) != NULL)
|
if (vfs_path_walk((const char *)path, 0) != NULL)
|
||||||
{
|
{
|
||||||
// 目录中已有对应的文件夹
|
// 目录中已有对应的文件夹
|
||||||
kwarn("Dir '%s' aleardy exists.", path);
|
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);
|
subdir_dentry->name = (char *)kmalloc(subdir_dentry->name_length + 1, 0);
|
||||||
memset((void *)subdir_dentry->name, 0, subdir_dentry->name_length + 1);
|
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)
|
for (int i = last_slash + 1, cnt = 0; i < pathlen && cnt < subdir_dentry->name_length; ++i, ++cnt)
|
||||||
{
|
{
|
||||||
subdir_dentry->name[cnt] = path[i];
|
subdir_dentry->name[cnt] = path[i];
|
||||||
@ -254,6 +254,7 @@ uint64_t sys_mkdir(struct pt_regs *regs)
|
|||||||
subdir_dentry->parent = parent_dir;
|
subdir_dentry->parent = parent_dir;
|
||||||
kdebug("to mkdir, parent name=%s", parent_dir->name);
|
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);
|
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);
|
kdebug("retval = %d", retval);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
@ -181,7 +181,7 @@ struct vfs_superblock_t *vfs_mount_fs(char *name, void *DPTE, uint8_t DPT_type,
|
|||||||
* @param flags 1:返回父目录项, 0:返回结果目录项
|
* @param flags 1:返回父目录项, 0:返回结果目录项
|
||||||
* @return struct vfs_dir_entry_t* 目录项
|
* @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
|
* @brief 填充dentry
|
||||||
|
Loading…
x
Reference in New Issue
Block a user