diff --git a/Kernel/FileSystem/SysFS.cpp b/Kernel/FileSystem/SysFS.cpp index bedf3d6353..cc26614663 100644 --- a/Kernel/FileSystem/SysFS.cpp +++ b/Kernel/FileSystem/SysFS.cpp @@ -182,9 +182,14 @@ KResult SysFSInode::chown(UserID, GroupID) return EPERM; } -KResult SysFSInode::truncate(u64) +KResult SysFSInode::set_mtime(time_t time) { - return EPERM; + return m_associated_component->set_mtime(time); +} + +KResult SysFSInode::truncate(u64 size) +{ + return m_associated_component->truncate(size); } KResultOr> SysFSDirectoryInode::try_create(SysFS const& sysfs, SysFSComponent const& component) diff --git a/Kernel/FileSystem/SysFS.h b/Kernel/FileSystem/SysFS.h index 886c31eeb9..4b8bf05c94 100644 --- a/Kernel/FileSystem/SysFS.h +++ b/Kernel/FileSystem/SysFS.h @@ -146,6 +146,7 @@ protected: virtual KResult chmod(mode_t) override; virtual KResult chown(UserID, GroupID) override; virtual KResult truncate(u64) override; + virtual KResult set_mtime(time_t); virtual KResult attach(OpenFileDescription& description) override final; virtual void did_seek(OpenFileDescription&, off_t) override final; diff --git a/Kernel/FileSystem/SysFSComponent.h b/Kernel/FileSystem/SysFSComponent.h index c6711a3c47..30f1c66ebb 100644 --- a/Kernel/FileSystem/SysFSComponent.h +++ b/Kernel/FileSystem/SysFSComponent.h @@ -30,6 +30,8 @@ public: virtual KResult traverse_as_directory(unsigned, Function) const { VERIFY_NOT_REACHED(); } virtual RefPtr lookup(StringView) { VERIFY_NOT_REACHED(); }; virtual mode_t permissions() const; + virtual KResult truncate(u64) { return EPERM; } + virtual KResult set_mtime(time_t) { return ENOTIMPL; } virtual KResultOr write_bytes(off_t, size_t, UserOrKernelBuffer const&, OpenFileDescription*) { return EROFS; } virtual KResult refresh_data(OpenFileDescription&) const { return KSuccess; } diff --git a/Kernel/Firmware/PowerStateSwitch.cpp b/Kernel/Firmware/PowerStateSwitch.cpp index 16f9e07101..e0f9b53dbe 100644 --- a/Kernel/Firmware/PowerStateSwitch.cpp +++ b/Kernel/Firmware/PowerStateSwitch.cpp @@ -30,6 +30,15 @@ UNMAP_AFTER_INIT PowerStateSwitchNode::PowerStateSwitchNode(FirmwareSysFSDirecto { } +KResult PowerStateSwitchNode::truncate(u64 size) +{ + // Note: This node doesn't store any useful data anyway, so we can safely + // truncate this to zero (essentially ignoring the request without failing). + if (size != 0) + return EPERM; + return KSuccess; +} + KResultOr PowerStateSwitchNode::write_bytes(off_t offset, size_t count, UserOrKernelBuffer const& data, OpenFileDescription*) { if (Checked::addition_would_overflow(offset, count)) diff --git a/Kernel/Firmware/PowerStateSwitch.h b/Kernel/Firmware/PowerStateSwitch.h index e96540f202..c35bd85ff4 100644 --- a/Kernel/Firmware/PowerStateSwitch.h +++ b/Kernel/Firmware/PowerStateSwitch.h @@ -25,6 +25,8 @@ public: static NonnullRefPtr must_create(FirmwareSysFSDirectory&); virtual mode_t permissions() const override; virtual KResultOr write_bytes(off_t, size_t, UserOrKernelBuffer const&, OpenFileDescription*) override; + virtual KResult truncate(u64) override; + virtual KResult set_mtime(time_t) { return KSuccess; } private: PowerStateSwitchNode(FirmwareSysFSDirectory&);