Kernel: Implement chown to ext2 and tmpfs

This commit is contained in:
Bananymous 2025-06-28 21:28:54 +03:00
parent f2eaab6e43
commit ebf2b16d09
4 changed files with 29 additions and 0 deletions

View File

@ -46,6 +46,7 @@ namespace Kernel
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;

View File

@ -48,6 +48,7 @@ namespace Kernel
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 {}; }

View File

@ -289,6 +289,26 @@ namespace Kernel
return {};
}
BAN::ErrorOr<void> Ext2Inode::chown_impl(uid_t uid, gid_t gid)
{
if (m_inode.uid == uid && m_inode.gid == gid)
return {};
const auto old_uid = m_inode.uid;
const auto old_gid = m_inode.gid;
m_inode.uid = uid;
m_inode.gid = gid;
if (auto ret = sync(); ret.is_error())
{
m_inode.uid = old_uid;
m_inode.gid = old_gid;
return ret.release_error();
}
return {};
}
BAN::ErrorOr<void> Ext2Inode::utimens_impl(const timespec times[2])
{
const uint32_t old_times[2] {

View File

@ -100,6 +100,13 @@ namespace Kernel
return {};
}
BAN::ErrorOr<void> TmpInode::chown_impl(uid_t new_uid, gid_t new_gid)
{
m_inode_info.uid = new_uid;
m_inode_info.gid = new_gid;
return {};
}
BAN::ErrorOr<void> TmpInode::utimens_impl(const timespec times[2])
{
if (times[0].tv_nsec != UTIME_OMIT)