16 if (path ==
nullptr) {
22 char parent_path[512];
24 const char* last_slash =
strrchr(path,
'/');
25 if (last_slash ==
nullptr || last_slash == path) {
26 strncpy(parent_path,
"/",
sizeof(parent_path));
27 strncpy(file_name, path[0] ==
'/' ? path + 1 : path,
sizeof(file_name));
29 size_t parent_len = last_slash - path;
30 if (parent_len >=
sizeof(parent_path)) {
31 parent_len =
sizeof(parent_path) - 1;
33 strncpy(parent_path, path, parent_len);
34 parent_path[parent_len] =
'\0';
35 strncpy(file_name, last_slash + 1,
sizeof(file_name));
37 file_name[
sizeof(file_name) - 1] =
'\0';
40 auto parent_result =
Lookup(parent_path);
41 if (!parent_result.has_value()) {
42 return std::unexpected(parent_result.error());
45 Dentry* parent_dentry = parent_result.value();
46 if (parent_dentry->
inode ==
nullptr) {
52 if (target_dentry ==
nullptr) {
56 if (target_dentry->
inode ==
nullptr) {
66 if (parent_dentry->
inode->
ops ==
nullptr) {
72 if (!result.has_value()) {
73 return std::unexpected(result.error());
81 target_dentry->
inode =
nullptr;
83 etl::unique_ptr<Dentry> dentry_guard(target_dentry);
Dentry — 目录项缓存(路径名 ↔ Inode 的映射)
bool deleted
标记为已删除(unlink/rmdir 时 ref_count > 0)