btrfs: synchronize incompat feature bits with sysfs files
authorDavid Sterba <dsterba@suse.com>
Thu, 21 Jan 2016 17:54:41 +0000 (18:54 +0100)
committerDavid Sterba <dsterba@suse.com>
Thu, 21 Jan 2016 17:54:41 +0000 (18:54 +0100)
The files under /sys/fs/UUID/features get out of sync with the actual
incompat bits set for the filesystem if they change after mount (eg. the
LZO compression).

Synchronize the feature bits with the sysfs files representing them
right after we set/clear them.

Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/free-space-tree.c
fs/btrfs/ioctl.c
fs/btrfs/super.c
fs/btrfs/volumes.c

index 393e36bd5845d996d216e14ef2c6ac6866fce746..94e887f5ec4ec46818f6ac8b3aaa4182d0114990 100644 (file)
@@ -23,6 +23,7 @@
 #include "locking.h"
 #include "free-space-tree.h"
 #include "transaction.h"
+#include "sysfs.h"
 
 static int __add_block_group_free_space(struct btrfs_trans_handle *trans,
                                        struct btrfs_fs_info *fs_info,
@@ -1169,6 +1170,9 @@ int btrfs_create_free_space_tree(struct btrfs_fs_info *fs_info)
        }
 
        btrfs_set_fs_compat_ro(fs_info, FREE_SPACE_TREE);
+       btrfs_sysfs_feature_update(fs_info,
+               BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE, FEAT_COMPAT_RO);
+
        fs_info->creating_free_space_tree = 0;
 
        ret = btrfs_commit_transaction(trans, tree_root);
@@ -1237,6 +1241,9 @@ int btrfs_clear_free_space_tree(struct btrfs_fs_info *fs_info)
                return PTR_ERR(trans);
 
        btrfs_clear_fs_compat_ro(fs_info, FREE_SPACE_TREE);
+       btrfs_sysfs_feature_update(fs_info,
+               BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE, FEAT_COMPAT_RO);
+
        fs_info->free_space_root = NULL;
 
        ret = clear_free_space_tree(trans, free_space_root);
index e392dd67f0ba07dd943dcc650175a0ab8a79cceb..209dcfa9ab33bc47a086cfaa004b40babb2e6369 100644 (file)
@@ -1455,6 +1455,8 @@ int btrfs_defrag_file(struct inode *inode, struct file *file,
 
        if (range->compress_type == BTRFS_COMPRESS_LZO) {
                btrfs_set_fs_incompat(root->fs_info, COMPRESS_LZO);
+               btrfs_sysfs_feature_update(root->fs_info,
+                       BTRFS_FEATURE_INCOMPAT_COMPRESS_LZO, FEAT_INCOMPAT);
        }
 
        ret = defrag_count;
@@ -4063,6 +4065,8 @@ static long btrfs_ioctl_default_subvol(struct file *file, void __user *argp)
        btrfs_free_path(path);
 
        btrfs_set_fs_incompat(root->fs_info, DEFAULT_SUBVOL);
+       btrfs_sysfs_feature_update(root->fs_info,
+               BTRFS_FEATURE_INCOMPAT_DEFAULT_SUBVOL, FEAT_INCOMPAT);
        btrfs_end_transaction(trans, root);
 out:
        mnt_drop_write_file(file);
index 86f7fdc0563388b9122bf6abdb88b68ebec2ac85..5a1bab11984dc45bae617d1b7aa25c7177d2c05e 100644 (file)
@@ -58,6 +58,7 @@
 #include "dev-replace.h"
 #include "free-space-cache.h"
 #include "backref.h"
+#include "sysfs.h"
 #include "tests/btrfs-tests.h"
 
 #include "qgroup.h"
@@ -477,6 +478,9 @@ 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);
+                               btrfs_sysfs_feature_update(root->fs_info,
+                                       BTRFS_FEATURE_INCOMPAT_COMPRESS_LZO,
+                                       FEAT_INCOMPAT);
                        } else if (strncmp(args[0].from, "no", 2) == 0) {
                                compress_type = "no";
                                btrfs_clear_opt(info->mount_opt, COMPRESS);
index c32abbca9d77f65684b85d137fa41bec8bac005c..73bcd1322c1d72f6ccb8d818293d15780bdddf48 100644 (file)
@@ -4468,6 +4468,8 @@ static void check_raid56_incompat_flag(struct btrfs_fs_info *info, u64 type)
                return;
 
        btrfs_set_fs_incompat(info, RAID56);
+       btrfs_sysfs_feature_update(info, BTRFS_FEATURE_INCOMPAT_RAID56,
+               FEAT_INCOMPAT);
 }
 
 #define BTRFS_MAX_DEVS(r) ((BTRFS_LEAF_DATA_SIZE(r)            \