|
@@ -383,6 +383,9 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)
|
|
|
int ret = 0;
|
|
|
char *compress_type;
|
|
|
bool compress_force = false;
|
|
|
+ enum btrfs_compression_type saved_compress_type;
|
|
|
+ bool saved_compress_force;
|
|
|
+ int no_compress = 0;
|
|
|
|
|
|
cache_gen = btrfs_super_cache_generation(root->fs_info->super_copy);
|
|
|
if (btrfs_fs_compat_ro(root->fs_info, FREE_SPACE_TREE))
|
|
@@ -462,6 +465,10 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)
|
|
|
/* Fallthrough */
|
|
|
case Opt_compress:
|
|
|
case Opt_compress_type:
|
|
|
+ saved_compress_type = btrfs_test_opt(root, COMPRESS) ?
|
|
|
+ info->compress_type : BTRFS_COMPRESS_NONE;
|
|
|
+ saved_compress_force =
|
|
|
+ btrfs_test_opt(root, FORCE_COMPRESS);
|
|
|
if (token == Opt_compress ||
|
|
|
token == Opt_compress_force ||
|
|
|
strcmp(args[0].from, "zlib") == 0) {
|
|
@@ -470,6 +477,7 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)
|
|
|
btrfs_set_opt(info->mount_opt, COMPRESS);
|
|
|
btrfs_clear_opt(info->mount_opt, NODATACOW);
|
|
|
btrfs_clear_opt(info->mount_opt, NODATASUM);
|
|
|
+ no_compress = 0;
|
|
|
} else if (strcmp(args[0].from, "lzo") == 0) {
|
|
|
compress_type = "lzo";
|
|
|
info->compress_type = BTRFS_COMPRESS_LZO;
|
|
@@ -477,25 +485,21 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)
|
|
|
btrfs_clear_opt(info->mount_opt, NODATACOW);
|
|
|
btrfs_clear_opt(info->mount_opt, NODATASUM);
|
|
|
btrfs_set_fs_incompat(info, COMPRESS_LZO);
|
|
|
+ no_compress = 0;
|
|
|
} else if (strncmp(args[0].from, "no", 2) == 0) {
|
|
|
compress_type = "no";
|
|
|
btrfs_clear_opt(info->mount_opt, COMPRESS);
|
|
|
btrfs_clear_opt(info->mount_opt, FORCE_COMPRESS);
|
|
|
compress_force = false;
|
|
|
+ no_compress++;
|
|
|
} else {
|
|
|
ret = -EINVAL;
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
if (compress_force) {
|
|
|
- btrfs_set_and_info(root, FORCE_COMPRESS,
|
|
|
- "force %s compression",
|
|
|
- compress_type);
|
|
|
+ btrfs_set_opt(info->mount_opt, FORCE_COMPRESS);
|
|
|
} else {
|
|
|
- if (!btrfs_test_opt(root, COMPRESS))
|
|
|
- btrfs_info(root->fs_info,
|
|
|
- "btrfs: use %s compression",
|
|
|
- compress_type);
|
|
|
/*
|
|
|
* If we remount from compress-force=xxx to
|
|
|
* compress=xxx, we need clear FORCE_COMPRESS
|
|
@@ -504,6 +508,17 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)
|
|
|
*/
|
|
|
btrfs_clear_opt(info->mount_opt, FORCE_COMPRESS);
|
|
|
}
|
|
|
+ if ((btrfs_test_opt(root, COMPRESS) &&
|
|
|
+ (info->compress_type != saved_compress_type ||
|
|
|
+ compress_force != saved_compress_force)) ||
|
|
|
+ (!btrfs_test_opt(root, COMPRESS) &&
|
|
|
+ no_compress == 1)) {
|
|
|
+ btrfs_info(root->fs_info,
|
|
|
+ "%s %s compression",
|
|
|
+ (compress_force) ? "force" : "use",
|
|
|
+ compress_type);
|
|
|
+ }
|
|
|
+ compress_force = false;
|
|
|
break;
|
|
|
case Opt_ssd:
|
|
|
btrfs_set_and_info(root, SSD,
|