From 647d6a273dc57149b3af7726d130f594d450328a Mon Sep 17 00:00:00 2001 From: DcraftBg Date: Fri, 15 May 2026 20:39:51 +0300 Subject: [PATCH] Kernel: Changed stat values from func to be field - Removed virtual functions for all of the stat stuff. This did however introduce some issues, mainly with /proc becoming out of sync if you changed your ID. I propose we do the linux thing and just have a stat update function which is optional, but allows dynamic updates of stat fields for cases such as those in uid/gid in /proc. - Simplified the API, although still kind of annoying it is a bit simpler. - Moved some of the FS structure from having the FS inode inside the in memory inode to a Serialise <-> Deserialise model where Inodes are deserialised from disk into in memory ones and then back into on disk ones when it comes time for syncing. This makes it semantically better in my opinion, as it explicitly separates disk and non-disk functionality. --- kernel/include/kernel/Audio/Controller.h | 2 - kernel/include/kernel/Device/DebugDevice.h | 10 +- kernel/include/kernel/Device/Device.h | 6 +- .../include/kernel/Device/FramebufferDevice.h | 2 - kernel/include/kernel/Device/NullDevice.h | 9 +- kernel/include/kernel/Device/RandomDevice.h | 10 +- kernel/include/kernel/Device/ZeroDevice.h | 10 +- kernel/include/kernel/Epoll.h | 30 +-- kernel/include/kernel/FS/EventFD.h | 30 +-- kernel/include/kernel/FS/Ext2/Definitions.h | 10 +- kernel/include/kernel/FS/Ext2/Inode.h | 30 +-- kernel/include/kernel/FS/FAT/Inode.h | 23 +-- kernel/include/kernel/FS/Inode.h | 41 ++-- kernel/include/kernel/FS/Pipe.h | 20 -- kernel/include/kernel/FS/ProcFS/Inode.h | 24 +-- kernel/include/kernel/FS/Socket.h | 22 +-- kernel/include/kernel/FS/TmpFS/Definitions.h | 29 +-- kernel/include/kernel/FS/TmpFS/Inode.h | 19 +- kernel/include/kernel/Input/InputDevice.h | 10 +- .../kernel/Networking/NetworkInterface.h | 3 - kernel/include/kernel/Storage/ATA/ATADevice.h | 4 - .../include/kernel/Storage/NVMe/Controller.h | 2 - .../include/kernel/Storage/NVMe/Namespace.h | 2 - kernel/include/kernel/Storage/Partition.h | 3 - .../include/kernel/Terminal/PseudoTerminal.h | 3 - kernel/include/kernel/Terminal/TTY.h | 4 - .../kernel/USB/MassStorage/SCSIDevice.h | 2 - kernel/kernel/Audio/Controller.cpp | 2 +- kernel/kernel/Device/FramebufferDevice.cpp | 5 +- kernel/kernel/FS/Ext2/FileSystem.cpp | 2 +- kernel/kernel/FS/Ext2/Inode.cpp | 182 +++++++++++------- kernel/kernel/FS/FAT/Inode.cpp | 35 ++-- kernel/kernel/FS/FileSystem.cpp | 18 +- kernel/kernel/FS/Pipe.cpp | 13 +- kernel/kernel/FS/ProcFS/Inode.cpp | 17 +- kernel/kernel/FS/TmpFS/FileSystem.cpp | 2 +- kernel/kernel/FS/TmpFS/Inode.cpp | 129 +++++++------ kernel/kernel/Input/InputDevice.cpp | 14 +- kernel/kernel/Networking/E1000/E1000.cpp | 2 +- kernel/kernel/Networking/NetworkInterface.cpp | 2 +- kernel/kernel/Storage/ATA/ATADevice.cpp | 2 +- kernel/kernel/Storage/NVMe/Controller.cpp | 2 +- kernel/kernel/Storage/NVMe/Namespace.cpp | 2 +- kernel/kernel/Storage/Partition.cpp | 2 +- kernel/kernel/Terminal/PseudoTerminal.cpp | 5 +- kernel/kernel/Terminal/TTY.cpp | 11 +- kernel/kernel/USB/MassStorage/SCSIDevice.cpp | 5 +- 47 files changed, 393 insertions(+), 419 deletions(-) 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() {