gparted/src
Mike Fleetwood 3d1b2921a6 Only explicitly flush devices when using libparted < 3.2 (#259)
During device probing GParted always explicitly calls ped_device_sync()
to flush the caches for coherency between the whole disk device and the
partition devices [1].  As the GParted_Core::flush_device() comment
explains, since v3.1.61-gfb99ba5 [2], libparted flushes the devices
every time a device is opened [3], so also explicitly doing this in
GParted is unnecessary.  Therefore stop explicitly flushing the devices
in GParted, except when using libparted 3.1 and older which doesn't do
it itself.

The ped_device_open() and ped_device_close() needed for the
ped_device_sync() is also a trigger of device changes and udev rule
execution performing LVM Volume Group activation, because libparted
opens the device read-write [4].  This is another reason to remove it
when possible.  However even when eliminated it does not solve the issue
of LVM VG activation because other triggers remain.  Do want this change
first though so that the sequence of libparted calls isn't changed
immediately after documenting them and fixing the issue and so that
there is no doubt that this change doesn't fix the issue.

Removing this extra device flush saves a little bit of time, depending
on the speed of the drive and number of partitions.  Sample savings on
my desktop:
    Drive type and partitions       Saving (seconds)
    -----------------------------   ----------------
    fast SSD with 3 partitions      0.05
    slow SSD with 12 partitions     0.27
    HDD with 1 partition            0.05
    VHDD in VM with 1 partition     0.14
    VHDD in VM with 10 partitions   0.58

Also the settle_device() call in flush_device() needs to be kept to wait
for device changes and udev rule execution whether it is GParted
explicitly flushing the device or just libparted automatically doing it
for cache coherency in ped_device_get().  This is because:
1.  Libparted <= 3.2 opens the whole disk device read-write for
    ped_device_get() [5].  (This was changed with parted
    v3.2.26-g44d5ae0 [6] to open the whole disk device read-only).
2.  Libparted up to and including the latest 3.6 release still opens all
    partition devices read-write for ped_device_get() [7].
3.  A whole disk device FAT32 file system looks enough like a partition
    table that both the Linux kernel and libparted think it is
    partitioned:
        # mkfs.fat -F32 /dev/sdb
        mkfs.fat 4.2 (2021-01-31)
        # grep sdb /proc/partitions
           8       16    8388608 sdb
           8       17    8388607 sdb1
        # parted /dev/sdb print
        Model: ATA VBOX HARDDISK (scsi)
        Disk /dev/sdb: 8590MB
        Sector size (logical/physical): 512B/512B
        Partition Table: loop
        Disk Flags:

        Number  Start  End        Size       File system  Flags
         1      0s     16777215s  16777216s  fat32

So the ped_device_get() call on a whole disk device FAT32 file system
still triggers device change and udev rule execution which needs to be
waited for, as this is exactly the case fixed previously by commit:
    1382e0b828
    Wait for udev change on /dev/DISK when querying whole device FS (!46)

[1] 3bea067596
    Flush devices when scanning to prevent reading stale signatures (#723842)
[2] Revert "linux-commit: do not unnecessarily open partition device nodes"
    http://git.savannah.gnu.org/cgit/parted.git/commit/?id=fb99ba5ebd0dc34204fc9f1014131d5d494805bc
[3] parted libparted/arch/linux.c:_device_open()
    https://git.savannah.gnu.org/cgit/parted.git/tree/libparted/arch/linux.c?h=v3.6#n1752
        1709 static int
        1710 linux_open (PedDevice* dev)
        1711 {
        1712     return _device_open (dev, RW_MODE);
        1713 }
        1714
        1715 static int
        1716 _device_open (PedDevice* dev, int flags)
        ...
        1752     _flush_cache (dev);

[4] parted libparted/device.c:ped_device_open() v3.6
    https://git.savannah.gnu.org/cgit/parted.git/tree/libparted/device.c?h=v3.6#n226
    parted libparted/arch/linux.c v3.6
    https://git.savannah.gnu.org/cgit/parted.git/tree/libparted/arch/linux.c?h=v3.6
        ped_device_open(...)
            ped_architecture->dev_ops->open(...) = linux_open(...)
                _device_open(..., RW_MODE)
                    open(..., O_RDWR)

[5] parted libparted/device.c:ped_device_get() v3.2
    https://git.savannah.gnu.org/cgit/parted.git/tree/libparted/device.c?h=v3.2#n149
    parted libparted/arch/linux.c v3.2
    https://git.savannah.gnu.org/cgit/parted.git/tree/libparted/arch/linux.c?h=v3.2
        ped_device_get(...)
            ped_architecture->dev_ops->_new(...) = linux_new()
                init_ide(...)
                init_scsi(...)
                init_generic(...)
                    ped_device_open(...)
                        ped_architecture->dev_ops->open(...) = linux_open(...)
                            open(..., O_RDWR)
[6] libparted: Use read only when probing devices on linux (#1245144)
    http://git.savannah.gnu.org/cgit/parted.git/commit/?id=44d5ae0115c4ecfe3158748309e9912c5aede92d
[7] parted libparted/arch/linux.v v3.6
    http://git.savannah.gnu.org/cgit/parted.git/tree/libparted/arch/linux.c?h=v3.6#n1660
        1660 static void
        1661 _flush_cache (PedDevice* dev)
        ...
        1673     for (i = 1; i < lpn; i++) {
        ...
        1680         if (!_partition_is_mounted_by_path(name)) {
        1681             fd = open (name, WR_MODE, 0);

Closes #259 - Trying to deactivate LVM PV fails
2024-09-14 08:44:43 +00:00
..
BCache_Info.cc Use POSIX basename() in BCache_Info.cc (!99) 2022-04-10 08:15:16 +01:00
BlockSpecial.cc Include sys/sysmacros.h for major and minor macros (#776173) 2017-01-04 10:58:44 +00:00
CopyBlocks.cc Replace String::ucompose() with Glibmm equivalent (#46) 2019-03-27 16:45:22 +00:00
DMRaid.cc Remove superfluous comment from DMRaid::lookup_dmraid_members() 2024-08-13 11:43:37 +00:00
Device.cc Return and use constant reference from Device::get_path() (!94) 2021-11-16 16:08:17 +00:00
DialogFeatures.cc White space tidy-up some of DialogFeatures 2021-07-30 16:12:24 +00:00
DialogManageFlags.cc Replace deprecated get_vbox() with get_content_area() (!25) 2019-04-27 12:03:05 +01:00
DialogPasswordEntry.cc Add accessibility relations (!92) 2021-10-09 08:34:41 +00:00
Dialog_Base_Partition.cc C++11: Convert NULL to nullptr (!117) 2023-09-23 15:30:15 +00:00
Dialog_Disklabel.cc Return and use constant reference from Device::get_path() (!94) 2021-11-16 16:08:17 +00:00
Dialog_FileSystem_Label.cc Add accessibility relations (!92) 2021-10-09 08:34:41 +00:00
Dialog_Partition_Copy.cc C++11: Convert NULL to nullptr (!117) 2023-09-23 15:30:15 +00:00
Dialog_Partition_Info.cc Stop assigning a zero length string when constructing them 2024-08-10 10:03:37 +00:00
Dialog_Partition_Name.cc Add accessibility relations (!92) 2021-10-09 08:34:41 +00:00
Dialog_Partition_New.cc C++11: Convert NULL to nullptr (!117) 2023-09-23 15:30:15 +00:00
Dialog_Partition_Resize_Move.cc C++11: Convert NULL to nullptr (!117) 2023-09-23 15:30:15 +00:00
Dialog_Progress.cc Write file system type as "[Encrypted] FSTYPE" to saved details 2023-10-04 16:03:09 +00:00
DrawingAreaVisualDisk.cc Remove final namespace qualifiers from use of GParted's own enums 2024-02-08 16:19:20 +00:00
FS_Info.cc Extract repeated code into trim_trailing_new_line() (!105) 2022-08-25 15:41:31 +00:00
FileSystem.cc C++11: Convert NULL to nullptr (!117) 2023-09-23 15:30:15 +00:00
Frame_Resizer_Base.cc Use Gdk::RGBA (!25) 2019-04-27 12:03:04 +01:00
Frame_Resizer_Extended.cc Use Gdk::RGBA (!25) 2019-04-27 12:03:04 +01:00
GParted_Core.cc Only explicitly flush devices when using libparted < 3.2 (#259) 2024-09-14 08:44:43 +00:00
HBoxOperations.cc Use Gtk::Box for HBoxOperations (!25) 2019-04-27 12:03:04 +01:00
LUKS_Info.cc Capture LUKS mapping master encryption key location (#59) 2021-04-25 15:49:35 +00:00
LVM2_PV_Info.cc Use constant reference from LVM2_PV_Info::get_vg_cache_entry_by_name() (!94) 2021-11-16 16:08:17 +00:00
Makefile.am Add bcachefs creation (!123) 2024-09-11 15:25:17 +00:00
MenuHelpers.cc Ensure icon sizes (#39) 2019-04-06 11:42:28 +01:00
Mount_Info.cc C++11: Convert NULL to nullptr (!117) 2023-09-23 15:30:15 +00:00
Operation.cc C++11: Convert NULL to nullptr (!117) 2023-09-23 15:30:15 +00:00
OperationChangeUUID.cc C++11: Convert NULL to nullptr (!117) 2023-09-23 15:30:15 +00:00
OperationCheck.cc C++11: Convert NULL to nullptr (!117) 2023-09-23 15:30:15 +00:00
OperationCopy.cc C++11: Convert NULL to nullptr (!117) 2023-09-23 15:30:15 +00:00
OperationCreate.cc C++11: Convert NULL to nullptr (!117) 2023-09-23 15:30:15 +00:00
OperationDelete.cc C++11: Convert NULL to nullptr (!117) 2023-09-23 15:30:15 +00:00
OperationDetail.cc C++11: Convert NULL to nullptr (!117) 2023-09-23 15:30:15 +00:00
OperationFormat.cc C++11: Convert NULL to nullptr (!117) 2023-09-23 15:30:15 +00:00
OperationLabelFileSystem.cc C++11: Convert NULL to nullptr (!117) 2023-09-23 15:30:15 +00:00
OperationNamePartition.cc C++11: Convert NULL to nullptr (!117) 2023-09-23 15:30:15 +00:00
OperationResizeMove.cc C++11: Convert NULL to nullptr (!117) 2023-09-23 15:30:15 +00:00
OptionComboBox.cc C++11: Convert NULL to nullptr (!117) 2023-09-23 15:30:15 +00:00
Partition.cc Return and use constant reference from Partition::get_mountpoints() (!94) 2021-11-16 16:08:17 +00:00
PartitionLUKS.cc Rename Partition.filesystem member to fstype (!52) 2019-12-03 13:24:44 +00:00
PartitionVector.cc Create and use general find_extended_partition() function 2017-01-14 08:49:58 -07:00
PasswordRAMStore.cc C++11: Convert NULL to nullptr (!117) 2023-09-23 15:30:15 +00:00
PipeCapture.cc C++11: Convert NULL to nullptr (!117) 2023-09-23 15:30:15 +00:00
Proc_Partitions_Info.cc Recognise NBDs (Network Block Devices) (#247) 2024-03-17 15:44:34 +00:00
ProgressBar.cc Return constant reference from ProgressBar::get_text() 2023-06-17 16:13:23 +00:00
SWRaid_Info.cc Return and use constant reference from SWRaid_Info::get_label() (!94) 2021-11-16 16:08:17 +00:00
SupportedFileSystems.cc Add bcachefs creation (!123) 2024-09-11 15:25:17 +00:00
TreeView_Detail.cc Return and use constant reference from Partition::get_mountpoints() (!94) 2021-11-16 16:08:17 +00:00
Utils.cc Drop the 2 decimal places when printing values in bytes 2024-09-11 15:25:17 +00:00
Win_GParted.cc Use Glib::build_path() to simplify remove_non_empty_lvm2_pv_dialog() 2024-08-10 10:03:37 +00:00
bcachefs.cc Query usage of multi-device bcachefs file systems correctly 2024-09-11 15:25:17 +00:00
btrfs.cc Stop using floating point calculations in FS resize() methods (!119) 2023-10-29 15:50:43 +00:00
exfat.cc Avoid using tune.exfat on a mounted exFAT file system 2024-08-10 10:03:37 +00:00
ext2.cc Prefix ext2 member variables with m_ and initialise all POD members 2024-08-10 10:03:37 +00:00
f2fs.cc Stop assigning a zero length string when constructing them 2024-08-10 10:03:37 +00:00
fat16.cc Rename fat16 member variable to m_specific_fstype 2024-08-10 10:03:37 +00:00
hfs.cc Stop assigning a zero length string when constructing them 2024-08-10 10:03:37 +00:00
hfsplus.cc Stop assigning a zero length string when constructing them 2024-08-10 10:03:37 +00:00
jfs.cc Add missing includes into jfs.cc 2019-11-14 17:12:06 +00:00
linux_swap.cc Stop using member variables T & N in linux_swap, luks & lvm2_pv classes (!119) 2023-10-29 15:50:43 +00:00
luks.cc Stop assigning a zero length string when constructing them 2024-08-10 10:03:37 +00:00
lvm2_pv.cc Stop assigning a zero length string when constructing them 2024-08-10 10:03:37 +00:00
main.cc Also write "Root privileges are required ..." message to stderr (!34) 2019-04-03 20:45:31 +00:00
minix.cc Add support for minix file system (!12) 2018-08-24 20:22:08 +01:00
nilfs2.cc Refactor nilfs2::set_used_sectors() into if fail return early pattern (!119) 2023-10-29 15:50:43 +00:00
ntfs.cc Stop assigning a zero length string when constructing them 2024-08-10 10:03:37 +00:00
reiser4.cc Refactor reiser4::set_used_sectors() into if fail return early pattern (!119) 2023-10-29 15:50:43 +00:00
reiserfs.cc Stop assigning a zero length string when constructing them 2024-08-10 10:03:37 +00:00
udf.cc Rename udf member variable to m_old_mkudffs 2024-08-10 10:03:37 +00:00
xfs.cc Prefix xfs member variables with m_ and initialise POD member 2024-08-10 10:03:37 +00:00