vfs_alloc_dentry (#54)

* vfs_alloc_dentry

* vfs_alloc_dentry

* 修正dentry被错误清空的问题

Co-authored-by: fslongjin <longjin@RinGoTek.cn>
This commit is contained in:
DaJiYuQia 2022-10-07 20:06:40 +08:00 committed by GitHub
parent e62bbf13e5
commit 1b0c901ab2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 6 additions and 16 deletions

View File

@ -297,15 +297,12 @@ int64_t vfs_mkdir(const char *path, mode_t mode, bool from_userland)
return -EEXIST; return -EEXIST;
} }
struct vfs_dir_entry_t *subdir_dentry = (struct vfs_dir_entry_t *)kzalloc(sizeof(struct vfs_dir_entry_t), 0); struct vfs_dir_entry_t *subdir_dentry = vfs_alloc_dentry(pathlen - last_slash);
list_init(&subdir_dentry->subdirs_list);
list_init(&subdir_dentry->child_node_list);
if (path[pathlen - 1] == '/') if (path[pathlen - 1] == '/')
subdir_dentry->name_length = pathlen - last_slash - 2; subdir_dentry->name_length = pathlen - last_slash - 2;
else else
subdir_dentry->name_length = pathlen - last_slash - 1; subdir_dentry->name_length = pathlen - last_slash - 1;
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)
@ -409,10 +406,9 @@ uint64_t do_open(const char *filename, int flags)
parent_dentry = vfs_root_sb->root; parent_dentry = vfs_root_sb->root;
// 创建新的文件 // 创建新的文件
dentry = (struct vfs_dir_entry_t *)kzalloc(sizeof(struct vfs_dir_entry_t), 0); dentry = vfs_alloc_dentry(path_len - tmp_index);
dentry->name_length = path_len - tmp_index - 1; dentry->name_length = path_len - tmp_index - 1;
dentry->name = (char *)kzalloc(dentry->name_length + 1, 0);
strncpy(dentry->name, path + tmp_index + 1, dentry->name_length); strncpy(dentry->name, path + tmp_index + 1, dentry->name_length);
// kdebug("to create new file:%s namelen=%d", dentry->name, dentry->name_length) // kdebug("to create new file:%s namelen=%d", dentry->name, dentry->name_length)
dentry->parent = parent_dentry; dentry->parent = parent_dentry;
@ -513,7 +509,8 @@ struct vfs_dir_entry_t *vfs_alloc_dentry(const int name_size)
struct vfs_dir_entry_t *dentry = (struct vfs_dir_entry_t *)kzalloc(sizeof(struct vfs_dir_entry_t), 0); struct vfs_dir_entry_t *dentry = (struct vfs_dir_entry_t *)kzalloc(sizeof(struct vfs_dir_entry_t), 0);
if (unlikely(dentry == NULL)) if (unlikely(dentry == NULL))
return NULL; return NULL;
dentry->name = (char *)kzalloc(name_size, 0); if (name_size != 0)
dentry->name = (char *)kzalloc(name_size, 0);
// 初始化lockref // 初始化lockref
spin_init(&dentry->lockref.lock); spin_init(&dentry->lockref.lock);

View File

@ -205,9 +205,7 @@ static __always_inline void __devfs_init_root_inode()
*/ */
static __always_inline void __devfs_init_root_dentry() static __always_inline void __devfs_init_root_dentry()
{ {
devfs_root_dentry = (struct vfs_dir_entry_t *)kzalloc(sizeof(struct vfs_dir_entry_t), 0); devfs_root_dentry = vfs_alloc_dentry(0);
list_init(&devfs_root_dentry->child_node_list);
list_init(&devfs_root_dentry->subdirs_list);
devfs_root_dentry->dir_ops = &devfs_dentry_ops; devfs_root_dentry->dir_ops = &devfs_dentry_ops;
__devfs_init_root_inode(); __devfs_init_root_inode();

View File

@ -369,16 +369,11 @@ struct vfs_superblock_t *fat32_read_superblock(struct block_device *blk)
printk_color(BLUE, BLACK, "FAT32 FSInfo\n\tFSI_LeadSig:%#018lx\n\tFSI_StrucSig:%#018lx\n\tFSI_Free_Count:%#018lx\n", fsbi->fsinfo.FSI_LeadSig, fsbi->fsinfo.FSI_StrucSig, fsbi->fsinfo.FSI_Free_Count); printk_color(BLUE, BLACK, "FAT32 FSInfo\n\tFSI_LeadSig:%#018lx\n\tFSI_StrucSig:%#018lx\n\tFSI_Free_Count:%#018lx\n", fsbi->fsinfo.FSI_LeadSig, fsbi->fsinfo.FSI_StrucSig, fsbi->fsinfo.FSI_Free_Count);
// 初始化超级块的dir entry // 初始化超级块的dir entry
sb_ptr->root = (struct vfs_dir_entry_t *)kmalloc(sizeof(struct vfs_dir_entry_t), 0); sb_ptr->root = vfs_alloc_dentry(2);
memset(sb_ptr->root, 0, sizeof(struct vfs_dir_entry_t));
list_init(&sb_ptr->root->child_node_list);
list_init(&sb_ptr->root->subdirs_list);
sb_ptr->root->parent = sb_ptr->root; sb_ptr->root->parent = sb_ptr->root;
sb_ptr->root->dir_ops = &fat32_dEntry_ops; sb_ptr->root->dir_ops = &fat32_dEntry_ops;
// 分配2个字节的name // 分配2个字节的name
sb_ptr->root->name = (char *)(kmalloc(2, 0));
sb_ptr->root->name[0] = '/'; sb_ptr->root->name[0] = '/';
sb_ptr->root->name_length = 1; sb_ptr->root->name_length = 1;