diff --git a/thumbnail/thumbnail.h b/thumbnail/thumbnail.h --- a/thumbnail/thumbnail.h +++ b/thumbnail/thumbnail.h @@ -83,6 +83,8 @@ QSet m_propagationDirectories; QString m_thumbBasePath; qint64 m_maxFileSize; + dev_t m_thumbnailDirDeviceId = 0; + short allowDirCatche; }; #endif diff --git a/thumbnail/thumbnail.cpp b/thumbnail/thumbnail.cpp --- a/thumbnail/thumbnail.cpp +++ b/thumbnail/thumbnail.cpp @@ -28,6 +28,7 @@ #ifndef Q_OS_WIN #include #include +#include #include // nice() #endif @@ -77,6 +78,7 @@ #endif #include "imagefilter.h" +#include // Recognized metadata entries: // mimeType - the mime type of the file, used for the overlay icon if any @@ -533,6 +535,8 @@ const int maxYPos = folderHeight - bottomMargin - segmentHeight; int validThumbnails = 0; + // we need to reset this check per directory + allowDirCatche = -1; while ((skipped <= skipValidItems) && (yPos <= maxYPos) && validThumbnails == 0) { QDirIterator dir(localFile, QDir::Files | QDir::Readable); @@ -722,6 +726,34 @@ if (!thumbnail.load(thumbPath.absoluteFilePath(thumbName))) { // no cached version is available, a new thumbnail must be created + // If file is on the same filesystem as thumbnail directory, we can cache it. + bool allowCache; + if (allowDirCatche != -1) { + allowCache = allowDirCatche; + } + else { + allowCache = false; +#ifdef _SYS_STAT_H + if (!m_thumbnailDirDeviceId) { + struct stat baseStat; + if (!lstat(QFile::encodeName(m_thumbBasePath).data(), &baseStat)) { + m_thumbnailDirDeviceId = baseStat.st_dev; + } + } + struct stat fileStat; + if (m_thumbnailDirDeviceId && !lstat(QFile::encodeName(filePath).data(), &fileStat)) { + allowCache = m_thumbnailDirDeviceId == fileStat.st_dev; + } +#endif + if (!allowCache) { + // If file is on encrypted filesystem different than thumbnail directory, we can't cache it + const auto mountsList = KMountPoint::currentMountPoints(); + const auto mount = mountsList.findByPath(filePath); + allowCache = !(mount->mountType() == QLatin1String("fuse.cryfs") || mount->mountType() == QLatin1String("fuse.encfs")); + } + allowDirCatche = allowCache; + } + QSaveFile thumbnailfile(thumbPath.absoluteFilePath(thumbName)); bool savedCorrectly = false; if (subCreator->create(filePath, cacheSize, cacheSize, thumbnail)) { @@ -729,7 +761,7 @@ // The thumbnail has been created successfully. Store the thumbnail // to the cache for future access. - if (thumbnailfile.open(QIODevice::WriteOnly | QIODevice::Truncate)) { + if (allowCache && thumbnailfile.open(QIODevice::WriteOnly | QIODevice::Truncate)) { savedCorrectly = thumbnail.save(&thumbnailfile, "PNG"); } } else {