Merge tag 'v3.7-rc1' into staging/for_v3.8
[firefly-linux-kernel-4.4.55.git] / fs / btrfs / super.c
index 0fadcdba8ce4ba24db1ffda07df17e34c5d6a26d..915ac14c20642ec619ec159d90d0fbed2a02b0da 100644 (file)
@@ -413,7 +413,15 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)
                        btrfs_set_opt(info->mount_opt, NODATASUM);
                        break;
                case Opt_nodatacow:
-                       printk(KERN_INFO "btrfs: setting nodatacow\n");
+                       if (!btrfs_test_opt(root, COMPRESS) ||
+                               !btrfs_test_opt(root, FORCE_COMPRESS)) {
+                                       printk(KERN_INFO "btrfs: setting nodatacow, compression disabled\n");
+                       } else {
+                               printk(KERN_INFO "btrfs: setting nodatacow\n");
+                       }
+                       info->compress_type = BTRFS_COMPRESS_NONE;
+                       btrfs_clear_opt(info->mount_opt, COMPRESS);
+                       btrfs_clear_opt(info->mount_opt, FORCE_COMPRESS);
                        btrfs_set_opt(info->mount_opt, NODATACOW);
                        btrfs_set_opt(info->mount_opt, NODATASUM);
                        break;
@@ -428,10 +436,14 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)
                                compress_type = "zlib";
                                info->compress_type = BTRFS_COMPRESS_ZLIB;
                                btrfs_set_opt(info->mount_opt, COMPRESS);
+                               btrfs_clear_opt(info->mount_opt, NODATACOW);
+                               btrfs_clear_opt(info->mount_opt, NODATASUM);
                        } else if (strcmp(args[0].from, "lzo") == 0) {
                                compress_type = "lzo";
                                info->compress_type = BTRFS_COMPRESS_LZO;
                                btrfs_set_opt(info->mount_opt, COMPRESS);
+                               btrfs_clear_opt(info->mount_opt, NODATACOW);
+                               btrfs_clear_opt(info->mount_opt, NODATASUM);
                                btrfs_set_fs_incompat(info, COMPRESS_LZO);
                        } else if (strncmp(args[0].from, "no", 2) == 0) {
                                compress_type = "no";