From c67c27ccace1faa54e0515b9fc79895a979c399b Mon Sep 17 00:00:00 2001 From: Luke Hines Date: Sat, 18 Jul 2026 14:11:35 +0100 Subject: [PATCH] Fsync parent directory after atomic save --- src/sessionmanager.cpp | 13 +++++++++++++ src/settings.cpp | 13 +++++++++++++ 2 files changed, 26 insertions(+) diff --git a/src/sessionmanager.cpp b/src/sessionmanager.cpp index 219a2d0..a034bf3 100644 --- a/src/sessionmanager.cpp +++ b/src/sessionmanager.cpp @@ -17,6 +17,9 @@ #include #include #include +#include +#include +#include #include static constexpr int kMaxSessionCount = 100; @@ -985,6 +988,16 @@ void SessionManager::saveSessionScrollback(SessionInfo &info) ::fsync(saveFile.handle()); if (saveFile.commit()) { info.scrollbackDirty = false; + // fsync the parent directory so the rename's dirent update + // survives a power loss (file content is already durable). + int dirFd = ::open(scrollbackDir().toUtf8().constData(), O_RDONLY); + if (dirFd >= 0) { + if (::fsync(dirFd) != 0) + qWarning() << "Scrollback: dir fsync failed:" << std::strerror(errno); + ::close(dirFd); + } else { + qWarning() << "Scrollback: dir fsync open failed:" << std::strerror(errno); + } } else { qWarning() << "Failed to commit scrollback:" << saveFile.errorString(); } diff --git a/src/settings.cpp b/src/settings.cpp index 34f64b5..b021bb9 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -2,11 +2,13 @@ #include #include +#include #include #include #include #include +#include #include Settings::Settings(QObject *parent) @@ -89,6 +91,17 @@ void Settings::save() qWarning() << "Settings: atomic save failed:" << std::strerror(errno); QFile::remove(tmpPath); m_settings.sync(); + } else { + // fsync the parent directory so the rename's dirent update + // survives a power loss (file content is already durable). + int dirFd = ::open(QFileInfo(path).absolutePath().toUtf8().constData(), O_RDONLY); + if (dirFd >= 0) { + if (::fsync(dirFd) != 0) + qWarning() << "Settings: dir fsync failed:" << std::strerror(errno); + ::close(dirFd); + } else { + qWarning() << "Settings: dir fsync open failed:" << std::strerror(errno); + } } } else { m_settings.sync();