| 513 | } |
| 514 | |
| 515 | BAN::ErrorOr<void> Ext2Inode::create_file_impl(BAN::StringView name, mode_t mode, uid_t uid, gid_t gid) |
| 516 | { |
| 517 | ASSERT(this->mode().ifdir()); |
| 518 | |
| 519 | switch (mode & Inode::Mode::TYPE_MASK) |
| 520 | { |
| 521 | case Inode::Mode::IFLNK: |
| 522 | case Inode::Mode::IFREG: |
| 523 | case Inode::Mode::IFIFO: |
| 524 | case Inode::Mode::IFSOCK: |
| 525 | break; |
| 526 | return BAN::Error::from_errno(ENOTSUP); |
| 527 | } |
| 528 | |
| 529 | RWLockWRGuard _(m_lock); |
| 530 | |
| 531 | if (!find_inode_no_lock(name).is_error()) |
| 532 | return BAN::Error::from_errno(EEXIST); |
| 533 | |
| 534 | const uint32_t new_ino = TRY(m_fs.create_inode(initialize_new_inode_info(mode, uid, gid))); |
| 535 | |
| 536 | auto inode_or_error = m_fs.open_inode(new_ino); |
| 537 | if (inode_or_error.is_error()) |
| 538 | { |
| 539 | TRY(m_fs.delete_inode(new_ino)); |
| 540 | return inode_or_error.release_error(); |
| 541 | } |
| 542 | |
| 543 | auto inode = inode_or_error.release_value(); |
| 544 | |
| 545 | TRY(link_inode_to_directory_no_lock(*inode, name)); |
| 546 | |
| 547 | return {}; |
| 548 | } |
| 549 | |
| 550 | BAN::ErrorOr<void> Ext2Inode::create_directory_impl(BAN::StringView name, mode_t mode, uid_t uid, gid_t gid) |
| 551 | { |
nothing calls this directly
no test coverage detected