19 if (path ==
nullptr) {
29 auto lookup_result =
Lookup(path);
32 if (!lookup_result.has_value()) {
35 return std::unexpected(lookup_result.error());
40 char parent_path[512];
42 const char* last_slash =
strrchr(path,
'/');
43 if (last_slash ==
nullptr || last_slash == path) {
44 strncpy(parent_path,
"/",
sizeof(parent_path));
45 const char* name_start = path[0] ==
'/' ? path + 1 : path;
46 if (
strlen(name_start) >=
sizeof(file_name)) {
49 strncpy(file_name, name_start,
sizeof(file_name));
51 size_t parent_len = last_slash - path;
52 if (parent_len >=
sizeof(parent_path)) {
55 strncpy(parent_path, path, parent_len);
56 parent_path[parent_len] =
'\0';
57 if (
strlen(last_slash + 1) >=
sizeof(file_name)) {
60 strncpy(file_name, last_slash + 1,
sizeof(file_name));
62 file_name[
sizeof(file_name) - 1] =
'\0';
65 auto parent_result =
Lookup(parent_path);
66 if (!parent_result.has_value()) {
67 return std::unexpected(parent_result.error());
70 Dentry* parent_dentry = parent_result.value();
71 if (parent_dentry->
inode ==
nullptr ||
77 if (parent_dentry->
inode->
ops ==
nullptr) {
83 if (!create_result.has_value()) {
84 return std::unexpected(create_result.error());
88 auto new_dentry = kstd::make_unique<Dentry>();
93 strncpy(new_dentry->name, file_name,
sizeof(new_dentry->name) - 1);
94 new_dentry->name[
sizeof(new_dentry->name) - 1] =
'\0';
95 new_dentry->inode = create_result.value();
96 dentry = new_dentry.get();
97 AddChild(parent_dentry, new_dentry.release());
99 dentry = lookup_result.value();
102 if (dentry ==
nullptr || dentry->
inode ==
nullptr) {
113 auto new_file = kstd::make_unique<File>();
117 File* file = new_file.release();
126 if (file->
inode !=
nullptr && file->
inode->
fs !=
nullptr) {
138 static_cast<uint32_t
>(flags));
Dentry — 目录项缓存(路径名 ↔ Inode 的映射)