SimpleKernel 1.17.0
Loading...
Searching...
No Matches
ramfs::RamFs::RamFsInodeOps Class Reference

Inode 操作实现类 More...

#include <ramfs.hpp>

Inheritance diagram for ramfs::RamFs::RamFsInodeOps:
Inheritance graph
Collaboration diagram for ramfs::RamFs::RamFsInodeOps:
Collaboration graph

Public Member Functions

 RamFsInodeOps (RamFs *fs)
 
auto Lookup (vfs::Inode *dir, const char *name) -> Expected< vfs::Inode * > override
 在目录中查找指定名称的 inode
 
auto Create (vfs::Inode *dir, const char *name, vfs::FileType type) -> Expected< vfs::Inode * > override
 在目录中创建新文件
 
auto Unlink (vfs::Inode *dir, const char *name) -> Expected< void > override
 删除文件(解除链接)
 
auto Mkdir (vfs::Inode *dir, const char *name) -> Expected< vfs::Inode * > override
 创建目录
 
auto Rmdir (vfs::Inode *dir, const char *name) -> Expected< void > override
 删除目录
 
- Public Member Functions inherited from vfs::InodeOps
 InodeOps ()=default
 
 InodeOps (const InodeOps &)=delete
 
 InodeOps (InodeOps &&)=delete
 
auto operator= (const InodeOps &) -> InodeOps &=delete
 
auto operator= (InodeOps &&) -> InodeOps &=delete
 
virtual ~InodeOps ()=default
 

Private Attributes

RamFsfs_
 

Detailed Description

Inode 操作实现类

Definition at line 91 of file ramfs.hpp.

Constructor & Destructor Documentation

◆ RamFsInodeOps()

ramfs::RamFs::RamFsInodeOps::RamFsInodeOps ( RamFs fs)
inlineexplicit

Definition at line 93 of file ramfs.hpp.

93: fs_(fs) {}

Member Function Documentation

◆ Create()

auto ramfs::RamFs::RamFsInodeOps::Create ( vfs::Inode dir,
const char *  name,
vfs::FileType  type 
) -> Expected< vfs::Inode * >
overridevirtual

在目录中创建新文件

Parameters
dir父目录 inode
name文件名
type文件类型
Returns
Expected<Inode*> 新创建的 inode 或错误
Precondition
dir != nullptr && dir->type == FileType::kDirectory
name != nullptr && strlen(name) > 0
Postcondition
返回的 inode->type == type

Implements vfs::InodeOps.

Definition at line 188 of file ramfs.cpp.

189 {
190 if (dir == nullptr || name == nullptr) {
191 return std::unexpected(Error(ErrorCode::kInvalidArgument));
192 }
193
194 if (type != FileType::kRegular && type != FileType::kDirectory) {
195 return std::unexpected(Error(ErrorCode::kInvalidArgument));
196 }
197
198 RamInode* ram_dir = static_cast<RamInode*>(dir->fs_private);
199
200 // 分配新 inode
201 auto alloc_result = fs_->AllocateInode();
202 if (!alloc_result.has_value()) {
203 return std::unexpected(alloc_result.error());
204 }
205
206 Inode* new_inode = alloc_result.value();
207 new_inode->type = type;
208
209 // 添加到目录
210 auto add_result = fs_->AddToDirectory(ram_dir, name, new_inode);
211 if (!add_result.has_value()) {
212 fs_->FreeInode(new_inode);
213 return std::unexpected(add_result.error());
214 }
215
216 return new_inode;
217}
auto AllocateInode() -> Expected< vfs::Inode * > override
分配新 inode
Definition ramfs.cpp:109
auto AddToDirectory(RamInode *dir, const char *name, vfs::Inode *inode) -> Expected< void >
Definition ramfs.cpp:497
auto FreeInode(vfs::Inode *inode) -> Expected< void > override
释放 inode
Definition ramfs.cpp:136
@ kInvalidArgument
错误类型,用于 std::expected
Definition expected.hpp:343
void * fs_private
文件系统私有数据指针
Definition vfs.hpp:28

◆ Lookup()

auto ramfs::RamFs::RamFsInodeOps::Lookup ( vfs::Inode dir,
const char *  name 
) -> Expected< vfs::Inode * >
overridevirtual

在目录中查找指定名称的 inode

Parameters
dir父目录 inode
name要查找的文件名
Returns
Expected<Inode*> 找到的 inode 或错误
Precondition
dir != nullptr && dir->type == FileType::kDirectory
name != nullptr && strlen(name) > 0

Implements vfs::InodeOps.

Definition at line 171 of file ramfs.cpp.

172 {
173 if (dir == nullptr || name == nullptr) {
174 return std::unexpected(Error(ErrorCode::kInvalidArgument));
175 }
176
177 RamInode* ram_dir = static_cast<RamInode*>(dir->fs_private);
178
179 RamDirEntry* entry = fs_->FindInDirectory(ram_dir, name);
180
181 if (entry == nullptr) {
182 return std::unexpected(Error(ErrorCode::kFsFileNotFound));
183 }
184
185 return entry->inode;
186}
auto FindInDirectory(RamInode *dir, const char *name) -> RamDirEntry *
Definition ramfs.cpp:481

