]> git.hungrycats.org Git - linux/commitdiff
btrfs: make sure SB_I_VERSION doesn't get unset by remount
authorJosef Bacik <josef@toxicpanda.com>
Thu, 30 Jul 2020 15:18:09 +0000 (11:18 -0400)
committerZygo Blaxell <ce3g8jdj@umail.furryterror.org>
Tue, 1 Sep 2020 04:44:23 +0000 (00:44 -0400)
commit faa008899a4db21a2df99833cb4ff6fa67009a20 upstream.

There's some inconsistency around SB_I_VERSION handling with mount and
remount.  Since we don't really want it to be off ever just work around
this by making sure we don't get the flag cleared on remount.

There's a tiny cpu cost of setting the bit, otherwise all changes to
i_version also change some of the times (ctime/mtime) so the inode needs
to be synced. We wouldn't save anything by disabling it.

Reported-by: Eric Sandeen <sandeen@redhat.com>
CC: stable@vger.kernel.org # 5.4+
Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: David Sterba <dsterba@suse.com>
[ add perf impact analysis ]
Signed-off-by: David Sterba <dsterba@suse.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
(cherry picked from commit d256992d5105d9d9882f9815a32ff181205e83ff)

fs/btrfs/super.c

index d2ca58ed57b23c49fa05ae3f01d2d9188ca234f1..ad4ef20306acc9044cdb15e6baa431f0a42b458c 100644 (file)
@@ -1851,6 +1851,12 @@ static int btrfs_remount(struct super_block *sb, int *flags, char *data)
                set_bit(BTRFS_FS_OPEN, &fs_info->flags);
        }
 out:
+       /*
+        * We need to set SB_I_VERSION here otherwise it'll get cleared by VFS,
+        * since the absence of the flag means it can be toggled off by remount.
+        */
+       *flags |= SB_I_VERSION;
+
        wake_up_process(fs_info->transaction_kthread);
        btrfs_remount_cleanup(fs_info, old_opts);
        return 0;