]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
fstrim: prefer earlier mounted filesystems
authorAlex Ivanov <yourbestfriend@openmailbox.org>
Thu, 15 Jun 2017 08:26:25 +0000 (11:26 +0300)
committerKarel Zak <kzak@redhat.com>
Thu, 15 Jun 2017 09:45:35 +0000 (11:45 +0200)
fstrim --all is broken in a way that if there is a bind mount for some filesystem,
that filesystem will not be trimmed. This is especially critical for e.g.
NixOS distribution, which needs bind mount within root fs:
https://github.com/NixOS/nixos/blob/master/modules/system/boot/stage-2-init.sh#L55

Currently for a given filesystem during "de-duplication by source and root" phase,
an early mounted fs path is filtered (e.g. "/"), while later mounted fs path is kept
(e.g. "/nix/store") though anyway discarded later (since it's an overlaying mount).
This leads to skipped trimming.

So flip this behaviour. Should also help for other types of overlaying mounts.

Reference:
https://github.com/karelzak/util-linux/blob/stable/v2.29/libmount/src/tab.c#L715

Signed-off-by: Alex Ivanov <yourbestfriend@openmailbox.org>
sys-utils/fstrim.c

index b884af6d03c9110ca32cf57b19d046312e74de3f..be3cd34a3b0a0675165a91a972f767dcfe86ea6b 100644 (file)
@@ -194,7 +194,7 @@ static int fstrim_all(struct fstrim_range *rangetpl, int verbose)
        mnt_table_uniq_fs(tab, 0, uniq_fs_target_cmp);
 
        /* de-duplicate by source and root */
-       mnt_table_uniq_fs(tab, 0, uniq_fs_source_cmp);
+       mnt_table_uniq_fs(tab, MNT_UNIQ_FORWARD, uniq_fs_source_cmp);
 
        while (mnt_table_next_fs(tab, itr, &fs) == 0) {
                const char *src = mnt_fs_get_srcpath(fs),