◆ Mkdir()

auto ramfs::RamFs::RamFsInodeOps::Mkdir ( vfs::Inode dir,
const char *  name 
) -> Expected< vfs::Inode * >
overridevirtual

创建目录

Parameters
dir父目录 inode
name目录名
Returns
Expected<Inode*> 新创建的目录 inode 或错误
Precondition
dir != nullptr && dir->type == FileType::kDirectory
name != nullptr && strlen(name) > 0
Postcondition
返回的 inode->type == FileType::kDirectory

Implements vfs::InodeOps.

Definition at line 252 of file ramfs.cpp.

253 {
254 // 复用 Create,但指定类型为目录
255 return Create(dir, name, FileType::kDirectory);
256}
auto Create(vfs::Inode *dir, const char *name, vfs::FileType type) -> Expected< vfs::Inode * > override
在目录中创建新文件
Definition ramfs.cpp:188

◆ Rmdir()

auto ramfs::RamFs::RamFsInodeOps::Rmdir ( vfs::Inode dir,
const char *  name 
) -> Expected< void >
overridevirtual

删除目录

Parameters
dir父目录 inode
name要删除的目录名
Returns
Expected<void> 成功或错误
Precondition
dir != nullptr && dir->type == FileType::kDirectory
name != nullptr

Implements vfs::InodeOps.

Definition at line 258 of file ramfs.cpp.

259 {
260 if (dir == nullptr || name == nullptr) {
261 return std::unexpected(Error(ErrorCode::kInvalidArgument));
262 }
263
264 RamInode* ram_dir = static_cast<RamInode*>(dir->fs_private);
265
266 // 查找目标
267 RamDirEntry* entry = fs_->FindInDirectory(ram_dir, name);
268 if (entry == nullptr) {
269 return std::unexpected(Error(ErrorCode::kFsFileNotFound));
270 }
271
272 // 必须是目录
273 if (entry->inode == nullptr || entry->inode->type != FileType::kDirectory) {
274 return std::unexpected(Error(ErrorCode::kFsNotADirectory));
275 }
276
277 // 检查目录是否为空
278 RamInode* target = static_cast<RamInode*>(entry->inode->fs_private);
279 if (!fs_->IsDirectoryEmpty(target)) {
280 return std::unexpected(Error(ErrorCode::kFsNotEmpty));
281 }
282
283 // 从目录中移除
284 auto remove_result = fs_->RemoveFromDirectory(ram_dir, name);
285 if (!remove_result.has_value()) {
286 return remove_result;
287 }
288
289 // 释放 inode
290 if (entry->inode->link_count == 0) {
291 fs_->FreeInode(entry->inode);
292 }
293
294 return {};
295}
auto IsDirectoryEmpty(RamInode *dir) -> bool
Definition ramfs.cpp:571
auto RemoveFromDirectory(RamInode *dir, const char *name) -> Expected< void >
Definition ramfs.cpp:544
@ kFsNotADirectory

◆ Unlink()

auto ramfs::RamFs::RamFsInodeOps::Unlink ( vfs::Inode dir,
const char *  name 
) -> Expected< void >
overridevirtual

删除文件(解除链接)

Parameters
dir父目录 inode
name要删除的文件名
Returns
Expected<void> 成功或错误
Precondition
dir != nullptr && dir->type == FileType::kDirectory
name != nullptr

Implements vfs::InodeOps.

Definition at line 219 of file ramfs.cpp.

220 {
221 if (dir == nullptr || name == nullptr) {
222 return std::unexpected(Error(ErrorCode::kInvalidArgument));
223 }
224
225 RamInode* ram_dir = static_cast<RamInode*>(dir->fs_private);
226
227 // 查找目标
228 RamDirEntry* entry = fs_->FindInDirectory(ram_dir, name);
229 if (entry == nullptr) {
230 return std::unexpected(Error(ErrorCode::kFsFileNotFound));
231 }
232
233 // 不能删除目录
234 if (entry->inode != nullptr && entry->inode->type == FileType::kDirectory) {
235 return std::unexpected(Error(ErrorCode::kFsIsADirectory));
236 }
237
238 // 从目录中移除
239 auto remove_result = fs_->RemoveFromDirectory(ram_dir, name);
240 if (!remove_result.has_value()) {
241 return remove_result;
242 }
243
244 // 如果链接计数为 0,释放 inode
245 if (entry->inode != nullptr && entry->inode->link_count == 0) {
246 fs_->FreeInode(entry->inode);
247 }
248
249 return {};
250}

Member Data Documentation

◆ fs_

RamFs* ramfs::RamFs::RamFsInodeOps::fs_
private

Definition at line 104 of file ramfs.hpp.


The documentation for this class was generated from the following files: