]> git.ipfire.org Git - thirdparty/e2fsprogs.git/commitdiff
tune2fs: prohibit toggling uninit_bg on live filesystems
authorDarrick J. Wong <darrick.wong@oracle.com>
Wed, 20 Nov 2019 19:32:55 +0000 (11:32 -0800)
committerTheodore Ts'o <tytso@mit.edu>
Thu, 21 Nov 2019 03:58:55 +0000 (22:58 -0500)
An internal customer followed an erroneous AskUbuntu article[1] to try to
change the UUID of a live ext4 filesystem.  The article claims that you
can work around tune2fs' "cannot change UUID on live fs" error by
disabling uninit_bg, changing the UUID, and re-enabling the feature.

This led to metadata corruption because tune2fs' journal descriptor
rewrite races with regular filesystem writes.  Therefore, prevent
administrators from turning on or off uninit_bg on a mounted fs.

[1] https://askubuntu.com/questions/132079/how-do-i-change-uuid-of-a-disk-to-whatever-i-want/195839#459097

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
misc/tune2fs.c

index 7d2d38d7d4b7b02c59335b576521201414842ec2..301cf3880724458b382a391921a91c6fd25d82ec 100644 (file)
@@ -1308,6 +1308,12 @@ mmp_error:
 
        if (FEATURE_ON(E2P_FEATURE_RO_INCOMPAT,
                       EXT4_FEATURE_RO_COMPAT_GDT_CSUM)) {
+               if (mount_flags & EXT2_MF_MOUNTED) {
+                       fputs(_("Cannot enable uninit_bg on a mounted "
+                               "filesystem!\n"), stderr);
+                       exit(1);
+               }
+
                /* Do not enable uninit_bg when metadata_csum enabled */
                if (ext2fs_has_feature_metadata_csum(fs->super))
                        ext2fs_clear_feature_gdt_csum(fs->super);
@@ -1317,6 +1323,12 @@ mmp_error:
 
        if (FEATURE_OFF(E2P_FEATURE_RO_INCOMPAT,
                        EXT4_FEATURE_RO_COMPAT_GDT_CSUM)) {
+               if (mount_flags & EXT2_MF_MOUNTED) {
+                       fputs(_("Cannot disable uninit_bg on a mounted "
+                               "filesystem!\n"), stderr);
+                       exit(1);
+               }
+
                err = disable_uninit_bg(fs,
                                EXT4_FEATURE_RO_COMPAT_GDT_CSUM);
                if (err)