From 221a94a66c4d2f6e4f2dc938ee8a63a6ca739477 Mon Sep 17 00:00:00 2001 From: Ahmad Samir Date: Wed, 20 Oct 2021 20:01:40 +0200 Subject: [PATCH] KMountPoint: revert to parsing /dev/disk/by-{uuid,label}/ manually Apparently libblkid is causing some performance issues when resolving UUID/LABEL tags from fstab when the device that has that UUID/LABEL isn't present. Parsing /dev/disk/by-* is more basic, since it's a simple check resolving some symlinks. Thanks to the users in the bug report for the investigative work, because personally I couldn't reproduce the problem on my machine no matter what I tried. BUG: 442106 FIXED-IN: 5.88 --- CMakeLists.txt | 3 +-- src/core/CMakeLists.txt | 5 ++--- src/core/config-kmountpoint.h.cmake | 2 +- src/core/kmountpoint.cpp | 18 ++++-------------- 4 files changed, 8 insertions(+), 20 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ca374a4cb..f1bb1a59b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -130,8 +130,7 @@ set_package_properties(ACL PROPERTIES DESCRIPTION "LibACL" # Used by KMountPoint if (CMAKE_SYSTEM_NAME MATCHES "Linux") find_package(LibMount REQUIRED) - find_package(Blkid REQUIRED) - set(HAVE_LIBS_MOUNT_AND_BLKID ${LibMount_FOUND} AND ${Blkid_FOUND}) + set(HAVE_LIB_MOUNT ${LibMount_FOUND}) endif() if (ANDROID) diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index be19e9b62..67a1b1cf7 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -236,9 +236,8 @@ if(ACL_FOUND) target_link_libraries(KF5KIOCore PRIVATE ${ACL_LIBS}) endif() -if(HAVE_LIBS_MOUNT_AND_BLKID) - # libmount links against blkid anyway - target_link_libraries(KF5KIOCore PRIVATE LibMount::LibMount Blkid::Blkid) +if(HAVE_LIB_MOUNT) + target_link_libraries(KF5KIOCore PRIVATE LibMount::LibMount) endif() # this should be done by cmake, see bug 371721 diff --git a/src/core/config-kmountpoint.h.cmake b/src/core/config-kmountpoint.h.cmake index f824d4042..3673eb141 100644 --- a/src/core/config-kmountpoint.h.cmake +++ b/src/core/config-kmountpoint.h.cmake @@ -1,7 +1,7 @@ #cmakedefine01 HAVE_GETMNTINFO #cmakedefine01 GETMNTINFO_USES_STATVFS -#cmakedefine01 HAVE_LIBS_MOUNT_AND_BLKID +#cmakedefine01 HAVE_LIB_MOUNT #cmakedefine01 HAVE_SYS_MOUNT_H #cmakedefine01 HAVE_FSTAB_H diff --git a/src/core/kmountpoint.cpp b/src/core/kmountpoint.cpp index e2d32055c..f41cff5ee 100644 --- a/src/core/kmountpoint.cpp +++ b/src/core/kmountpoint.cpp @@ -44,7 +44,7 @@ static const Qt::CaseSensitivity cs = Qt::CaseSensitive; #endif // Linux -#if HAVE_LIBS_MOUNT_AND_BLKID +#if HAVE_LIB_MOUNT #include #include #endif @@ -176,7 +176,7 @@ KMountPoint::List KMountPoint::possibleMountPoints(DetailsNeededFlags infoNeeded #ifdef Q_OS_WIN result = KMountPoint::currentMountPoints(infoNeeded); -#elif HAVE_LIBS_MOUNT_AND_BLKID +#elif HAVE_LIB_MOUNT if (struct libmnt_table *table = mnt_new_table()) { // By default parses "/etc/fstab" if (mnt_table_parse_fstab(table, nullptr) == 0) { @@ -202,23 +202,13 @@ KMountPoint::List KMountPoint::possibleMountPoints(DetailsNeededFlags infoNeeded // or some network mount if (const char *source = mnt_fs_get_source(fs)) { mp->d->m_mountedFrom = QFile::decodeName(source); - if (mp->d->m_mountedFrom.startsWith(QLatin1String("UUID")) || mp->d->m_mountedFrom.startsWith(QLatin1String("LABEL"))) { - // Use blkid to resolve UUID/LABEL to the device file - if (char *blkSource = blkid_evaluate_spec(source, nullptr)) { - mp->d->m_mountedFrom = QFile::decodeName(blkSource); - free(blkSource); - if ((infoNeeded & KMountPoint::NeedRealDeviceName) // - && mp->d->m_mountedFrom.startsWith(QLatin1String("/dev/"))) { - mp->d->m_device = mp->d->m_mountedFrom; - } - } - } } if (infoNeeded & NeedMountOptions) { mp->d->m_mountOptions = QFile::decodeName(mnt_fs_get_options(fs)).split(QLatin1Char(',')); } + mp->d->finalizePossibleMountPoint(infoNeeded); result.append(mp); } mnt_free_iter(itr); @@ -351,7 +341,7 @@ KMountPoint::List KMountPoint::currentMountPoints(DetailsNeededFlags infoNeeded) } } -#elif HAVE_LIBS_MOUNT_AND_BLKID +#elif HAVE_LIB_MOUNT if (struct libmnt_table *table = mnt_new_table()) { // By default, parses "/proc/self/mountinfo" if (mnt_table_parse_mtab(table, nullptr) == 0) { -- GitLab