From 416027de643acd0d357963ccbac223a2fcf7804c Mon Sep 17 00:00:00 2001 From: Mike Fleetwood Date: Sun, 24 Jan 2021 16:19:55 +0000 Subject: [PATCH] Remove extra execution of blkid for whole disk devices (#131) On Fedora 31 with this simple disk layout where both sdb and sdc are completely empty: # lsblk -o name,maj:min,rm,size,ro,type,fstype,label,mountpoint NAME MAJ:MIN RM SIZE RO TYPE FSTYPE LABEL MOUNTPOINT sda 8:0 0 20G 0 disk |-sda1 8:1 0 1G 0 part ext4 /boot \-sda2 8:2 0 19G 0 part LVM2_member |-fedora-root 253:0 0 17G 0 lvm ext4 / \-fedora-swap 253:1 0 2G 0 lvm swap [SWAP] sdb 8:16 0 8G 0 disk sdc 8:32 0 8G 0 disk sr0 11:0 1 1024M 0 rom # blkid /dev/sda /dev/sda1 /dev/sda2 /dev/sdb /dev/sdc /dev/sda: PTUUID="5012fb1f" PTTYPE="dos" /dev/sda1: UUID="3cd48816-7817-4636-9fec-5f1afe76c1b2" TYPE="ext4" PARTUUID="5012fb1f-01" /dev/sda2: UUID="PH94ej-C8xU-bnMJ-UIh8-ZimI-4B7f-dHlZxh" TYPE="LVM2_member" PARTUUID="5012fb1f-02" Stracing GParted shows extra executions of blkid: # strace -f -q -bexecve -eexecve ./gpartedbin 2>&1 1> /dev/null | egrep -v 'ENOENT|SIGCHLD' ... [pid 7659] execve("/usr/sbin/blkid", ["blkid", "/dev/sda", "/dev/sda1", "/dev/sda2", "/dev/sdb", "/dev/sdc"], 0x1d300f0 /* 32 vars */ [pid 7660] execve("/usr/sbin/blkid", ["blkid", "/dev/sdb"], 0x1d300f0 /* 32 vars */ [pid 7661] execve("/usr/sbin/blkid", ["blkid", "/dev/sdc"], 0x1d300f0 /* 32 vars */ ... blkid is only run again for sdb and sdc, not sda, because blkid didn't report anything for them from the first execution. GParted needs blkid identification of whole disk devices to ensure that ISO9660 images on whole disk devices are correctly identified [1]. Now the first run of blkid passes all the device names, so this additional execution of blkid won't get any extra information and is redundant. Therefore remove this unnecessary code. [1] b2190372d04f09bd38a7395b38e43034f1733d81 Ensure blkid FS_Info cache has entries for all whole disk devices (#771244) Closes #131 - GParted hangs when non-named device is hung --- src/FS_Info.cc | 20 +++----------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/src/FS_Info.cc b/src/FS_Info.cc index ecc56696..750a2d49 100644 --- a/src/FS_Info.cc +++ b/src/FS_Info.cc @@ -14,9 +14,9 @@ * along with this program; if not, see . */ + #include "FS_Info.h" #include "BlockSpecial.h" -#include "Proc_Partitions_Info.h" #include "Utils.h" #include @@ -24,6 +24,7 @@ #include #include + namespace GParted { @@ -208,25 +209,10 @@ const FS_Entry & FS_Info::get_cache_entry_by_path( const Glib::ustring & path ) void FS_Info::load_fs_info_cache(const std::vector& paths) { fs_info_cache.clear(); - // Run "blkid" and load entries into the cache. run_blkid_load_cache(paths); - - // (#771244) Ensure the cache has entries for all whole disk devices, even if - // those entries are blank. Needed so that an ISO9660 image stored on a whole - // disk device is detected before any embedded partitions within the image. - const BlockSpecial empty_bs = BlockSpecial(); - std::vector all_devices = Proc_Partitions_Info::get_device_paths(); - for ( unsigned int i = 0 ; i < all_devices.size() ; i ++ ) - { - const FS_Entry & fs_entry = get_cache_entry_by_path( all_devices[i] ); - if ( fs_entry.path == empty_bs ) - { - // Run "blkid PATH" and load entry into cache for missing entries. - load_fs_info_cache_extra_for_path( all_devices[i] ); - } - } } + void FS_Info::load_fs_info_cache_extra_for_path( const Glib::ustring & path ) { std::vector one_path;