aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/super.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/super.c')
-rw-r--r--fs/btrfs/super.c50
1 files changed, 39 insertions, 11 deletions
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
index 61bd79abb805..a1a76b2a61f9 100644
--- a/fs/btrfs/super.c
+++ b/fs/btrfs/super.c
@@ -69,9 +69,9 @@ enum {
69 Opt_degraded, Opt_subvol, Opt_subvolid, Opt_device, Opt_nodatasum, 69 Opt_degraded, Opt_subvol, Opt_subvolid, Opt_device, Opt_nodatasum,
70 Opt_nodatacow, Opt_max_inline, Opt_alloc_start, Opt_nobarrier, Opt_ssd, 70 Opt_nodatacow, Opt_max_inline, Opt_alloc_start, Opt_nobarrier, Opt_ssd,
71 Opt_nossd, Opt_ssd_spread, Opt_thread_pool, Opt_noacl, Opt_compress, 71 Opt_nossd, Opt_ssd_spread, Opt_thread_pool, Opt_noacl, Opt_compress,
72 Opt_compress_force, Opt_notreelog, Opt_ratio, Opt_flushoncommit, 72 Opt_compress_type, Opt_compress_force, Opt_compress_force_type,
73 Opt_discard, Opt_space_cache, Opt_clear_cache, Opt_err, 73 Opt_notreelog, Opt_ratio, Opt_flushoncommit, Opt_discard,
74 Opt_user_subvol_rm_allowed, 74 Opt_space_cache, Opt_clear_cache, Opt_user_subvol_rm_allowed, Opt_err,
75}; 75};
76 76
77static match_table_t tokens = { 77static match_table_t tokens = {
@@ -86,7 +86,9 @@ static match_table_t tokens = {
86 {Opt_alloc_start, "alloc_start=%s"}, 86 {Opt_alloc_start, "alloc_start=%s"},
87 {Opt_thread_pool, "thread_pool=%d"}, 87 {Opt_thread_pool, "thread_pool=%d"},
88 {Opt_compress, "compress"}, 88 {Opt_compress, "compress"},
89 {Opt_compress_type, "compress=%s"},
89 {Opt_compress_force, "compress-force"}, 90 {Opt_compress_force, "compress-force"},
91 {Opt_compress_force_type, "compress-force=%s"},
90 {Opt_ssd, "ssd"}, 92 {Opt_ssd, "ssd"},
91 {Opt_ssd_spread, "ssd_spread"}, 93 {Opt_ssd_spread, "ssd_spread"},
92 {Opt_nossd, "nossd"}, 94 {Opt_nossd, "nossd"},
@@ -112,6 +114,8 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)
112 char *p, *num, *orig; 114 char *p, *num, *orig;
113 int intarg; 115 int intarg;
114 int ret = 0; 116 int ret = 0;
117 char *compress_type;
118 bool compress_force = false;
115 119
116 if (!options) 120 if (!options)
117 return 0; 121 return 0;
@@ -154,14 +158,32 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)
154 btrfs_set_opt(info->mount_opt, NODATACOW); 158 btrfs_set_opt(info->mount_opt, NODATACOW);
155 btrfs_set_opt(info->mount_opt, NODATASUM); 159 btrfs_set_opt(info->mount_opt, NODATASUM);
156 break; 160 break;
157 case Opt_compress:
158 printk(KERN_INFO "btrfs: use compression\n");
159 btrfs_set_opt(info->mount_opt, COMPRESS);
160 break;
161 case Opt_compress_force: 161 case Opt_compress_force:
162 printk(KERN_INFO "btrfs: forcing compression\n"); 162 case Opt_compress_force_type:
163 btrfs_set_opt(info->mount_opt, FORCE_COMPRESS); 163 compress_force = true;
164 case Opt_compress:
165 case Opt_compress_type:
166 if (token == Opt_compress ||
167 token == Opt_compress_force ||
168 strcmp(args[0].from, "zlib") == 0) {
169 compress_type = "zlib";
170 info->compress_type = BTRFS_COMPRESS_ZLIB;
171 } else if (strcmp(args[0].from, "lzo") == 0) {
172 compress_type = "lzo";
173 info->compress_type = BTRFS_COMPRESS_LZO;
174 } else {
175 ret = -EINVAL;
176 goto out;
177 }
178
164 btrfs_set_opt(info->mount_opt, COMPRESS); 179 btrfs_set_opt(info->mount_opt, COMPRESS);
180 if (compress_force) {
181 btrfs_set_opt(info->mount_opt, FORCE_COMPRESS);
182 pr_info("btrfs: force %s compression\n",
183 compress_type);
184 } else
185 pr_info("btrfs: use %s compression\n",
186 compress_type);
165 break; 187 break;
166 case Opt_ssd: 188 case Opt_ssd:
167 printk(KERN_INFO "btrfs: use ssd allocation scheme\n"); 189 printk(KERN_INFO "btrfs: use ssd allocation scheme\n");
@@ -898,10 +920,14 @@ static int __init init_btrfs_fs(void)
898 if (err) 920 if (err)
899 return err; 921 return err;
900 922
901 err = btrfs_init_cachep(); 923 err = btrfs_init_compress();
902 if (err) 924 if (err)
903 goto free_sysfs; 925 goto free_sysfs;
904 926
927 err = btrfs_init_cachep();
928 if (err)
929 goto free_compress;
930
905 err = extent_io_init(); 931 err = extent_io_init();
906 if (err) 932 if (err)
907 goto free_cachep; 933 goto free_cachep;
@@ -929,6 +955,8 @@ free_extent_io:
929 extent_io_exit(); 955 extent_io_exit();
930free_cachep: 956free_cachep:
931 btrfs_destroy_cachep(); 957 btrfs_destroy_cachep();
958free_compress:
959 btrfs_exit_compress();
932free_sysfs: 960free_sysfs:
933 btrfs_exit_sysfs(); 961 btrfs_exit_sysfs();
934 return err; 962 return err;
@@ -943,7 +971,7 @@ static void __exit exit_btrfs_fs(void)
943 unregister_filesystem(&btrfs_fs_type); 971 unregister_filesystem(&btrfs_fs_type);
944 btrfs_exit_sysfs(); 972 btrfs_exit_sysfs();
945 btrfs_cleanup_fs_uuids(); 973 btrfs_cleanup_fs_uuids();
946 btrfs_zlib_exit(); 974 btrfs_exit_compress();
947} 975}
948 976
949module_init(init_btrfs_fs) 977module_init(init_btrfs_fs)