Kernel: Cleanup inode stat updating
Inode now handles stat upates itself and calls sync function to make updates visible on the underlying filesystem
This commit is contained in:
@@ -23,7 +23,9 @@ namespace Kernel
|
||||
protected:
|
||||
Device(mode_t, uid_t, gid_t);
|
||||
|
||||
virtual BAN::ErrorOr<void> fsync_impl() final override { return BAN::Error::from_errno(EINVAL); }
|
||||
private:
|
||||
BAN::ErrorOr<void> sync_inode(SyncType) final override { return {}; }
|
||||
BAN::ErrorOr<void> sync_data() final override { return {}; }
|
||||
};
|
||||
|
||||
class BlockDevice : public Device, public BAN::Weakable<BlockDevice>
|
||||
|
||||
@@ -21,24 +21,8 @@ namespace Kernel
|
||||
void notify(BAN::RefPtr<Inode> inode, uint32_t event);
|
||||
|
||||
private:
|
||||
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;
|
||||
m_kind = InodeKind::EPOLL;
|
||||
}
|
||||
Epoll();
|
||||
|
||||
public:
|
||||
const FileSystem* filesystem() const override { return nullptr; }
|
||||
|
||||
bool can_read_impl() const override { return false; }
|
||||
@@ -46,7 +30,8 @@ namespace Kernel
|
||||
bool has_error_impl() const override { return false; }
|
||||
bool has_hungup_impl() const override { return false; }
|
||||
|
||||
BAN::ErrorOr<void> fsync_impl() override { return {}; }
|
||||
BAN::ErrorOr<void> sync_inode(SyncType) override { return {}; }
|
||||
BAN::ErrorOr<void> sync_data() override { return {}; }
|
||||
|
||||
private:
|
||||
struct ListenEventList
|
||||
|
||||
@@ -11,38 +11,22 @@ namespace Kernel
|
||||
public:
|
||||
static BAN::ErrorOr<BAN::RefPtr<Inode>> create(uint64_t initval, bool semaphore);
|
||||
|
||||
private:
|
||||
EventFD(uint64_t initval, bool is_semaphore);
|
||||
|
||||
const FileSystem* filesystem() const override { return nullptr; }
|
||||
|
||||
protected:
|
||||
BAN::ErrorOr<void> sync_inode(SyncType) override { return {}; }
|
||||
BAN::ErrorOr<void> sync_data() override { return {}; }
|
||||
|
||||
BAN::ErrorOr<size_t> read_impl(off_t, BAN::ByteSpan) override;
|
||||
BAN::ErrorOr<size_t> write_impl(off_t, BAN::ConstByteSpan) override;
|
||||
BAN::ErrorOr<void> fsync_impl() final override { return {}; }
|
||||
|
||||
bool can_read_impl() const override { return m_value > 0; }
|
||||
bool can_write_impl() const override { return m_value < UINT64_MAX - 1; }
|
||||
bool has_error_impl() const override { return false; }
|
||||
bool has_hungup_impl() const override { return false; }
|
||||
|
||||
private:
|
||||
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;
|
||||
BAN::Atomic<uint64_t> m_value;
|
||||
|
||||
@@ -16,25 +16,12 @@ 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; }
|
||||
virtual uid_t uid() const override { return m_inode.uid; }
|
||||
virtual gid_t gid() const override { return m_inode.gid; }
|
||||
virtual off_t size() const override { return m_inode.size; }
|
||||
virtual timespec atime() const override { return timespec { .tv_sec = m_inode.atime, .tv_nsec = 0 }; }
|
||||
virtual timespec mtime() const override { return timespec { .tv_sec = m_inode.mtime, .tv_nsec = 0 }; }
|
||||
virtual timespec ctime() const override { return timespec { .tv_sec = m_inode.ctime, .tv_nsec = 0 }; }
|
||||
virtual blksize_t blksize() const override;
|
||||
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;
|
||||
|
||||
protected:
|
||||
private:
|
||||
virtual BAN::ErrorOr<void> sync_inode(SyncType) override;
|
||||
virtual BAN::ErrorOr<void> sync_data() override;
|
||||
|
||||
virtual BAN::ErrorOr<BAN::RefPtr<Inode>> find_inode_impl(BAN::StringView) override;
|
||||
virtual BAN::ErrorOr<size_t> list_next_inodes_impl(off_t, struct dirent*, size_t) override;
|
||||
virtual BAN::ErrorOr<void> create_file_impl(BAN::StringView, mode_t, uid_t, gid_t) override;
|
||||
@@ -49,10 +36,6 @@ namespace Kernel
|
||||
virtual BAN::ErrorOr<size_t> read_impl(off_t, BAN::ByteSpan) override;
|
||||
virtual BAN::ErrorOr<size_t> write_impl(off_t, BAN::ConstByteSpan) override;
|
||||
virtual BAN::ErrorOr<void> truncate_impl(size_t) override;
|
||||
virtual BAN::ErrorOr<void> chmod_impl(mode_t) override;
|
||||
virtual BAN::ErrorOr<void> chown_impl(uid_t, gid_t) override;
|
||||
virtual BAN::ErrorOr<void> utimens_impl(const timespec[2]) override;
|
||||
virtual BAN::ErrorOr<void> fsync_impl() override;
|
||||
|
||||
virtual bool can_read_impl() const override { return true; }
|
||||
virtual bool can_write_impl() const override { return true; }
|
||||
@@ -66,7 +49,7 @@ namespace Kernel
|
||||
// NOTE: the inode might have more blocks than what this suggests if it has been shrinked
|
||||
uint32_t max_used_data_block_count() const { return size() / blksize(); }
|
||||
|
||||
BAN::ErrorOr<void> sync_no_lock();
|
||||
BAN::ErrorOr<void> sync_inode_no_lock();
|
||||
|
||||
BAN::ErrorOr<bool> is_directory_empty_no_lock();
|
||||
BAN::ErrorOr<BAN::RefPtr<Inode>> find_inode_no_lock(BAN::StringView);
|
||||
@@ -101,7 +84,7 @@ namespace Kernel
|
||||
{
|
||||
// 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())
|
||||
if (auto ret = inode.sync_inode_no_lock(); ret.is_error())
|
||||
dwarnln("failed to sync inode: {}", ret.error());
|
||||
}
|
||||
|
||||
|
||||
@@ -19,7 +19,10 @@ namespace Kernel
|
||||
|
||||
const FAT::DirectoryEntry& entry() const { return m_entry; }
|
||||
|
||||
protected:
|
||||
private:
|
||||
virtual BAN::ErrorOr<void> sync_inode(SyncType) override { return {}; }
|
||||
virtual BAN::ErrorOr<void> sync_data() override { return {}; }
|
||||
|
||||
virtual BAN::ErrorOr<BAN::RefPtr<Inode>> find_inode_impl(BAN::StringView) override;
|
||||
virtual BAN::ErrorOr<size_t> list_next_inodes_impl(off_t, struct dirent*, size_t) override;
|
||||
//virtual BAN::ErrorOr<void> create_file_impl(BAN::StringView, mode_t, uid_t, gid_t) override;
|
||||
@@ -29,9 +32,6 @@ namespace Kernel
|
||||
virtual BAN::ErrorOr<size_t> read_impl(off_t, BAN::ByteSpan) override;
|
||||
//virtual BAN::ErrorOr<size_t> write_impl(off_t, BAN::ConstByteSpan) override;
|
||||
//virtual BAN::ErrorOr<void> truncate_impl(size_t) override;
|
||||
//virtual BAN::ErrorOr<void> chmod_impl(mode_t) override;
|
||||
//virtual BAN::ErrorOr<void> utimens_impl(const timespec[2]) override;
|
||||
virtual BAN::ErrorOr<void> fsync_impl() override { return {}; }
|
||||
|
||||
virtual bool can_read_impl() const override { return true; }
|
||||
virtual bool can_write_impl() const override { return true; }
|
||||
|
||||
@@ -61,7 +61,9 @@ namespace Kernel
|
||||
bool ifsock() const { return (mode & Mask::TYPE_MASK) == Mask::IFSOCK; }
|
||||
mode_t mode;
|
||||
};
|
||||
enum InodeKind : uint8_t {
|
||||
|
||||
enum InodeKind : uint8_t
|
||||
{
|
||||
DEVICE = 0x01,
|
||||
EPOLL = 0x02,
|
||||
PIPE = 0x04,
|
||||
@@ -69,6 +71,15 @@ namespace Kernel
|
||||
PARTITION = 0x10,
|
||||
STORAGE = 0x20,
|
||||
};
|
||||
|
||||
enum class SyncType
|
||||
{
|
||||
General,
|
||||
Mode,
|
||||
UidGid,
|
||||
Times,
|
||||
};
|
||||
|
||||
public:
|
||||
virtual ~Inode() {}
|
||||
|
||||
@@ -134,10 +145,10 @@ namespace Kernel
|
||||
BAN::ErrorOr<void> fsync();
|
||||
|
||||
// Select/Non blocking API
|
||||
bool can_read() const;
|
||||
bool can_write() const;
|
||||
bool has_error() const;
|
||||
bool has_hungup() const;
|
||||
bool can_read() const { return can_read_impl(); }
|
||||
bool can_write() const { return can_write_impl(); }
|
||||
bool has_error() const { return has_error_impl(); }
|
||||
bool has_hungup() const { return has_hungup_impl(); }
|
||||
|
||||
BAN::ErrorOr<long> ioctl(int request, void* arg);
|
||||
|
||||
@@ -148,6 +159,9 @@ namespace Kernel
|
||||
virtual void on_close(int status_flags) { (void)status_flags; }
|
||||
virtual void on_clone(int status_flags) { (void)status_flags; }
|
||||
|
||||
virtual BAN::ErrorOr<void> sync_inode(SyncType) = 0;
|
||||
virtual BAN::ErrorOr<void> sync_data() = 0;
|
||||
|
||||
protected:
|
||||
// Directory API
|
||||
virtual BAN::ErrorOr<BAN::RefPtr<Inode>> find_inode_impl(BAN::StringView) { return BAN::Error::from_errno(ENOTSUP); }
|
||||
@@ -178,10 +192,6 @@ namespace Kernel
|
||||
virtual BAN::ErrorOr<size_t> read_impl(off_t, BAN::ByteSpan) { return BAN::Error::from_errno(ENOTSUP); }
|
||||
virtual BAN::ErrorOr<size_t> write_impl(off_t, BAN::ConstByteSpan) { return BAN::Error::from_errno(ENOTSUP); }
|
||||
virtual BAN::ErrorOr<void> truncate_impl(size_t) { return BAN::Error::from_errno(ENOTSUP); }
|
||||
virtual BAN::ErrorOr<void> chmod_impl(mode_t) { return BAN::Error::from_errno(ENOTSUP); }
|
||||
virtual BAN::ErrorOr<void> chown_impl(uid_t, gid_t) { return BAN::Error::from_errno(ENOTSUP); }
|
||||
virtual BAN::ErrorOr<void> utimens_impl(const timespec[2]) { return BAN::Error::from_errno(ENOTSUP); }
|
||||
virtual BAN::ErrorOr<void> fsync_impl() = 0;
|
||||
|
||||
// Select/Non blocking API
|
||||
virtual bool can_read_impl() const = 0;
|
||||
@@ -196,6 +206,7 @@ namespace Kernel
|
||||
// But the thing is I would have to refactor a big chunk of the codebase
|
||||
// to add it as a parameter to Inode() soooooo yeah no, not doing that rn.
|
||||
uint8_t m_kind = 0;
|
||||
|
||||
BAN::Atomic<ino_t> m_ino;
|
||||
BAN::Atomic<mode_t> m_mode;
|
||||
BAN::Atomic<nlink_t> m_nlink;
|
||||
@@ -210,12 +221,14 @@ namespace Kernel
|
||||
BAN::Atomic<blkcnt_t> m_blocks;
|
||||
BAN::Atomic<dev_t> m_dev;
|
||||
BAN::Atomic<dev_t> m_rdev;
|
||||
|
||||
private:
|
||||
SpinLock m_shared_region_lock;
|
||||
BAN::WeakPtr<SharedFileData> m_shared_region;
|
||||
|
||||
SpinLock m_epoll_lock;
|
||||
BAN::LinkedList<class Epoll*> m_epolls;
|
||||
|
||||
friend class Epoll;
|
||||
friend class FileBackedRegion;
|
||||
friend class OpenFileDescriptorSet;
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
namespace Kernel
|
||||
{
|
||||
|
||||
class Pipe : public Inode, public BAN::Weakable<Pipe>
|
||||
class Pipe final : public Inode, public BAN::Weakable<Pipe>
|
||||
{
|
||||
public:
|
||||
static BAN::ErrorOr<BAN::RefPtr<Inode>> open(BAN::RefPtr<Inode>, int status_flags);
|
||||
@@ -22,10 +22,13 @@ namespace Kernel
|
||||
|
||||
virtual const FileSystem* filesystem() const override { return nullptr; }
|
||||
|
||||
protected:
|
||||
private:
|
||||
virtual BAN::ErrorOr<void> sync_inode(SyncType) override;
|
||||
virtual BAN::ErrorOr<void> sync_data() override;
|
||||
|
||||
virtual BAN::ErrorOr<size_t> read_impl(off_t, BAN::ByteSpan) override;
|
||||
virtual BAN::ErrorOr<size_t> write_impl(off_t, BAN::ConstByteSpan) override;
|
||||
virtual BAN::ErrorOr<void> fsync_impl() final override { return {}; }
|
||||
virtual BAN::ErrorOr<void> truncate_impl(size_t) override;
|
||||
|
||||
virtual bool can_read_impl() const override { return !m_buffer->empty(); }
|
||||
virtual bool can_write_impl() const override { return true; }
|
||||
|
||||
@@ -40,9 +40,9 @@ namespace Kernel
|
||||
m_gid = info.gid;
|
||||
}
|
||||
|
||||
BAN::ErrorOr<void> fsync_impl() final override { return {}; }
|
||||
|
||||
private:
|
||||
BAN::ErrorOr<void> sync_inode(SyncType) final override { return {}; }
|
||||
BAN::ErrorOr<void> sync_data() final override { return {}; }
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -26,18 +26,14 @@ namespace Kernel
|
||||
{
|
||||
public:
|
||||
static BAN::ErrorOr<BAN::RefPtr<TmpInode>> create_from_existing(TmpFileSystem&, ino_t, const TmpInodeInfo&);
|
||||
~TmpInode();
|
||||
virtual ~TmpInode();
|
||||
|
||||
virtual const FileSystem* filesystem() const override;
|
||||
|
||||
protected:
|
||||
TmpInode(TmpFileSystem&, ino_t, const TmpInodeInfo&);
|
||||
virtual BAN::ErrorOr<void> chmod_impl(mode_t) override;
|
||||
virtual BAN::ErrorOr<void> chown_impl(uid_t, gid_t) override;
|
||||
virtual BAN::ErrorOr<void> utimens_impl(const timespec[2]) override;
|
||||
virtual BAN::ErrorOr<void> fsync_impl() override { return {}; }
|
||||
|
||||
void sync();
|
||||
void write_inode_to_fs();
|
||||
virtual BAN::ErrorOr<void> prepare_unlink_no_lock() { return {}; };
|
||||
|
||||
void free_all_blocks();
|
||||
@@ -49,6 +45,10 @@ namespace Kernel
|
||||
BAN::ErrorOr<size_t> block_index_with_allocation(size_t data_block_index);
|
||||
BAN::ErrorOr<size_t> block_index_from_indirect_with_allocation_no_lock(size_t& block, size_t index, uint32_t depth);
|
||||
|
||||
private:
|
||||
BAN::ErrorOr<void> sync_inode(SyncType) override;
|
||||
BAN::ErrorOr<void> sync_data() override;
|
||||
|
||||
protected:
|
||||
TmpFileSystem& m_fs;
|
||||
TmpBlocks m_tmp_blocks;
|
||||
@@ -66,7 +66,7 @@ namespace Kernel
|
||||
static BAN::ErrorOr<BAN::RefPtr<TmpFileInode>> create_new(TmpFileSystem&, mode_t, uid_t, gid_t);
|
||||
~TmpFileInode();
|
||||
|
||||
protected:
|
||||
private:
|
||||
virtual BAN::ErrorOr<size_t> read_impl(off_t, BAN::ByteSpan) override;
|
||||
virtual BAN::ErrorOr<size_t> write_impl(off_t, BAN::ConstByteSpan) override;
|
||||
virtual BAN::ErrorOr<void> truncate_impl(size_t) override;
|
||||
@@ -89,7 +89,7 @@ namespace Kernel
|
||||
static BAN::ErrorOr<BAN::RefPtr<TmpFIFOInode>> create_new(TmpFileSystem&, mode_t, uid_t, gid_t);
|
||||
~TmpFIFOInode();
|
||||
|
||||
protected:
|
||||
private:
|
||||
virtual BAN::ErrorOr<size_t> read_impl(off_t, BAN::ByteSpan) override { return BAN::Error::from_errno(ENODEV); }
|
||||
virtual BAN::ErrorOr<size_t> write_impl(off_t, BAN::ConstByteSpan) override { return BAN::Error::from_errno(ENODEV); }
|
||||
virtual BAN::ErrorOr<void> truncate_impl(size_t) override { return BAN::Error::from_errno(ENODEV); }
|
||||
@@ -111,7 +111,7 @@ namespace Kernel
|
||||
static BAN::ErrorOr<BAN::RefPtr<TmpSocketInode>> create_new(TmpFileSystem&, mode_t, uid_t, gid_t);
|
||||
~TmpSocketInode();
|
||||
|
||||
protected:
|
||||
private:
|
||||
virtual BAN::ErrorOr<size_t> read_impl(off_t, BAN::ByteSpan) override { return BAN::Error::from_errno(ENODEV); }
|
||||
virtual BAN::ErrorOr<size_t> write_impl(off_t, BAN::ConstByteSpan) override { return BAN::Error::from_errno(ENODEV); }
|
||||
virtual BAN::ErrorOr<void> truncate_impl(size_t) override { return BAN::Error::from_errno(ENODEV); }
|
||||
@@ -133,7 +133,7 @@ namespace Kernel
|
||||
static BAN::ErrorOr<BAN::RefPtr<TmpSymlinkInode>> create_new(TmpFileSystem&, mode_t, uid_t, gid_t, BAN::StringView target);
|
||||
~TmpSymlinkInode();
|
||||
|
||||
protected:
|
||||
private:
|
||||
BAN::ErrorOr<BAN::String> link_target_impl() override;
|
||||
BAN::ErrorOr<void> set_link_target_impl(BAN::StringView) override;
|
||||
|
||||
|
||||
@@ -51,15 +51,6 @@ namespace Kernel
|
||||
|
||||
virtual void clear() = 0;
|
||||
|
||||
virtual BAN::ErrorOr<void> chmod_impl(mode_t) override;
|
||||
virtual BAN::ErrorOr<void> chown_impl(uid_t, gid_t) override;
|
||||
|
||||
virtual BAN::ErrorOr<long> ioctl_impl(int, void*) override;
|
||||
|
||||
virtual bool can_read_impl() const override { return m_output.flush; }
|
||||
virtual bool has_error_impl() const override { return false; }
|
||||
virtual bool has_hungup_impl() const override { return false; }
|
||||
|
||||
virtual bool master_has_closed() const { return false; }
|
||||
|
||||
protected:
|
||||
@@ -68,10 +59,16 @@ namespace Kernel
|
||||
virtual bool putchar_impl(uint8_t ch) = 0;
|
||||
virtual void after_write() {}
|
||||
|
||||
void update_winsize(unsigned short cols, unsigned short rows);
|
||||
|
||||
virtual BAN::ErrorOr<size_t> read_impl(off_t, BAN::ByteSpan) final override;
|
||||
virtual BAN::ErrorOr<size_t> write_impl(off_t, BAN::ConstByteSpan) final override;
|
||||
|
||||
void update_winsize(unsigned short cols, unsigned short rows);
|
||||
virtual bool can_read_impl() const override { return m_output.flush; }
|
||||
virtual bool has_error_impl() const override { return false; }
|
||||
virtual bool has_hungup_impl() const override { return false; }
|
||||
|
||||
virtual BAN::ErrorOr<long> ioctl_impl(int, void*) override;
|
||||
|
||||
private:
|
||||
bool putchar(uint8_t ch);
|
||||
|
||||
Reference in New Issue
Block a user