Commit 14e46e04 authored by David Sterba's avatar David Sterba

btrfs: synchronize incompat feature bits with sysfs files

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: default avatarDavid Sterba <dsterba@suse.com>
parent 444e7516
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include "locking.h" #include "locking.h"
#include "free-space-tree.h" #include "free-space-tree.h"
#include "transaction.h" #include "transaction.h"
#include "sysfs.h"
static int __add_block_group_free_space(struct btrfs_trans_handle *trans, static int __add_block_group_free_space(struct btrfs_trans_handle *trans,
struct btrfs_fs_info *fs_info, struct btrfs_fs_info *fs_info,
...@@ -1169,6 +1170,9 @@ int btrfs_create_free_space_tree(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_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; fs_info->creating_free_space_tree = 0;
ret = btrfs_commit_transaction(trans, tree_root); ret = btrfs_commit_transaction(trans, tree_root);
...@@ -1237,6 +1241,9 @@ int btrfs_clear_free_space_tree(struct btrfs_fs_info *fs_info) ...@@ -1237,6 +1241,9 @@ int btrfs_clear_free_space_tree(struct btrfs_fs_info *fs_info)
return PTR_ERR(trans); return PTR_ERR(trans);
btrfs_clear_fs_compat_ro(fs_info, FREE_SPACE_TREE); 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; fs_info->free_space_root = NULL;
ret = clear_free_space_tree(trans, free_space_root); ret = clear_free_space_tree(trans, free_space_root);
......
...@@ -1455,6 +1455,8 @@ int btrfs_defrag_file(struct inode *inode, struct file *file, ...@@ -1455,6 +1455,8 @@ int btrfs_defrag_file(struct inode *inode, struct file *file,
if (range->compress_type == BTRFS_COMPRESS_LZO) { if (range->compress_type == BTRFS_COMPRESS_LZO) {
btrfs_set_fs_incompat(root->fs_info, 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; ret = defrag_count;
...@@ -4063,6 +4065,8 @@ static long btrfs_ioctl_default_subvol(struct file *file, void __user *argp) ...@@ -4063,6 +4065,8 @@ static long btrfs_ioctl_default_subvol(struct file *file, void __user *argp)
btrfs_free_path(path); btrfs_free_path(path);
btrfs_set_fs_incompat(root->fs_info, DEFAULT_SUBVOL); 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); btrfs_end_transaction(trans, root);
out: out:
mnt_drop_write_file(file); mnt_drop_write_file(file);
......
...@@ -58,6 +58,7 @@ ...@@ -58,6 +58,7 @@
#include "dev-replace.h" #include "dev-replace.h"
#include "free-space-cache.h" #include "free-space-cache.h"
#include "backref.h" #include "backref.h"
#include "sysfs.h"
#include "tests/btrfs-tests.h" #include "tests/btrfs-tests.h"
#include "qgroup.h" #include "qgroup.h"
...@@ -477,6 +478,9 @@ int btrfs_parse_options(struct btrfs_root *root, char *options) ...@@ -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, NODATACOW);
btrfs_clear_opt(info->mount_opt, NODATASUM); btrfs_clear_opt(info->mount_opt, NODATASUM);
btrfs_set_fs_incompat(info, COMPRESS_LZO); 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) { } else if (strncmp(args[0].from, "no", 2) == 0) {
compress_type = "no"; compress_type = "no";
btrfs_clear_opt(info->mount_opt, COMPRESS); btrfs_clear_opt(info->mount_opt, COMPRESS);
......
...@@ -4468,6 +4468,8 @@ static void check_raid56_incompat_flag(struct btrfs_fs_info *info, u64 type) ...@@ -4468,6 +4468,8 @@ static void check_raid56_incompat_flag(struct btrfs_fs_info *info, u64 type)
return; return;
btrfs_set_fs_incompat(info, RAID56); 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) \ #define BTRFS_MAX_DEVS(r) ((BTRFS_LEAF_DATA_SIZE(r) \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment