1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 10:48:11 +00:00

Kernel: Update atime/ctime/mtime timestamps atomically

Instead of having three separate APIs (one for each timestamp),
there's now only Inode::update_timestamps() and it takes 3x optional
timestamps. The non-empty timestamps are updated while holding the inode
mutex, and the outside world no longer has to look at intermediate
timestamp states.
This commit is contained in:
Andreas Kling 2022-08-22 13:34:22 +02:00
parent 35b2e9c663
commit 280694bb46
18 changed files with 34 additions and 109 deletions

View file

@ -301,29 +301,16 @@ ErrorOr<void> TmpFSInode::truncate(u64 size)
return {};
}
ErrorOr<void> TmpFSInode::set_atime(time_t time)
ErrorOr<void> TmpFSInode::update_timestamps(Optional<time_t> atime, Optional<time_t> ctime, Optional<time_t> mtime)
{
MutexLocker locker(m_inode_lock);
m_metadata.atime = time;
set_metadata_dirty(true);
return {};
}
ErrorOr<void> TmpFSInode::set_ctime(time_t time)
{
MutexLocker locker(m_inode_lock);
m_metadata.ctime = time;
set_metadata_dirty(true);
return {};
}
ErrorOr<void> TmpFSInode::set_mtime(time_t t)
{
MutexLocker locker(m_inode_lock);
m_metadata.mtime = t;
if (atime.has_value())
m_metadata.atime = atime.value();
if (ctime.has_value())
m_metadata.ctime = ctime.value();
if (mtime.has_value())
m_metadata.ctime = mtime.value();
set_metadata_dirty(true);
return {};
}