diff --git a/kernel/include/kernel/Audio/Controller.h b/kernel/include/kernel/Audio/Controller.h index 698ebe0b..662e67cb 100644 --- a/kernel/include/kernel/Audio/Controller.h +++ b/kernel/include/kernel/Audio/Controller.h @@ -14,7 +14,6 @@ namespace Kernel public: static BAN::ErrorOr create(PCI::Device& pci_device); - dev_t rdev() const override { return m_rdev; } BAN::StringView name() const override { return m_name; } protected: @@ -51,7 +50,6 @@ namespace Kernel snd_volume_info m_volume_info {}; private: - const dev_t m_rdev; char m_name[10] {}; }; diff --git a/kernel/include/kernel/Device/DebugDevice.h b/kernel/include/kernel/Device/DebugDevice.h index dbe15df9..7954d734 100644 --- a/kernel/include/kernel/Device/DebugDevice.h +++ b/kernel/include/kernel/Device/DebugDevice.h @@ -8,15 +8,14 @@ namespace Kernel public: static BAN::ErrorOr> create(mode_t, uid_t, gid_t); - virtual dev_t rdev() const override { return m_rdev; } - virtual BAN::StringView name() const override { return "debug"_sv; } protected: DebugDevice(mode_t mode, uid_t uid, gid_t gid, dev_t rdev) : CharacterDevice(mode, uid, gid) - , m_rdev(rdev) - { } + { + m_rdev = rdev; + } virtual BAN::ErrorOr read_impl(off_t, BAN::ByteSpan) override { return 0; } virtual BAN::ErrorOr write_impl(off_t, BAN::ConstByteSpan buffer) override; @@ -25,9 +24,6 @@ namespace Kernel virtual bool can_write_impl() const override { return true; } virtual bool has_error_impl() const override { return false; } virtual bool has_hungup_impl() const override { return false; } - - private: - const dev_t m_rdev; }; } diff --git a/kernel/include/kernel/Device/Device.h b/kernel/include/kernel/Device/Device.h index 617a107b..9163be6c 100644 --- a/kernel/include/kernel/Device/Device.h +++ b/kernel/include/kernel/Device/Device.h @@ -22,8 +22,6 @@ namespace Kernel return BAN::Error::from_errno(ENOTSUP); } - virtual dev_t rdev() const override = 0; - virtual BAN::StringView name() const = 0; protected: @@ -45,7 +43,7 @@ namespace Kernel BlockDevice(mode_t mode, uid_t uid, gid_t gid) : Device(mode, uid, gid) { - m_inode_info.mode |= Inode::Mode::IFBLK; + m_mode |= Inode::Mode::IFBLK; } }; @@ -55,7 +53,7 @@ namespace Kernel CharacterDevice(mode_t mode, uid_t uid, gid_t gid) : Device(mode, uid, gid) { - m_inode_info.mode |= Inode::Mode::IFCHR; + m_mode |= Inode::Mode::IFCHR; } }; diff --git a/kernel/include/kernel/Device/FramebufferDevice.h b/kernel/include/kernel/Device/FramebufferDevice.h index f298aaca..3e88dbab 100644 --- a/kernel/include/kernel/Device/FramebufferDevice.h +++ b/kernel/include/kernel/Device/FramebufferDevice.h @@ -30,7 +30,6 @@ namespace Kernel virtual BAN::ErrorOr> mmap_region(PageTable&, off_t offset, size_t len, AddressRange, MemoryRegion::Type, PageTable::flags_t, int status_flags) override; - virtual dev_t rdev() const override { return m_rdev; } virtual BAN::StringView name() const override { return m_name.sv(); } protected: @@ -50,7 +49,6 @@ namespace Kernel private: const BAN::String m_name; - const dev_t m_rdev; vaddr_t m_video_memory_vaddr { 0 }; const paddr_t m_video_memory_paddr; diff --git a/kernel/include/kernel/Device/NullDevice.h b/kernel/include/kernel/Device/NullDevice.h index fe213f68..246a0432 100644 --- a/kernel/include/kernel/Device/NullDevice.h +++ b/kernel/include/kernel/Device/NullDevice.h @@ -10,15 +10,14 @@ namespace Kernel public: static BAN::ErrorOr> create(mode_t, uid_t, gid_t); - virtual dev_t rdev() const override { return m_rdev; } - virtual BAN::StringView name() const override { return "null"_sv; } protected: NullDevice(mode_t mode, uid_t uid, gid_t gid, dev_t rdev) : CharacterDevice(mode, uid, gid) - , m_rdev(rdev) - { } + { + m_rdev = rdev; + } virtual BAN::ErrorOr read_impl(off_t, BAN::ByteSpan) override { return 0; } virtual BAN::ErrorOr write_impl(off_t, BAN::ConstByteSpan buffer) override { return buffer.size(); }; @@ -28,8 +27,6 @@ namespace Kernel virtual bool has_error_impl() const override { return false; } virtual bool has_hungup_impl() const override { return false; } - private: - const dev_t m_rdev; }; } diff --git a/kernel/include/kernel/Device/RandomDevice.h b/kernel/include/kernel/Device/RandomDevice.h index 6b9b552a..43de5c2c 100644 --- a/kernel/include/kernel/Device/RandomDevice.h +++ b/kernel/include/kernel/Device/RandomDevice.h @@ -8,15 +8,14 @@ namespace Kernel public: static BAN::ErrorOr> create(mode_t, uid_t, gid_t); - virtual dev_t rdev() const override { return m_rdev; } - virtual BAN::StringView name() const override { return "random"_sv; } protected: RandomDevice(mode_t mode, uid_t uid, gid_t gid, dev_t rdev) : CharacterDevice(mode, uid, gid) - , m_rdev(rdev) - { } + { + m_rdev = rdev; + } virtual BAN::ErrorOr read_impl(off_t, BAN::ByteSpan) override; virtual BAN::ErrorOr write_impl(off_t, BAN::ConstByteSpan buffer) override { return buffer.size(); }; @@ -25,9 +24,6 @@ namespace Kernel virtual bool can_write_impl() const override { return false; } virtual bool has_error_impl() const override { return false; } virtual bool has_hungup_impl() const override { return false; } - - private: - const dev_t m_rdev; }; } diff --git a/kernel/include/kernel/Device/ZeroDevice.h b/kernel/include/kernel/Device/ZeroDevice.h index e3791d56..6d13de15 100644 --- a/kernel/include/kernel/Device/ZeroDevice.h +++ b/kernel/include/kernel/Device/ZeroDevice.h @@ -8,15 +8,14 @@ namespace Kernel public: static BAN::ErrorOr> create(mode_t, uid_t, gid_t); - virtual dev_t rdev() const override { return m_rdev; } - virtual BAN::StringView name() const override { return "zero"_sv; } protected: ZeroDevice(mode_t mode, uid_t uid, gid_t gid, dev_t rdev) : CharacterDevice(mode, uid, gid) - , m_rdev(rdev) - { } + { + m_rdev = rdev; + } virtual BAN::ErrorOr read_impl(off_t, BAN::ByteSpan) override; virtual BAN::ErrorOr write_impl(off_t, BAN::ConstByteSpan buffer) override { return buffer.size(); }; @@ -25,9 +24,6 @@ namespace Kernel virtual bool can_write_impl() const override { return false; } virtual bool has_error_impl() const override { return false; } virtual bool has_hungup_impl() const override { return false; } - - private: - const dev_t m_rdev; }; } diff --git a/kernel/include/kernel/Epoll.h b/kernel/include/kernel/Epoll.h index a56157aa..35a4e1c1 100644 --- a/kernel/include/kernel/Epoll.h +++ b/kernel/include/kernel/Epoll.h @@ -21,23 +21,23 @@ namespace Kernel void notify(BAN::RefPtr inode, uint32_t event); private: - Epoll() = default; + Epoll() { + m_ino = 0; + m_mode = Mode::IRUSR | Mode::IWUSR; + m_nlink = 0; + m_uid = 0; + m_gid = 0; + m_size = 0; + m_atime = {}; + m_mtime = {}; + m_ctime = {}; + m_blksize = PAGE_SIZE; + m_blocks = 0; + m_dev = 0; + m_rdev = 0; + } public: - ino_t ino() const override { return 0; } - Mode mode() const override { return { Mode::IRUSR | Mode::IWUSR }; } - nlink_t nlink() const override { return 0; } - uid_t uid() const override { return 0; } - gid_t gid() const override { return 0; } - off_t size() const override { return 0; } - timespec atime() const override { return {}; } - timespec mtime() const override { return {}; } - timespec ctime() const override { return {}; } - blksize_t blksize() const override { return PAGE_SIZE; } - blkcnt_t blocks() const override { return 0; } - dev_t dev() const override { return 0; } - dev_t rdev() const override { return 0; } - bool is_epoll() const override { return true; } const FileSystem* filesystem() const override { return nullptr; } diff --git a/kernel/include/kernel/FS/EventFD.h b/kernel/include/kernel/FS/EventFD.h index 9e027ea6..a5cb8b39 100644 --- a/kernel/include/kernel/FS/EventFD.h +++ b/kernel/include/kernel/FS/EventFD.h @@ -11,20 +11,6 @@ namespace Kernel public: static BAN::ErrorOr> create(uint64_t initval, bool semaphore); - ino_t ino() const override { return 0; } - Mode mode() const override { return { Mode::IFCHR | Mode::IRUSR | Mode::IWUSR }; } - nlink_t nlink() const override { return ref_count(); } - uid_t uid() const override { return 0; } - gid_t gid() const override { return 0; } - off_t size() const override { return 0; } - timespec atime() const override { return {}; } - timespec mtime() const override { return {}; } - timespec ctime() const override { return {}; } - blksize_t blksize() const override { return 8; } - blkcnt_t blocks() const override { return 0; } - dev_t dev() const override { return 0; } - dev_t rdev() const override { return 0; } - const FileSystem* filesystem() const override { return nullptr; } protected: @@ -41,7 +27,21 @@ namespace Kernel EventFD(uint64_t initval, bool is_semaphore) : m_is_semaphore(is_semaphore) , m_value(initval) - { } + { + m_ino = 0; + m_mode = { Mode::IFCHR | Mode::IRUSR | Mode::IWUSR }; + m_nlink = 0; + m_uid = 0; + m_gid = 0; + m_size = 0; + m_atime = {}; + m_mtime = {}; + m_ctime = {}; + m_blksize = 8; + m_blocks = 0; + m_dev = 0; + m_rdev = 0; + } private: const bool m_is_semaphore; diff --git a/kernel/include/kernel/FS/Ext2/Definitions.h b/kernel/include/kernel/FS/Ext2/Definitions.h index 7c1c3f8a..8ed5056b 100644 --- a/kernel/include/kernel/FS/Ext2/Definitions.h +++ b/kernel/include/kernel/FS/Ext2/Definitions.h @@ -79,6 +79,12 @@ namespace Kernel::Ext2 uint8_t __reserved[12]; }; + struct InodeBlocks { + uint32_t block[15]; + }; + struct Osd2 { + uint32_t osd2[3]; + }; struct Inode { uint16_t mode; @@ -93,12 +99,12 @@ namespace Kernel::Ext2 uint32_t blocks; uint32_t flags; uint32_t osd1; - uint32_t block[15]; + InodeBlocks block; uint32_t generation; uint32_t file_acl; uint32_t dir_acl; uint32_t faddr; - uint32_t osd2[3]; + Osd2 osd2; }; struct LinkedDirectoryEntry diff --git a/kernel/include/kernel/FS/Ext2/Inode.h b/kernel/include/kernel/FS/Ext2/Inode.h index 5a855880..422c24c9 100644 --- a/kernel/include/kernel/FS/Ext2/Inode.h +++ b/kernel/include/kernel/FS/Ext2/Inode.h @@ -16,6 +16,7 @@ namespace Kernel public: ~Ext2Inode(); +#if 0 virtual ino_t ino() const override { return m_ino; }; virtual Mode mode() const override { return { m_inode.mode }; } virtual nlink_t nlink() const override { return m_inode.links_count; } @@ -29,6 +30,7 @@ namespace Kernel virtual blkcnt_t blocks() const override; virtual dev_t dev() const override { return 0; } virtual dev_t rdev() const override { return 0; } +#endif virtual const FileSystem* filesystem() const override; @@ -84,11 +86,8 @@ namespace Kernel BAN::ErrorOr cleanup_from_fs_no_lock(); private: - Ext2Inode(Ext2FS& fs, Ext2::Inode inode, uint32_t ino) - : m_fs(fs) - , m_inode(inode) - , m_ino(ino) - {} + Ext2Inode(Ext2FS& fs, Ext2::Inode inode, uint32_t ino); + static BAN::ErrorOr> create(Ext2FS&, uint32_t); private: @@ -96,28 +95,35 @@ namespace Kernel { ScopedSync(Ext2Inode& inode) : inode(inode) - , inode_info(inode.m_inode) { } ~ScopedSync() { - if (memcmp(&inode.m_inode, &inode_info, sizeof(Ext2::Inode)) == 0) - return; + // TODO: there was some memcmp smarty pants stuff here. + // How do we wanna approach it? if (auto ret = inode.sync_no_lock(); ret.is_error()) dwarnln("failed to sync inode: {}", ret.error()); } Ext2Inode& inode; - Ext2::Inode inode_info; }; private: Ext2FS& m_fs; - Ext2::Inode m_inode; - const uint32_t m_ino; - RWLock m_lock; + Ext2::InodeBlocks m_ext2_blocks; + // NOTE: some fields from the original disk inode + // that we do not use, but we keep for serialise. + const uint32_t m_og_dtime; + const uint32_t m_og_flags; + const uint32_t m_og_osd1; + const uint32_t m_og_generation; + const uint32_t m_og_file_acl; + const uint32_t m_og_dir_acl; + const uint32_t m_og_faddr; + const Ext2::Osd2 m_og_osd2; + friend class Ext2FS; friend class BAN::RefPtr; }; diff --git a/kernel/include/kernel/FS/FAT/Inode.h b/kernel/include/kernel/FS/FAT/Inode.h index 6753a7fd..515543c9 100644 --- a/kernel/include/kernel/FS/FAT/Inode.h +++ b/kernel/include/kernel/FS/FAT/Inode.h @@ -15,20 +15,6 @@ namespace Kernel class FATInode final : public Inode, public BAN::Weakable { public: - virtual ino_t ino() const override { return m_ino; }; - virtual Mode mode() const override { return Mode { ((m_entry.attr & FAT::FileAttr::DIRECTORY) ? Mode::IFDIR : Mode::IFREG) | 0777 }; } - virtual nlink_t nlink() const override { return 1; } - virtual uid_t uid() const override { return 0; } - virtual gid_t gid() const override { return 0; } - virtual off_t size() const override { return m_entry.file_size; } - virtual timespec atime() const override; - virtual timespec mtime() const override; - virtual timespec ctime() const override; - virtual blksize_t blksize() const override; - virtual blkcnt_t blocks() const override { return m_block_count; } - virtual dev_t dev() const override { return 0; } - virtual dev_t rdev() const override { return 0; } - virtual const FileSystem* filesystem() const override; const FAT::DirectoryEntry& entry() const { return m_entry; } @@ -53,12 +39,8 @@ namespace Kernel virtual bool has_hungup_impl() const override { return false; } private: - FATInode(FATFS& fs, const FAT::DirectoryEntry& entry, ino_t ino, uint32_t block_count) - : m_fs(fs) - , m_entry(entry) - , m_ino(ino) - , m_block_count(block_count) - { } + FATInode(FATFS& fs, const FAT::DirectoryEntry& entry, ino_t ino, uint32_t block_count); + ~FATInode() {} BAN::ErrorOr for_each_directory_entry(BAN::ConstByteSpan, BAN::Function); @@ -67,7 +49,6 @@ namespace Kernel private: FATFS& m_fs; FAT::DirectoryEntry m_entry; - const ino_t m_ino; uint32_t m_block_count; friend class Ext2FS; diff --git a/kernel/include/kernel/FS/Inode.h b/kernel/include/kernel/FS/Inode.h index 5d6d9afa..1d6c6008 100644 --- a/kernel/include/kernel/FS/Inode.h +++ b/kernel/include/kernel/FS/Inode.h @@ -69,19 +69,19 @@ namespace Kernel bool operator==(const Inode& other) const { return dev() == other.dev() && ino() == other.ino(); } - virtual ino_t ino() const = 0; - virtual Mode mode() const = 0; - virtual nlink_t nlink() const = 0; - virtual uid_t uid() const = 0; - virtual gid_t gid() const = 0; - virtual off_t size() const = 0; - virtual timespec atime() const = 0; - virtual timespec mtime() const = 0; - virtual timespec ctime() const = 0; - virtual blksize_t blksize() const = 0; - virtual blkcnt_t blocks() const = 0; - virtual dev_t dev() const = 0; - virtual dev_t rdev() const = 0; + ino_t ino() const { return m_ino; } + Mode mode() const { return Mode(m_mode); } + nlink_t nlink() const { return m_nlink; } + uid_t uid() const { return m_uid; } + gid_t gid() const { return m_gid; } + off_t size() const { return m_size; } + timespec atime() const { return m_atime; } + timespec mtime() const { return m_mtime; } + timespec ctime() const { return m_ctime; } + blksize_t blksize() const { return m_blksize; } + blkcnt_t blocks() const { return m_blocks; } + dev_t dev() const { return m_dev; } + dev_t rdev() const { return m_rdev; } virtual bool is_device() const { return false; } virtual bool is_epoll() const { return false; } @@ -182,6 +182,21 @@ namespace Kernel virtual BAN::ErrorOr ioctl_impl(int, void*) { return BAN::Error::from_errno(ENOTSUP); } + protected: + BAN::Atomic m_ino; + BAN::Atomic m_mode; + BAN::Atomic m_nlink; + BAN::Atomic m_uid; + BAN::Atomic m_gid; + BAN::Atomic m_size; + // TODO: make these guys atomic :) + timespec m_atime; + timespec m_mtime; + timespec m_ctime; + BAN::Atomic m_blksize; + BAN::Atomic m_blocks; + BAN::Atomic m_dev; + BAN::Atomic m_rdev; private: SpinLock m_shared_region_lock; BAN::WeakPtr m_shared_region; diff --git a/kernel/include/kernel/FS/Pipe.h b/kernel/include/kernel/FS/Pipe.h index 86af31d0..e5d0a167 100644 --- a/kernel/include/kernel/FS/Pipe.h +++ b/kernel/include/kernel/FS/Pipe.h @@ -18,20 +18,6 @@ namespace Kernel void on_close(int status_flags) override; void on_clone(int status_flags) override; - virtual ino_t ino() const override { return 0; } // FIXME - virtual Mode mode() const override { return { Mode::IFIFO | Mode::IRUSR | Mode::IWUSR }; } - virtual nlink_t nlink() const override { return 1; } - virtual uid_t uid() const override { return m_uid; } - virtual gid_t gid() const override { return m_gid; } - virtual off_t size() const override { return 0; } - virtual timespec atime() const override { return m_atime; } - virtual timespec mtime() const override { return m_mtime; } - virtual timespec ctime() const override { return m_ctime; } - virtual blksize_t blksize() const override { return 4096; } - virtual blkcnt_t blocks() const override { return 0; } - virtual dev_t dev() const override { return 0; } // FIXME - virtual dev_t rdev() const override { return 0; } // FIXME - virtual const FileSystem* filesystem() const override { return nullptr; } protected: @@ -50,12 +36,6 @@ namespace Kernel Pipe(const Credentials&); private: - const uid_t m_uid; - const gid_t m_gid; - timespec m_atime {}; - timespec m_mtime {}; - timespec m_ctime {}; - Mutex m_mutex; ThreadBlocker m_thread_blocker; diff --git a/kernel/include/kernel/FS/ProcFS/Inode.h b/kernel/include/kernel/FS/ProcFS/Inode.h index 91b63c54..1e937396 100644 --- a/kernel/include/kernel/FS/ProcFS/Inode.h +++ b/kernel/include/kernel/FS/ProcFS/Inode.h @@ -9,34 +9,27 @@ namespace Kernel class ProcPidInode final : public TmpDirectoryInode { + // FIXME: dynamically update ruid/rgid. + // Possibly just have a magic uid/gid of -1 or something + // which means use current process ID public: static BAN::ErrorOr> create_new(Process&, TmpFileSystem&, mode_t); ~ProcPidInode() = default; - virtual uid_t uid() const override { return m_process.credentials().ruid(); } - virtual gid_t gid() const override { return m_process.credentials().rgid(); } - void cleanup(); - protected: virtual BAN::ErrorOr unlink_impl(BAN::StringView) override { return BAN::Error::from_errno(EPERM); } private: ProcPidInode(Process&, TmpFileSystem&, const TmpInodeInfo&); - - private: - Process& m_process; }; class ProcROProcessInode final : public TmpInode { + //FIXME: dynamically update ruid/rgid public: static BAN::ErrorOr> create_new(Process&, size_t (Process::*callback)(off_t, BAN::ByteSpan) const, TmpFileSystem&, mode_t); ~ProcROProcessInode() = default; - - virtual uid_t uid() const override { return m_process.credentials().ruid(); } - virtual gid_t gid() const override { return m_process.credentials().rgid(); } - protected: virtual BAN::ErrorOr read_impl(off_t, BAN::ByteSpan) override; @@ -59,13 +52,11 @@ namespace Kernel class ProcSymlinkProcessInode final : public TmpInode { + //FIXME: dynamically update ruid/rgid public: static BAN::ErrorOr> create_new(Process& process, BAN::ErrorOr (Process::*callback)() const, TmpFileSystem&, mode_t); ~ProcSymlinkProcessInode() = default; - virtual uid_t uid() const override { return m_process.credentials().ruid(); } - virtual gid_t gid() const override { return m_process.credentials().rgid(); } - protected: virtual BAN::ErrorOr link_target_impl() override; @@ -132,13 +123,10 @@ namespace Kernel class ProcFDDirectoryInode final : public TmpInode { + //FIXME: dynamically update ruid/rgid public: static BAN::ErrorOr> create_new(Process&, TmpFileSystem&, mode_t); ~ProcFDDirectoryInode() = default; - - virtual uid_t uid() const override { return m_process.credentials().ruid(); } - virtual gid_t gid() const override { return m_process.credentials().rgid(); } - protected: virtual BAN::ErrorOr> find_inode_impl(BAN::StringView) override; virtual BAN::ErrorOr list_next_inodes_impl(off_t, struct dirent*, size_t) override; diff --git a/kernel/include/kernel/FS/Socket.h b/kernel/include/kernel/FS/Socket.h index 7e719e80..c1555aa3 100644 --- a/kernel/include/kernel/FS/Socket.h +++ b/kernel/include/kernel/FS/Socket.h @@ -30,31 +30,19 @@ namespace Kernel }; public: - ino_t ino() const final override { ASSERT_NOT_REACHED(); } - Mode mode() const final override { return Mode(m_info.mode); } - nlink_t nlink() const final override { ASSERT_NOT_REACHED(); } - uid_t uid() const final override { return m_info.uid; } - gid_t gid() const final override { return m_info.gid; } - off_t size() const final override { ASSERT_NOT_REACHED(); } - timespec atime() const final override { ASSERT_NOT_REACHED(); } - timespec mtime() const final override { ASSERT_NOT_REACHED(); } - timespec ctime() const final override { ASSERT_NOT_REACHED(); } - blksize_t blksize() const final override { ASSERT_NOT_REACHED(); } - blkcnt_t blocks() const final override { ASSERT_NOT_REACHED(); } - dev_t dev() const final override { ASSERT_NOT_REACHED(); } - dev_t rdev() const final override { ASSERT_NOT_REACHED(); } - const FileSystem* filesystem() const final override { return nullptr; } protected: Socket(const Info& info) - : m_info(info) - {} + { + m_mode = info.mode; + m_uid = info.uid; + m_gid = info.gid; + } BAN::ErrorOr fsync_impl() final override { return {}; } private: - const Info m_info; }; } diff --git a/kernel/include/kernel/FS/TmpFS/Definitions.h b/kernel/include/kernel/FS/TmpFS/Definitions.h index 1a885c1e..554eca9d 100644 --- a/kernel/include/kernel/FS/TmpFS/Definitions.h +++ b/kernel/include/kernel/FS/TmpFS/Definitions.h @@ -11,18 +11,8 @@ namespace Kernel { - struct TmpInodeInfo + struct TmpBlocks { - mode_t mode { 0 }; - uid_t uid { 0 }; - gid_t gid { 0 }; - timespec atime { 0, 0 }; - timespec ctime { 0, 0 }; - timespec mtime { 0, 0 }; - nlink_t nlink { 0 }; - size_t size { 0 }; - blkcnt_t blocks { 0 }; - #if ARCH(x86_64) // 2x direct blocks // 1x singly indirect @@ -41,8 +31,23 @@ namespace Kernel #else #error #endif + }; + + struct TmpInodeInfo + { + mode_t mode { 0 }; + uid_t uid { 0 }; + gid_t gid { 0 }; + timespec atime { 0, 0 }; + timespec ctime { 0, 0 }; + timespec mtime { 0, 0 }; + nlink_t nlink { 0 }; + size_t size { 0 }; + blkcnt_t blocks { 0 }; + TmpBlocks tmp_blocks; + static constexpr size_t max_size = - direct_block_count * PAGE_SIZE + + TmpBlocks::direct_block_count * PAGE_SIZE + (PAGE_SIZE / sizeof(paddr_t)) * PAGE_SIZE + (PAGE_SIZE / sizeof(paddr_t)) * (PAGE_SIZE / sizeof(paddr_t)) * PAGE_SIZE + (PAGE_SIZE / sizeof(paddr_t)) * (PAGE_SIZE / sizeof(paddr_t)) * (PAGE_SIZE / sizeof(paddr_t)) * PAGE_SIZE; diff --git a/kernel/include/kernel/FS/TmpFS/Inode.h b/kernel/include/kernel/FS/TmpFS/Inode.h index 051984b6..1c5ed682 100644 --- a/kernel/include/kernel/FS/TmpFS/Inode.h +++ b/kernel/include/kernel/FS/TmpFS/Inode.h @@ -24,21 +24,6 @@ namespace Kernel class TmpInode : public Inode { - public: - virtual ino_t ino() const override { return m_ino; } - virtual Mode mode() const override { return Mode(m_inode_info.mode); } - virtual nlink_t nlink() const override { return m_inode_info.nlink; } - virtual uid_t uid() const override { return m_inode_info.uid; } - virtual gid_t gid() const override { return m_inode_info.gid; } - virtual off_t size() const override { return m_inode_info.size; } - virtual timespec atime() const override { return m_inode_info.atime; } - virtual timespec mtime() const override { return m_inode_info.mtime; } - virtual timespec ctime() const override { return m_inode_info.ctime; } - virtual blksize_t blksize() const override { return PAGE_SIZE; } - virtual blkcnt_t blocks() const override { return m_inode_info.blocks; } - virtual dev_t dev() const override; - virtual dev_t rdev() const override { return 0; } - public: static BAN::ErrorOr> create_from_existing(TmpFileSystem&, ino_t, const TmpInodeInfo&); ~TmpInode(); @@ -47,7 +32,6 @@ namespace Kernel protected: TmpInode(TmpFileSystem&, ino_t, const TmpInodeInfo&); - virtual BAN::ErrorOr chmod_impl(mode_t) override; virtual BAN::ErrorOr chown_impl(uid_t, gid_t) override; virtual BAN::ErrorOr utimens_impl(const timespec[2]) override; @@ -67,8 +51,7 @@ namespace Kernel protected: TmpFileSystem& m_fs; - TmpInodeInfo m_inode_info; - const ino_t m_ino; + TmpBlocks m_tmp_blocks; // TODO: try to reduce locking or replace this with rwlock(?) Mutex m_lock; diff --git a/kernel/include/kernel/Input/InputDevice.h b/kernel/include/kernel/Input/InputDevice.h index 3ea03305..6404a69e 100644 --- a/kernel/include/kernel/Input/InputDevice.h +++ b/kernel/include/kernel/Input/InputDevice.h @@ -22,8 +22,6 @@ namespace Kernel InputDevice(Type type); BAN::StringView name() const final override { return m_name; } - dev_t rdev() const final override { return m_rdev; } - protected: void add_event(BAN::ConstByteSpan); @@ -38,8 +36,7 @@ namespace Kernel BAN::ErrorOr read_non_block(BAN::ByteSpan); private: - const dev_t m_rdev; - const BAN::String m_name; + BAN::String m_name; const Type m_type; @@ -77,10 +74,8 @@ namespace Kernel bool has_hungup_impl() const override { return false; } BAN::StringView name() const final override { return m_name; } - dev_t rdev() const final override { return m_rdev; } private: - const dev_t m_rdev; const BAN::StringView m_name; ThreadBlocker m_thread_blocker; @@ -104,10 +99,7 @@ namespace Kernel bool has_hungup_impl() const override { return false; } BAN::StringView name() const final override { return m_name; } - dev_t rdev() const final override { return m_rdev; } - private: - const dev_t m_rdev; const BAN::StringView m_name; ThreadBlocker m_thread_blocker; diff --git a/kernel/include/kernel/Networking/NetworkInterface.h b/kernel/include/kernel/Networking/NetworkInterface.h index e24ba0cd..94cae3eb 100644 --- a/kernel/include/kernel/Networking/NetworkInterface.h +++ b/kernel/include/kernel/Networking/NetworkInterface.h @@ -57,7 +57,6 @@ namespace Kernel virtual size_t payload_mtu() const = 0; - virtual dev_t rdev() const override { return m_rdev; } virtual BAN::StringView name() const override { return m_name; } BAN::ErrorOr send_bytes(BAN::MACAddress destination, EtherType protocol, BAN::ConstByteSpan payload) @@ -68,8 +67,6 @@ namespace Kernel private: const Type m_type; - - const dev_t m_rdev; char m_name[10]; BAN::IPv4Address m_ipv4_address { 0 }; diff --git a/kernel/include/kernel/Storage/ATA/ATADevice.h b/kernel/include/kernel/Storage/ATA/ATADevice.h index 524f9c47..87f7af02 100644 --- a/kernel/include/kernel/Storage/ATA/ATADevice.h +++ b/kernel/include/kernel/Storage/ATA/ATADevice.h @@ -31,8 +31,6 @@ namespace Kernel BAN::StringView model() const { return m_model; } BAN::StringView name() const override { return m_name; } - dev_t rdev() const override { return m_rdev; } - protected: ATABaseDevice(); BAN::ErrorOr initialize(BAN::Span identify_data); @@ -46,8 +44,6 @@ namespace Kernel bool m_has_lba; char m_model[41]; char m_name[4] {}; - - const dev_t m_rdev; }; } diff --git a/kernel/include/kernel/Storage/NVMe/Controller.h b/kernel/include/kernel/Storage/NVMe/Controller.h index 10256858..b47e8003 100644 --- a/kernel/include/kernel/Storage/NVMe/Controller.h +++ b/kernel/include/kernel/Storage/NVMe/Controller.h @@ -20,7 +20,6 @@ namespace Kernel NVMeQueue& io_queue() { return *m_io_queue; } - virtual dev_t rdev() const override { return m_rdev; } virtual BAN::StringView name() const override { return m_name; } protected: @@ -51,7 +50,6 @@ namespace Kernel BAN::Vector> m_namespaces; char m_name[20]; - const dev_t m_rdev; }; } diff --git a/kernel/include/kernel/Storage/NVMe/Namespace.h b/kernel/include/kernel/Storage/NVMe/Namespace.h index a25b2079..8c4f3779 100644 --- a/kernel/include/kernel/Storage/NVMe/Namespace.h +++ b/kernel/include/kernel/Storage/NVMe/Namespace.h @@ -16,7 +16,6 @@ namespace Kernel virtual uint32_t sector_size() const override { return m_block_size; } virtual uint64_t total_size() const override { return m_block_size * m_block_count; } - virtual dev_t rdev() const override { return m_rdev; } virtual BAN::StringView name() const override { return m_name; } private: @@ -35,7 +34,6 @@ namespace Kernel const uint64_t m_block_count; char m_name[10] {}; - const dev_t m_rdev; }; } diff --git a/kernel/include/kernel/Storage/Partition.h b/kernel/include/kernel/Storage/Partition.h index d769c8a9..197be51d 100644 --- a/kernel/include/kernel/Storage/Partition.h +++ b/kernel/include/kernel/Storage/Partition.h @@ -45,8 +45,6 @@ namespace Kernel public: virtual bool is_partition() const override { return true; } - virtual dev_t rdev() const override { return m_rdev; } - protected: virtual BAN::ErrorOr read_impl(off_t, BAN::ByteSpan) override; @@ -56,7 +54,6 @@ namespace Kernel virtual bool has_hungup_impl() const override { return false; } private: - const dev_t m_rdev; }; } diff --git a/kernel/include/kernel/Terminal/PseudoTerminal.h b/kernel/include/kernel/Terminal/PseudoTerminal.h index d39ef521..8e932026 100644 --- a/kernel/include/kernel/Terminal/PseudoTerminal.h +++ b/kernel/include/kernel/Terminal/PseudoTerminal.h @@ -13,7 +13,6 @@ namespace Kernel public: static BAN::ErrorOr> create(mode_t, uid_t, gid_t); - dev_t rdev() const override { return m_rdev; } BAN::StringView name() const override { return ""_sv; } BAN::ErrorOr> slave(); @@ -48,8 +47,6 @@ namespace Kernel size_t m_buffer_tail { 0 }; size_t m_buffer_size { 0 }; - const dev_t m_rdev; - friend class PseudoTerminalSlave; friend class BAN::RefPtr; }; diff --git a/kernel/include/kernel/Terminal/TTY.h b/kernel/include/kernel/Terminal/TTY.h index ee1ee01f..71ab1048 100644 --- a/kernel/include/kernel/Terminal/TTY.h +++ b/kernel/include/kernel/Terminal/TTY.h @@ -51,8 +51,6 @@ namespace Kernel virtual bool is_tty() const override { return true; } - virtual dev_t rdev() const final override { return m_rdev; } - virtual void clear() = 0; virtual BAN::ErrorOr chmod_impl(mode_t) override; @@ -84,8 +82,6 @@ namespace Kernel termios get_termios(); private: - const dev_t m_rdev; - BAN::Atomic m_foreground_pgrp { 0 }; struct tty_ctrl_t diff --git a/kernel/include/kernel/USB/MassStorage/SCSIDevice.h b/kernel/include/kernel/USB/MassStorage/SCSIDevice.h index f3a5733e..3abd2db8 100644 --- a/kernel/include/kernel/USB/MassStorage/SCSIDevice.h +++ b/kernel/include/kernel/USB/MassStorage/SCSIDevice.h @@ -15,7 +15,6 @@ namespace Kernel uint32_t sector_size() const override { return m_block_size; } uint64_t total_size() const override { return m_block_size * m_block_count; } - dev_t rdev() const override { return m_rdev; } BAN::StringView name() const override { return m_name; } private: @@ -34,7 +33,6 @@ namespace Kernel const uint64_t m_block_count; const uint32_t m_block_size; - const dev_t m_rdev; const char m_name[4]; friend class BAN::RefPtr; diff --git a/kernel/kernel/Audio/Controller.cpp b/kernel/kernel/Audio/Controller.cpp index 6fa6781f..c62dfd53 100644 --- a/kernel/kernel/Audio/Controller.cpp +++ b/kernel/kernel/Audio/Controller.cpp @@ -15,8 +15,8 @@ namespace Kernel AudioController::AudioController() : CharacterDevice(0644, 0, 0) - , m_rdev(makedev(DeviceNumber::AudioController, s_next_audio_minor++)) { + m_rdev = makedev(DeviceNumber::AudioController, s_next_audio_minor++); char* ptr = m_name; BAN::Formatter::print([&ptr](char c) { *ptr++ = c; }, "audio{}", minor(m_rdev)); } diff --git a/kernel/kernel/Device/FramebufferDevice.cpp b/kernel/kernel/Device/FramebufferDevice.cpp index f8e2b158..2d2df44e 100644 --- a/kernel/kernel/Device/FramebufferDevice.cpp +++ b/kernel/kernel/Device/FramebufferDevice.cpp @@ -52,13 +52,14 @@ namespace Kernel FramebufferDevice::FramebufferDevice(mode_t mode, uid_t uid, gid_t gid, dev_t rdev, paddr_t paddr, uint32_t width, uint32_t height, uint32_t pitch, uint8_t bpp) : CharacterDevice(mode, uid, gid) , m_name(MUST(BAN::String::formatted("fb{}", minor(rdev)))) - , m_rdev(rdev) , m_video_memory_paddr(paddr) , m_width(width) , m_height(height) , m_pitch(pitch) , m_bpp(bpp) - { } + { + m_rdev = rdev; + } FramebufferDevice::~FramebufferDevice() { diff --git a/kernel/kernel/FS/Ext2/FileSystem.cpp b/kernel/kernel/FS/Ext2/FileSystem.cpp index 9187f7b9..866feb63 100644 --- a/kernel/kernel/FS/Ext2/FileSystem.cpp +++ b/kernel/kernel/FS/Ext2/FileSystem.cpp @@ -281,7 +281,7 @@ namespace Kernel auto& inode = inode_buffer.span().slice(inode_location.offset).as(); #if EXT2_VERIFY_NO_BLOCKS static const char zero_buffer[sizeof(inode.block)] {}; - ASSERT(memcmp(inode.block, zero_buffer, sizeof(inode.block)) == 0); + ASSERT(memcmp(inode.block.block, zero_buffer, sizeof(inode.block)) == 0); #endif bool is_directory = Inode::Mode(inode.mode).ifdir(); memset(&inode, 0x00, m_superblock.inode_size); diff --git a/kernel/kernel/FS/Ext2/Inode.cpp b/kernel/kernel/FS/Ext2/Inode.cpp index 7d3e7410..cc64a45d 100644 --- a/kernel/kernel/FS/Ext2/Inode.cpp +++ b/kernel/kernel/FS/Ext2/Inode.cpp @@ -10,14 +10,31 @@ namespace Kernel { - blksize_t Ext2Inode::blksize() const + Ext2Inode::Ext2Inode(Ext2FS& fs, Ext2::Inode inode, uint32_t ino) + : m_fs(fs) + , m_ext2_blocks(inode.block) + , m_og_dtime(inode.dtime) + , m_og_flags(inode.flags) + , m_og_osd1(inode.osd1) + , m_og_generation(inode.generation) + , m_og_file_acl(inode.file_acl) + , m_og_dir_acl(inode.dir_acl) + , m_og_faddr(inode.faddr) + , m_og_osd2(inode.osd2) { - return m_fs.block_size(); - } - - blkcnt_t Ext2Inode::blocks() const - { - return m_inode.blocks / (2 << m_fs.superblock().log_block_size); + m_ino = ino; + m_mode = inode.mode; + m_nlink = inode.links_count; + m_uid = inode.uid; + m_gid = inode.gid; + m_size = inode.size; + m_atime = timespec { .tv_sec = inode.atime, .tv_nsec = 0 }; + m_mtime = timespec { .tv_sec = inode.mtime, .tv_nsec = 0 }; + m_ctime = timespec { .tv_sec = inode.ctime, .tv_nsec = 0 }; + m_dev = 0; + m_rdev = 0; + m_blksize = fs.block_size(); + m_blocks = inode.blocks / (2 << fs.superblock().log_block_size); } uint32_t Ext2Inode::block_group() const @@ -45,7 +62,7 @@ namespace Kernel Ext2Inode::~Ext2Inode() { - if (m_inode.links_count > 0) + if (m_nlink > 0) return; if (auto ret = cleanup_from_fs_no_lock(); ret.is_error()) dwarnln("Could not cleanup inode from FS: {}", ret.error()); @@ -58,7 +75,6 @@ namespace Kernel BAN::ErrorOr> Ext2Inode::block_from_indirect_block_no_lock(uint32_t& block, uint32_t index, uint32_t depth, bool allocate) { - const uint32_t inode_blocks_per_fs_block = blksize() / 512; const uint32_t indices_per_fs_block = blksize() / sizeof(uint32_t); if (block == 0 && !allocate) @@ -69,7 +85,7 @@ namespace Kernel if (block == 0) { block = TRY(m_fs.reserve_free_block(block_group())); - m_inode.blocks += inode_blocks_per_fs_block; + m_blocks++; auto block_buffer = TRY(m_fs.get_block_buffer()); memset(block_buffer.data(), 0x00, block_buffer.size()); @@ -88,7 +104,7 @@ namespace Kernel else { block = TRY(m_fs.reserve_free_block(block_group())); - m_inode.blocks += inode_blocks_per_fs_block; + m_blocks++; memset(block_buffer.data(), 0, block_buffer.size()); @@ -112,13 +128,12 @@ namespace Kernel BAN::ErrorOr> Ext2Inode::fs_block_of_data_block_index_no_lock(uint32_t data_block_index, bool allocate) { - const uint32_t inode_blocks_per_fs_block = blksize() / 512; const uint32_t indices_per_block = blksize() / sizeof(uint32_t); if (data_block_index < 12) { - if (m_inode.block[data_block_index] != 0) - return BAN::Optional(m_inode.block[data_block_index]); + if (m_ext2_blocks.block[data_block_index] != 0) + return BAN::Optional(m_ext2_blocks.block[data_block_index]); if (!allocate) return BAN::Optional(); @@ -128,23 +143,23 @@ namespace Kernel const auto block = TRY(m_fs.reserve_free_block(block_group())); TRY(m_fs.write_block(block, block_buffer)); - m_inode.block[data_block_index] = block; - m_inode.blocks += inode_blocks_per_fs_block; + m_ext2_blocks.block[data_block_index] = block; + m_blocks++; return BAN::Optional(block); } data_block_index -= 12; if (data_block_index < indices_per_block) - return block_from_indirect_block_no_lock(m_inode.block[12], data_block_index, 1, allocate); + return block_from_indirect_block_no_lock(m_ext2_blocks.block[12], data_block_index, 1, allocate); data_block_index -= indices_per_block; if (data_block_index < indices_per_block * indices_per_block) - return block_from_indirect_block_no_lock(m_inode.block[13], data_block_index, 2, allocate); + return block_from_indirect_block_no_lock(m_ext2_blocks.block[13], data_block_index, 2, allocate); data_block_index -= indices_per_block * indices_per_block; if (data_block_index < indices_per_block * indices_per_block * indices_per_block) - return block_from_indirect_block_no_lock(m_inode.block[14], data_block_index, 3, allocate); + return block_from_indirect_block_no_lock(m_ext2_blocks.block[14], data_block_index, 3, allocate); ASSERT_NOT_REACHED(); } @@ -155,15 +170,15 @@ namespace Kernel RWLockRDGuard _(m_lock); - if (m_inode.size < sizeof(m_inode.block)) + if (static_cast(m_size) < sizeof(m_ext2_blocks.block)) { BAN::String result; - TRY(result.append(BAN::StringView(reinterpret_cast(m_inode.block), m_inode.size))); + TRY(result.append(BAN::StringView(reinterpret_cast(m_ext2_blocks.block), m_size))); return result; } BAN::String result; - TRY(result.resize(m_inode.size)); + TRY(result.resize(m_size)); TRY(read_impl(0, { reinterpret_cast(result.data()), result.size() })); return BAN::move(result); } @@ -173,13 +188,13 @@ namespace Kernel ASSERT(mode().iflnk()); RWLockWRGuard _(m_lock); - if (target.size() < sizeof(m_inode.block)) + if (target.size() < sizeof(m_ext2_blocks.block)) { - if (m_inode.size >= sizeof(m_inode.block)) + if (static_cast(m_size) >= sizeof(m_ext2_blocks.block)) TRY(cleanup_data_blocks_no_lock()); - memset(m_inode.block, 0, sizeof(m_inode.block)); - memcpy(m_inode.block, target.data(), target.size()); - m_inode.size = target.size(); + memset(m_ext2_blocks.block, 0, sizeof(m_ext2_blocks.block)); + memcpy(m_ext2_blocks.block, target.data(), target.size()); + m_size = target.size(); TRY(sync_no_lock()); return {}; } @@ -201,14 +216,14 @@ namespace Kernel RWLockRDGuard _0(m_lock); - if (static_cast>(offset) >= m_inode.size) + if (static_cast>(offset) >= static_cast(m_size)) return 0; ScopedSync _1(*this); uint32_t count = buffer.size(); - if (offset + buffer.size() > m_inode.size) - count = m_inode.size - offset; + if (offset + buffer.size() > static_cast(m_size)) + count = m_size - offset; const uint32_t block_size = blksize(); @@ -249,7 +264,7 @@ namespace Kernel RWLockWRGuard _0(m_lock); - if (m_inode.size < offset + buffer.size()) + if (static_cast(m_size) < offset + buffer.size()) TRY(truncate_impl(offset + buffer.size())); ScopedSync _(*this); @@ -311,17 +326,17 @@ namespace Kernel { RWLockWRGuard _(m_lock); - if (m_inode.size == new_size) + if (static_cast(m_size) == new_size) return {}; // TODO: we should remove unused blocks on shrink - const auto old_size = m_inode.size; + const auto old_size = static_cast(m_size); - m_inode.size = new_size; + m_size = new_size; if (auto ret = sync_no_lock(); ret.is_error()) { - m_inode.size = old_size; + m_size = old_size; return ret.release_error(); } @@ -334,15 +349,15 @@ namespace Kernel RWLockWRGuard _(m_lock); - if (m_inode.mode == mode) + if (m_mode == mode) return {}; - const auto old_mode = m_inode.mode; + const auto old_mode = m_mode.load(); - m_inode.mode = (m_inode.mode & Inode::Mode::TYPE_MASK) | mode; + m_mode = (m_mode & Inode::Mode::TYPE_MASK) | mode; if (auto ret = sync_no_lock(); ret.is_error()) { - m_inode.mode = old_mode; + m_mode = old_mode; return ret.release_error(); } @@ -353,18 +368,18 @@ namespace Kernel { RWLockWRGuard _(m_lock); - if (m_inode.uid == uid && m_inode.gid == gid) + if (m_uid == uid && m_gid == gid) return {}; - const auto old_uid = m_inode.uid; - const auto old_gid = m_inode.gid; + const auto old_uid = m_uid.load(); + const auto old_gid = m_gid.load(); - m_inode.uid = uid; - m_inode.gid = gid; + m_uid = uid; + m_gid = gid; if (auto ret = sync_no_lock(); ret.is_error()) { - m_inode.uid = old_uid; - m_inode.gid = old_gid; + m_uid = old_uid; + m_gid = old_gid; return ret.release_error(); } @@ -376,19 +391,19 @@ namespace Kernel RWLockWRGuard _(m_lock); const uint32_t old_times[2] { - m_inode.atime, - m_inode.mtime, + static_cast(m_atime.tv_sec), + static_cast(m_mtime.tv_sec), }; if (times[0].tv_nsec != UTIME_OMIT) - m_inode.atime = times[0].tv_sec; + m_atime.tv_sec = times[0].tv_sec; if (times[1].tv_nsec != UTIME_OMIT) - m_inode.mtime = times[1].tv_sec; + m_mtime.tv_sec = times[1].tv_sec; if (auto ret = sync_no_lock(); ret.is_error()) { - m_inode.atime = old_times[0]; - m_inode.mtime = old_times[1]; + m_atime.tv_sec = old_times[0]; + m_mtime.tv_sec = old_times[1]; return ret.release_error(); } @@ -432,25 +447,25 @@ namespace Kernel BAN::ErrorOr Ext2Inode::cleanup_data_blocks_no_lock() { - if (mode().iflnk() && (size_t)size() < sizeof(m_inode.block)) + if (mode().iflnk() && (size_t)size() < sizeof(m_ext2_blocks.block)) goto done; // cleanup direct blocks for (uint32_t i = 0; i < 12; i++) - if (m_inode.block[i]) - TRY(m_fs.release_block(m_inode.block[i])); + if (m_ext2_blocks.block[i]) + TRY(m_fs.release_block(m_ext2_blocks.block[i])); // cleanup indirect blocks - if (m_inode.block[12]) - TRY(cleanup_indirect_block_no_lock(m_inode.block[12], 1)); - if (m_inode.block[13]) - TRY(cleanup_indirect_block_no_lock(m_inode.block[13], 2)); - if (m_inode.block[14]) - TRY(cleanup_indirect_block_no_lock(m_inode.block[14], 3)); + if (m_ext2_blocks.block[12]) + TRY(cleanup_indirect_block_no_lock(m_ext2_blocks.block[12], 1)); + if (m_ext2_blocks.block[13]) + TRY(cleanup_indirect_block_no_lock(m_ext2_blocks.block[13], 2)); + if (m_ext2_blocks.block[14]) + TRY(cleanup_indirect_block_no_lock(m_ext2_blocks.block[14], 3)); done: // mark blocks as deleted - memset(m_inode.block, 0x00, sizeof(m_inode.block)); + memset(m_ext2_blocks.block, 0x00, sizeof(m_ext2_blocks.block)); TRY(sync_no_lock()); @@ -459,7 +474,7 @@ done: BAN::ErrorOr Ext2Inode::cleanup_from_fs_no_lock() { - ASSERT(m_inode.links_count == 0); + ASSERT(m_nlink == 0); TRY(cleanup_data_blocks_no_lock()); TRY(m_fs.delete_inode(ino())); return {}; @@ -694,7 +709,7 @@ done: if (name.size() > 255) return BAN::Error::from_errno(ENAMETOOLONG); - if (m_inode.flags & Ext2::Enum::INDEX_FL) + if (m_og_flags & Ext2::Enum::INDEX_FL) { dwarnln("file creation to indexed directory not supported"); return BAN::Error::from_errno(ENOTSUP); @@ -731,7 +746,7 @@ done: new_entry.file_type = file_type; memcpy(new_entry.name, name.data(), name.size()); - inode.m_inode.links_count++; + inode.m_nlink++; TRY(inode.sync_no_lock()); return {}; @@ -782,7 +797,7 @@ done: needs_new_block: block_index = TRY(fs_block_of_data_block_index_no_lock(data_block_count, true)).value(); - m_inode.size += blksize(); + m_size += blksize(); memset(block_buffer.data(), 0x00, block_buffer.size()); TRY(write_inode(0, block_size)); @@ -830,7 +845,7 @@ needs_new_block: auto block_buffer = TRY(m_fs.get_block_buffer()); - if (m_inode.flags & Ext2::Enum::INDEX_FL) + if (m_og_flags & Ext2::Enum::INDEX_FL) { dwarnln("deletion of indexed directory is not supported"); return BAN::Error::from_errno(ENOTSUP); @@ -856,13 +871,13 @@ needs_new_block: if (entry_name == "."_sv) { - m_inode.links_count--; + m_nlink--; TRY(sync_no_lock()); } else if (entry_name == ".."_sv) { auto parent = TRY(Ext2Inode::create(m_fs, entry.inode)); - parent->m_inode.links_count--; + parent->m_nlink--; TRY(parent->sync_no_lock()); } else @@ -888,7 +903,7 @@ needs_new_block: auto block_buffer = TRY(m_fs.get_block_buffer()); - if (m_inode.flags & Ext2::Enum::INDEX_FL) + if (m_og_flags & Ext2::Enum::INDEX_FL) { dwarnln("deletion from indexed directory is not supported"); return BAN::Error::from_errno(ENOTSUP); @@ -918,7 +933,7 @@ needs_new_block: if (inode->nlink() == 0) dprintln("Corrupted filesystem. Deleting inode with 0 links"); else - inode->m_inode.links_count--; + inode->m_nlink--; TRY(sync_no_lock()); @@ -955,9 +970,29 @@ needs_new_block: auto block_buffer = TRY(m_fs.get_block_buffer()); TRY(m_fs.read_block(inode_location.block, block_buffer)); - if (memcmp(block_buffer.data() + inode_location.offset, &m_inode, sizeof(Ext2::Inode))) + Ext2::Inode inode { + .mode = static_cast(m_mode), + .uid = static_cast(m_uid), + .size = static_cast(m_size), + .atime = static_cast(m_atime.tv_sec), + .ctime = static_cast(m_ctime.tv_sec), + .mtime = static_cast(m_mtime.tv_sec), + .dtime = m_og_dtime, + .gid = static_cast(m_gid), + .links_count = static_cast(m_nlink), + .blocks = static_cast(m_blocks * (blksize() / 512)), + .flags = m_og_flags, + .osd1 = m_og_osd1, + .block = m_ext2_blocks, + .generation = m_og_generation, + .file_acl = m_og_file_acl, + .dir_acl = m_og_dir_acl, + .faddr = m_og_faddr, + .osd2 = m_og_osd2 + }; + if (memcmp(block_buffer.data() + inode_location.offset, &inode, sizeof(Ext2::Inode))) { - memcpy(block_buffer.data() + inode_location.offset, &m_inode, sizeof(Ext2::Inode)); + memcpy(block_buffer.data() + inode_location.offset, &inode, sizeof(Ext2::Inode)); TRY(m_fs.write_block(inode_location.block, block_buffer)); } @@ -996,5 +1031,4 @@ needs_new_block: return BAN::Error::from_errno(ENOENT); } - } diff --git a/kernel/kernel/FS/FAT/Inode.cpp b/kernel/kernel/FS/FAT/Inode.cpp index 49d12f2a..a1f2b0a3 100644 --- a/kernel/kernel/FS/FAT/Inode.cpp +++ b/kernel/kernel/FS/FAT/Inode.cpp @@ -23,27 +23,30 @@ namespace Kernel return BAN::to_unix_time(ban_time); } - blksize_t FATInode::blksize() const + static timespec fat_date_to_timespec(FAT::Date date, FAT::Time time) { - return m_fs.inode_block_size(this); - } - - timespec FATInode::atime() const - { - const time_t epoch = fat_date_to_epoch(m_entry.last_access_date, {}); + const time_t epoch = fat_date_to_epoch(date, time); return timespec { .tv_sec = epoch, .tv_nsec = 0 }; } - timespec FATInode::mtime() const + FATInode::FATInode(FATFS& fs, const FAT::DirectoryEntry& entry, ino_t ino, uint32_t block_count) + : m_fs(fs) + , m_entry(entry) + , m_block_count(block_count) { - const time_t epoch = fat_date_to_epoch(m_entry.write_date, m_entry.write_time); - return timespec { .tv_sec = epoch, .tv_nsec = 0 }; - } - - timespec FATInode::ctime() const - { - const time_t epoch = fat_date_to_epoch(m_entry.creation_date, m_entry.creation_time); - return timespec { .tv_sec = epoch, .tv_nsec = 0 }; + m_ino = ino; + m_mode = ((m_entry.attr & FAT::FileAttr::DIRECTORY) ? Mode::IFDIR : Mode::IFREG) | 0777; + m_nlink = 1; + m_uid = 0; + m_gid = 0; + m_size = m_entry.file_size; + m_blksize = fs.inode_block_size(this); + m_atime = fat_date_to_timespec(m_entry.last_access_date, {}); + m_mtime = fat_date_to_timespec(m_entry.write_date, m_entry.write_time); + m_ctime = fat_date_to_timespec(m_entry.creation_date, m_entry.creation_time); + m_blocks = m_block_count; + m_dev = 0; + m_rdev = 0; } const FileSystem* FATInode::filesystem() const diff --git a/kernel/kernel/FS/FileSystem.cpp b/kernel/kernel/FS/FileSystem.cpp index 3f73d8bd..84f61243 100644 --- a/kernel/kernel/FS/FileSystem.cpp +++ b/kernel/kernel/FS/FileSystem.cpp @@ -5,14 +5,14 @@ namespace Kernel { - BAN::ErrorOr> FileSystem::from_block_device(BAN::RefPtr block_device) - { - if (auto res = Ext2FS::probe(block_device); !res.is_error() && res.value()) - return BAN::RefPtr(TRY(Ext2FS::create(block_device))); - if (auto res = FATFS::probe(block_device); !res.is_error() && res.value()) - return BAN::RefPtr(TRY(FATFS::create(block_device))); - dprintln("Unsupported filesystem"); - return BAN::Error::from_errno(ENOTSUP); - } + BAN::ErrorOr> FileSystem::from_block_device(BAN::RefPtr block_device) + { + if (auto res = Ext2FS::probe(block_device); !res.is_error() && res.value()) + return BAN::RefPtr(TRY(Ext2FS::create(block_device))); + if (auto res = FATFS::probe(block_device); !res.is_error() && res.value()) + return BAN::RefPtr(TRY(FATFS::create(block_device))); + dprintln("Unsupported filesystem"); + return BAN::Error::from_errno(ENOTSUP); + } } diff --git a/kernel/kernel/FS/Pipe.cpp b/kernel/kernel/FS/Pipe.cpp index 3d96c845..2d259e24 100644 --- a/kernel/kernel/FS/Pipe.cpp +++ b/kernel/kernel/FS/Pipe.cpp @@ -23,13 +23,22 @@ namespace Kernel } Pipe::Pipe(const Credentials& credentials) - : m_uid(credentials.euid()) - , m_gid(credentials.egid()) { timespec current_time = SystemTimer::get().real_time(); m_atime = current_time; m_mtime = current_time; m_ctime = current_time; + m_uid = credentials.euid(); + m_gid = credentials.egid(); + + m_ino = 0; // FIXME + m_mode = { Mode::IFIFO | Mode::IRUSR | Mode::IWUSR }; + m_nlink = 1; + m_size = 0; + m_blksize = 4096; + m_blocks = 0; + m_dev = 0; // FIXME + m_rdev = 0; // FIXME } void Pipe::on_clone(int status_flags) diff --git a/kernel/kernel/FS/ProcFS/Inode.cpp b/kernel/kernel/FS/ProcFS/Inode.cpp index 252fcda7..61ee66eb 100644 --- a/kernel/kernel/FS/ProcFS/Inode.cpp +++ b/kernel/kernel/FS/ProcFS/Inode.cpp @@ -28,8 +28,9 @@ namespace Kernel ProcPidInode::ProcPidInode(Process& process, TmpFileSystem& fs, const TmpInodeInfo& inode_info) : TmpDirectoryInode(fs, MUST(fs.allocate_inode(inode_info)), inode_info) - , m_process(process) { + m_uid = process.credentials().ruid(); + m_gid = process.credentials().rgid(); } void ProcPidInode::cleanup() @@ -57,7 +58,9 @@ namespace Kernel , m_process(process) , m_callback(callback) { - m_inode_info.mode |= Inode::Mode::IFREG; + m_mode |= Inode::Mode::IFREG; + m_uid = process.credentials().ruid(); + m_gid = process.credentials().rgid(); } BAN::ErrorOr ProcROProcessInode::read_impl(off_t offset, BAN::ByteSpan buffer) @@ -82,7 +85,9 @@ namespace Kernel , m_process(process) , m_callback(callback) { - m_inode_info.mode |= Inode::Mode::IFLNK; + m_mode |= Inode::Mode::IFLNK; + m_uid = process.credentials().ruid(); + m_gid = process.credentials().rgid(); } BAN::ErrorOr ProcSymlinkProcessInode::link_target_impl() @@ -104,7 +109,7 @@ namespace Kernel : TmpInode(fs, MUST(fs.allocate_inode(inode_info)), inode_info) , m_callback(callback) { - m_inode_info.mode |= Inode::Mode::IFREG; + m_mode |= Inode::Mode::IFREG; } BAN::ErrorOr ProcROInode::read_impl(off_t offset, BAN::ByteSpan buffer) @@ -130,7 +135,7 @@ namespace Kernel , m_destructor(destructor) , m_data(data) { - m_inode_info.mode |= Inode::Mode::IFLNK; + m_mode |= Inode::Mode::IFLNK; } ProcSymlinkInode::~ProcSymlinkInode() @@ -158,6 +163,8 @@ namespace Kernel : TmpInode(fs, MUST(fs.allocate_inode(inode_info)), inode_info) , m_process(process) { + m_uid = process.credentials().ruid(); + m_gid = process.credentials().rgid(); ASSERT(mode().ifdir()); } diff --git a/kernel/kernel/FS/TmpFS/FileSystem.cpp b/kernel/kernel/FS/TmpFS/FileSystem.cpp index fea7ed8f..88456719 100644 --- a/kernel/kernel/FS/TmpFS/FileSystem.cpp +++ b/kernel/kernel/FS/TmpFS/FileSystem.cpp @@ -131,7 +131,7 @@ namespace Kernel PageTable::with_fast_page(inode_location.paddr, [&] { auto& inode_info = PageTable::fast_page_as_sized(inode_location.index); ASSERT(inode_info.nlink == 0); - for (auto paddr : inode_info.block) + for (auto paddr : inode_info.tmp_blocks.block) ASSERT(paddr == 0); inode_info = {}; }); diff --git a/kernel/kernel/FS/TmpFS/Inode.cpp b/kernel/kernel/FS/TmpFS/Inode.cpp index 5ca0b2a7..d601214a 100644 --- a/kernel/kernel/FS/TmpFS/Inode.cpp +++ b/kernel/kernel/FS/TmpFS/Inode.cpp @@ -48,11 +48,6 @@ namespace Kernel return &m_fs; } - dev_t TmpInode::dev() const - { - return m_fs.rdev(); - } - BAN::ErrorOr> TmpInode::create_from_existing(TmpFileSystem& fs, ino_t ino, const TmpInodeInfo& info) { TmpInode* inode_ptr = nullptr; @@ -74,9 +69,21 @@ namespace Kernel TmpInode::TmpInode(TmpFileSystem& fs, ino_t ino, const TmpInodeInfo& info) : m_fs(fs) - , m_inode_info(info) - , m_ino(ino) { + m_ino = ino; + m_rdev = 0; + m_blksize = PAGE_SIZE; + m_mode = info.mode; + m_nlink = info.nlink; + m_uid = info.uid; + m_gid = info.gid; + m_size = info.size; + m_atime = info.atime; + m_mtime = info.mtime; + m_ctime = info.ctime; + m_blocks = info.blocks; + m_dev = fs.rdev(); + m_tmp_blocks = info.tmp_blocks; // FIXME: this should be able to fail MUST(fs.add_to_cache(this)); } @@ -96,16 +103,16 @@ namespace Kernel { // FIXME: make this atomic ASSERT(!(new_mode & Inode::Mode::TYPE_MASK)); - m_inode_info.mode &= Inode::Mode::TYPE_MASK; - m_inode_info.mode |= new_mode; + m_mode &= Inode::Mode::TYPE_MASK; + m_mode |= new_mode; return {}; } BAN::ErrorOr TmpInode::chown_impl(uid_t new_uid, gid_t new_gid) { // FIXME: make this atomic - m_inode_info.uid = new_uid; - m_inode_info.gid = new_gid; + m_uid = new_uid; + m_gid = new_gid; return {}; } @@ -113,33 +120,45 @@ namespace Kernel { // FIXME: make this atomic if (times[0].tv_nsec != UTIME_OMIT) - m_inode_info.atime = times[0]; + m_atime = times[0]; if (times[1].tv_nsec != UTIME_OMIT) - m_inode_info.atime = times[1]; + m_atime = times[1]; return {}; } void TmpInode::sync() { - m_fs.write_inode(m_ino, m_inode_info); + TmpInodeInfo info = { + .mode = m_mode.load(), + .uid = m_uid.load(), + .gid = m_gid.load(), + .atime = m_atime, + .ctime = m_ctime, + .mtime = m_mtime, + .nlink = m_nlink.load(), + .size = static_cast(size()), + .blocks = m_blocks.load(), + .tmp_blocks = m_tmp_blocks, + }; + m_fs.write_inode(m_ino, info); } void TmpInode::free_all_blocks() { LockGuard _(m_lock); - if (mode().iflnk() && m_inode_info.size <= sizeof(TmpInodeInfo::block)) + if (mode().iflnk() && static_cast(size()) <= sizeof(TmpBlocks::block)) goto free_all_blocks_done; - for (size_t i = 0; i < TmpInodeInfo::direct_block_count; i++) - if (m_inode_info.block[i]) - m_fs.free_block(m_inode_info.block[i]); - if (size_t block = m_inode_info.block[TmpInodeInfo::direct_block_count + 0]) + for (size_t i = 0; i < TmpBlocks::direct_block_count; i++) + if (m_tmp_blocks.block[i]) + m_fs.free_block(m_tmp_blocks.block[i]); + if (size_t block = m_tmp_blocks.block[TmpBlocks::direct_block_count + 0]) free_indirect_blocks_no_lock(block, 1); - if (size_t block = m_inode_info.block[TmpInodeInfo::direct_block_count + 1]) + if (size_t block = m_tmp_blocks.block[TmpBlocks::direct_block_count + 1]) free_indirect_blocks_no_lock(block, 2); - if (size_t block = m_inode_info.block[TmpInodeInfo::direct_block_count + 2]) + if (size_t block = m_tmp_blocks.block[TmpBlocks::direct_block_count + 2]) free_indirect_blocks_no_lock(block, 3); free_all_blocks_done: - for (auto& block : m_inode_info.block) + for (auto& block : m_tmp_blocks.block) block = 0; } @@ -174,26 +193,26 @@ namespace Kernel { LockGuard _(m_lock); - if (data_block_index < TmpInodeInfo::direct_block_count) + if (data_block_index < TmpBlocks::direct_block_count) { - if (m_inode_info.block[data_block_index] == 0) + if (m_tmp_blocks.block[data_block_index] == 0) return {}; - return m_inode_info.block[data_block_index]; + return m_tmp_blocks.block[data_block_index]; } - data_block_index -= TmpInodeInfo::direct_block_count; + data_block_index -= TmpBlocks::direct_block_count; const size_t indices_per_block = blksize() / sizeof(size_t); if (data_block_index < indices_per_block) - return block_index_from_indirect_no_lock(m_inode_info.block[TmpInodeInfo::direct_block_count + 0], data_block_index, 1); + return block_index_from_indirect_no_lock(m_tmp_blocks.block[TmpBlocks::direct_block_count + 0], data_block_index, 1); data_block_index -= indices_per_block; if (data_block_index < indices_per_block * indices_per_block) - return block_index_from_indirect_no_lock(m_inode_info.block[TmpInodeInfo::direct_block_count + 1], data_block_index, 2); + return block_index_from_indirect_no_lock(m_tmp_blocks.block[TmpBlocks::direct_block_count + 1], data_block_index, 2); data_block_index -= indices_per_block * indices_per_block; if (data_block_index < indices_per_block * indices_per_block * indices_per_block) - return block_index_from_indirect_no_lock(m_inode_info.block[TmpInodeInfo::direct_block_count + 2], data_block_index, 3); + return block_index_from_indirect_no_lock(m_tmp_blocks.block[TmpBlocks::direct_block_count + 2], data_block_index, 3); ASSERT_NOT_REACHED(); } @@ -228,29 +247,29 @@ namespace Kernel { LockGuard _(m_lock); - if (data_block_index < TmpInodeInfo::direct_block_count) + if (data_block_index < TmpBlocks::direct_block_count) { - if (m_inode_info.block[data_block_index] == 0) + if (m_tmp_blocks.block[data_block_index] == 0) { - m_inode_info.block[data_block_index] = TRY(m_fs.allocate_block()); - m_inode_info.blocks++; + m_tmp_blocks.block[data_block_index] = TRY(m_fs.allocate_block()); + m_blocks++; } - return m_inode_info.block[data_block_index]; + return m_tmp_blocks.block[data_block_index]; } - data_block_index -= TmpInodeInfo::direct_block_count; + data_block_index -= TmpBlocks::direct_block_count; const size_t indices_per_block = blksize() / sizeof(size_t); if (data_block_index < indices_per_block) - return block_index_from_indirect_with_allocation_no_lock(m_inode_info.block[TmpInodeInfo::direct_block_count + 0], data_block_index, 1); + return block_index_from_indirect_with_allocation_no_lock(m_tmp_blocks.block[TmpBlocks::direct_block_count + 0], data_block_index, 1); data_block_index -= indices_per_block; if (data_block_index < indices_per_block * indices_per_block) - return block_index_from_indirect_with_allocation_no_lock(m_inode_info.block[TmpInodeInfo::direct_block_count + 1], data_block_index, 2); + return block_index_from_indirect_with_allocation_no_lock(m_tmp_blocks.block[TmpBlocks::direct_block_count + 1], data_block_index, 2); data_block_index -= indices_per_block * indices_per_block; if (data_block_index < indices_per_block * indices_per_block * indices_per_block) - return block_index_from_indirect_with_allocation_no_lock(m_inode_info.block[TmpInodeInfo::direct_block_count + 2], data_block_index, 3); + return block_index_from_indirect_with_allocation_no_lock(m_tmp_blocks.block[TmpBlocks::direct_block_count + 2], data_block_index, 3); ASSERT_NOT_REACHED(); } @@ -260,7 +279,7 @@ namespace Kernel if (block == 0) { block = TRY(m_fs.allocate_block()); - m_inode_info.blocks++; + m_blocks++; } ASSERT(depth >= 1); @@ -278,7 +297,7 @@ namespace Kernel if (next_block == 0) { next_block = TRY(m_fs.allocate_block()); - m_inode_info.blocks++; + m_blocks++; m_fs.with_block_buffer(block, [&](BAN::ByteSpan block_buffer) { block_buffer.as_span()[(index / divisor) % indices_per_block] = next_block; @@ -385,9 +404,7 @@ namespace Kernel { // FIXME: if size is decreased, we should probably free // unused blocks - // FIXME: make this atomic - - m_inode_info.size = new_size; + m_size = new_size; return {}; } @@ -446,12 +463,12 @@ namespace Kernel LockGuard _(m_lock); free_all_blocks(); - m_inode_info.size = 0; + m_size = 0; - if (new_target.size() <= sizeof(TmpInodeInfo::block)) + if (new_target.size() <= sizeof(TmpBlocks::block)) { - memcpy(m_inode_info.block.data(), new_target.data(), new_target.size()); - m_inode_info.size = new_target.size(); + memcpy(m_tmp_blocks.block.data(), new_target.data(), new_target.size()); + m_size = new_target.size(); return {}; } @@ -465,7 +482,7 @@ namespace Kernel memcpy(bytespan.data(), new_target.data() + i * blksize(), byte_count); }); - m_inode_info.size += byte_count; + m_size += byte_count; } return {}; @@ -478,9 +495,9 @@ namespace Kernel BAN::String result; TRY(result.resize(size())); - if ((size_t)size() <= sizeof(TmpInodeInfo::block)) + if ((size_t)size() <= sizeof(TmpBlocks::block)) { - memcpy(result.data(), m_inode_info.block.data(), size()); + memcpy(result.data(), m_tmp_blocks.block.data(), size()); return result; } @@ -569,14 +586,14 @@ namespace Kernel { auto inode = TRY(m_fs.open_inode(dot_ino)); ASSERT(inode->nlink() > 0); - inode->m_inode_info.nlink--; + inode->m_nlink--; } if (dotdot_ino) { auto inode = TRY(m_fs.open_inode(dotdot_ino)); ASSERT(inode->nlink() > 0); - inode->m_inode_info.nlink--; + inode->m_nlink--; } return {}; @@ -754,7 +771,7 @@ namespace Kernel if (cleanup) TRY(inode->prepare_unlink_no_lock()); - inode->m_inode_info.nlink--; + inode->m_nlink--; if (inode->nlink() == 0) m_fs.remove_from_cache(inode); @@ -837,7 +854,7 @@ namespace Kernel if (done) { // add link to linked inode - inode.m_inode_info.nlink++; + inode.m_nlink++; return {}; } } @@ -866,10 +883,10 @@ namespace Kernel }); // increase current size - m_inode_info.size += blksize(); + m_size += blksize(); // add link to linked inode - inode.m_inode_info.nlink++; + inode.m_nlink++; return {}; } diff --git a/kernel/kernel/Input/InputDevice.cpp b/kernel/kernel/Input/InputDevice.cpp index ad64bbb1..76b9f868 100644 --- a/kernel/kernel/Input/InputDevice.cpp +++ b/kernel/kernel/Input/InputDevice.cpp @@ -86,11 +86,11 @@ namespace Kernel InputDevice::InputDevice(Type type) : CharacterDevice(0440, 0, 901) - , m_rdev(get_rdev(type)) - , m_name(MUST(BAN::String::formatted(get_name_format(type), minor(m_rdev) - 1))) , m_type(type) , m_event_size(get_event_size(type)) { + m_rdev = get_rdev(type); + m_name = MUST(BAN::String::formatted(get_name_format(type), minor(m_rdev) - 1)); MUST(m_event_buffer.resize(m_event_size * m_max_event_count, 0)); switch (m_type) @@ -270,9 +270,10 @@ namespace Kernel KeyboardDevice::KeyboardDevice(mode_t mode, uid_t uid, gid_t gid) : CharacterDevice(mode, uid, gid) - , m_rdev(makedev(DeviceNumber::Keyboard, 0)) , m_name("keyboard"_sv) - {} + { + m_rdev = makedev(DeviceNumber::Keyboard, 0); + } void KeyboardDevice::notify() { @@ -326,9 +327,10 @@ namespace Kernel MouseDevice::MouseDevice(mode_t mode, uid_t uid, gid_t gid) : CharacterDevice(mode, uid, gid) - , m_rdev(makedev(DeviceNumber::Mouse, 0)) , m_name("mouse"_sv) - {} + { + m_rdev = makedev(DeviceNumber::Mouse, 0); + } void MouseDevice::notify() { diff --git a/kernel/kernel/Networking/E1000/E1000.cpp b/kernel/kernel/Networking/E1000/E1000.cpp index 20405acc..d11441e7 100644 --- a/kernel/kernel/Networking/E1000/E1000.cpp +++ b/kernel/kernel/Networking/E1000/E1000.cpp @@ -200,7 +200,7 @@ namespace Kernel rctrl |= RCTL_BAM; rctrl |= RCTL_SECRC; rctrl |= RCTL_BSIZE_8192; - write32(REG_RCTL, rctrl); + write32(REG_RCTL, rctrl); return {}; } diff --git a/kernel/kernel/Networking/NetworkInterface.cpp b/kernel/kernel/Networking/NetworkInterface.cpp index 7de8d75e..fe2b8b72 100644 --- a/kernel/kernel/Networking/NetworkInterface.cpp +++ b/kernel/kernel/Networking/NetworkInterface.cpp @@ -27,8 +27,8 @@ namespace Kernel NetworkInterface::NetworkInterface(Type type) : CharacterDevice(0400, 0, 0) , m_type(type) - , m_rdev(get_rdev(type)) { + m_rdev = get_rdev(type); switch (type) { case Type::Ethernet: diff --git a/kernel/kernel/Storage/ATA/ATADevice.cpp b/kernel/kernel/Storage/ATA/ATADevice.cpp index 42fadf8a..3d366def 100644 --- a/kernel/kernel/Storage/ATA/ATADevice.cpp +++ b/kernel/kernel/Storage/ATA/ATADevice.cpp @@ -12,8 +12,8 @@ namespace Kernel { detail::ATABaseDevice::ATABaseDevice() - : m_rdev(scsi_get_rdev()) { + m_rdev = scsi_get_rdev(); strcpy(m_name, "sda"); m_name[2] += minor(m_rdev); } diff --git a/kernel/kernel/Storage/NVMe/Controller.cpp b/kernel/kernel/Storage/NVMe/Controller.cpp index 68b1a95d..22cd8230 100644 --- a/kernel/kernel/Storage/NVMe/Controller.cpp +++ b/kernel/kernel/Storage/NVMe/Controller.cpp @@ -29,8 +29,8 @@ namespace Kernel NVMeController::NVMeController(PCI::Device& pci_device) : CharacterDevice(0600, 0, 0) , m_pci_device(pci_device) - , m_rdev(makedev(DeviceNumber::NVMeController, get_ctrl_dev_minor())) { + m_rdev = makedev(DeviceNumber::NVMeController, get_ctrl_dev_minor()); ASSERT(minor(m_rdev) < 10); strcpy(m_name, "nvmeX"); m_name[4] = '0' + minor(m_rdev); diff --git a/kernel/kernel/Storage/NVMe/Namespace.cpp b/kernel/kernel/Storage/NVMe/Namespace.cpp index e6ea422b..3ba3b2a5 100644 --- a/kernel/kernel/Storage/NVMe/Namespace.cpp +++ b/kernel/kernel/Storage/NVMe/Namespace.cpp @@ -29,8 +29,8 @@ namespace Kernel , m_nsid(nsid) , m_block_size(block_size) , m_block_count(block_count) - , m_rdev(makedev(DeviceNumber::NVMeNamespace, get_ns_dev_minor())) { + m_rdev = makedev(DeviceNumber::NVMeNamespace, get_ns_dev_minor()); ASSERT(minor(m_rdev) < 10); ASSERT(m_controller.name().size() + 2 < sizeof(m_name)); memcpy(m_name, m_controller.name().data(), m_controller.name().size()); diff --git a/kernel/kernel/Storage/Partition.cpp b/kernel/kernel/Storage/Partition.cpp index 06f30edf..718e3422 100644 --- a/kernel/kernel/Storage/Partition.cpp +++ b/kernel/kernel/Storage/Partition.cpp @@ -24,8 +24,8 @@ namespace Kernel , m_last_block(last_block) , m_attributes(attr) , m_name(MUST(BAN::String::formatted("{}{}", name_prefix, index))) - , m_rdev(makedev(major(device->rdev()), index)) { + m_rdev = makedev(major(device->rdev()), index); memcpy(m_label, label, sizeof(m_label)); } diff --git a/kernel/kernel/Terminal/PseudoTerminal.cpp b/kernel/kernel/Terminal/PseudoTerminal.cpp index 090548a5..7fbc3c1b 100644 --- a/kernel/kernel/Terminal/PseudoTerminal.cpp +++ b/kernel/kernel/Terminal/PseudoTerminal.cpp @@ -65,8 +65,9 @@ namespace Kernel PseudoTerminalMaster::PseudoTerminalMaster(BAN::UniqPtr buffer, mode_t mode, uid_t uid, gid_t gid) : CharacterDevice(mode, uid, gid) , m_buffer(BAN::move(buffer)) - , m_rdev(makedev(DeviceNumber::PTSMaster, s_pts_master_minor++)) - { } + { + m_rdev = makedev(DeviceNumber::PTSMaster, s_pts_master_minor++); + } PseudoTerminalMaster::~PseudoTerminalMaster() { diff --git a/kernel/kernel/Terminal/TTY.cpp b/kernel/kernel/Terminal/TTY.cpp index 276c0d83..085a2a09 100644 --- a/kernel/kernel/Terminal/TTY.cpp +++ b/kernel/kernel/Terminal/TTY.cpp @@ -72,9 +72,9 @@ namespace Kernel TTY::TTY(termios termios, mode_t mode, uid_t uid, gid_t gid) : CharacterDevice(mode, uid, gid) - , m_rdev(next_tty_rdev()) , m_termios(termios) { + m_rdev = next_tty_rdev(); m_output.buffer = MUST(ByteRingBuffer::create(PAGE_SIZE)); } @@ -158,16 +158,15 @@ namespace Kernel { // FIXME: make this atomic ASSERT((mode & Inode::Mode::TYPE_MASK) == 0); - m_inode_info.mode &= Inode::Mode::TYPE_MASK; - m_inode_info.mode |= mode; + m_mode &= Inode::Mode::TYPE_MASK; + m_mode |= mode; return {}; } BAN::ErrorOr TTY::chown_impl(uid_t uid, gid_t gid) { - // FIXME: make this atomic - m_inode_info.uid = uid; - m_inode_info.gid = gid; + m_uid = uid; + m_gid = gid; return {}; } diff --git a/kernel/kernel/USB/MassStorage/SCSIDevice.cpp b/kernel/kernel/USB/MassStorage/SCSIDevice.cpp index 32929aa1..a3cdfa81 100644 --- a/kernel/kernel/USB/MassStorage/SCSIDevice.cpp +++ b/kernel/kernel/USB/MassStorage/SCSIDevice.cpp @@ -132,9 +132,10 @@ namespace Kernel , m_lun(lun) , m_block_count(block_count) , m_block_size(block_size) - , m_rdev(scsi_get_rdev()) , m_name { 's', 'd', (char)('a' + minor(m_rdev)), '\0' } - { } + { + m_rdev = scsi_get_rdev(); + } USBSCSIDevice::~USBSCSIDevice() {