65 lines
2.6 KiB
Diff
65 lines
2.6 KiB
Diff
|
From aa8155f0ba032729ec4f28c5cb9669fb14f6947b Mon Sep 17 00:00:00 2001
|
||
|
From: Filipe Manana <fdmanana@suse.com>
|
||
|
Date: Mon, 14 Oct 2024 16:14:18 +0100
|
||
|
Subject: btrfs: clear force-compress on remount when compress mount option is
|
||
|
given
|
||
|
|
||
|
After the migration to use fs context for processing mount options we had
|
||
|
a slight change in the semantics for remounting a filesystem that was
|
||
|
mounted with compress-force. Before we could clear compress-force by
|
||
|
passing only "-o compress[=algo]" during a remount, but after that change
|
||
|
that does not work anymore, force-compress is still present and one needs
|
||
|
to pass "-o compress-force=no,compress[=algo]" to the mount command.
|
||
|
|
||
|
Example, when running on a kernel 6.8+:
|
||
|
|
||
|
$ mount -o compress-force=zlib:9 /dev/sdi /mnt/sdi
|
||
|
$ mount | grep sdi
|
||
|
/dev/sdi on /mnt/sdi type btrfs (rw,relatime,compress-force=zlib:9,discard=async,space_cache=v2,subvolid=5,subvol=/)
|
||
|
|
||
|
$ mount -o remount,compress=zlib:5 /mnt/sdi
|
||
|
$ mount | grep sdi
|
||
|
/dev/sdi on /mnt/sdi type btrfs (rw,relatime,compress-force=zlib:5,discard=async,space_cache=v2,subvolid=5,subvol=/)
|
||
|
|
||
|
On a 6.7 kernel (or older):
|
||
|
|
||
|
$ mount -o compress-force=zlib:9 /dev/sdi /mnt/sdi
|
||
|
$ mount | grep sdi
|
||
|
/dev/sdi on /mnt/sdi type btrfs (rw,relatime,compress-force=zlib:9,discard=async,space_cache=v2,subvolid=5,subvol=/)
|
||
|
|
||
|
$ mount -o remount,compress=zlib:5 /mnt/sdi
|
||
|
$ mount | grep sdi
|
||
|
/dev/sdi on /mnt/sdi type btrfs (rw,relatime,compress=zlib:5,discard=async,space_cache=v2,subvolid=5,subvol=/)
|
||
|
|
||
|
So update btrfs_parse_param() to clear "compress-force" when "compress" is
|
||
|
given, providing the same semantics as kernel 6.7 and older.
|
||
|
|
||
|
Reported-by: Roman Mamedov <rm@romanrm.net>
|
||
|
Link: https://lore.kernel.org/linux-btrfs/20241014182416.13d0f8b0@nvm/
|
||
|
CC: stable@vger.kernel.org # 6.8+
|
||
|
Signed-off-by: Filipe Manana <fdmanana@suse.com>
|
||
|
Reviewed-by: David Sterba <dsterba@suse.com>
|
||
|
Signed-off-by: David Sterba <dsterba@suse.com>
|
||
|
---
|
||
|
fs/btrfs/super.c | 9 +++++++++
|
||
|
1 file changed, 9 insertions(+)
|
||
|
|
||
|
--- a/fs/btrfs/super.c
|
||
|
+++ b/fs/btrfs/super.c
|
||
|
@@ -340,6 +340,15 @@ static int btrfs_parse_param(struct fs_c
|
||
|
fallthrough;
|
||
|
case Opt_compress:
|
||
|
case Opt_compress_type:
|
||
|
+ /*
|
||
|
+ * Provide the same semantics as older kernels that don't use fs
|
||
|
+ * context, specifying the "compress" option clears
|
||
|
+ * "force-compress" without the need to pass
|
||
|
+ * "compress-force=[no|none]" before specifying "compress".
|
||
|
+ */
|
||
|
+ if (opt != Opt_compress_force && opt != Opt_compress_force_type)
|
||
|
+ btrfs_clear_opt(ctx->mount_opt, FORCE_COMPRESS);
|
||
|
+
|
||
|
if (opt == Opt_compress || opt == Opt_compress_force) {
|
||
|
ctx->compress_type = BTRFS_COMPRESS_ZLIB;
|
||
|
ctx->compress_level = BTRFS_ZLIB_DEFAULT_LEVEL;
|