diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/btrfs/ctree.h | 17 | ||||
-rw-r--r-- | fs/btrfs/ioctl.c | 16 | ||||
-rw-r--r-- | fs/btrfs/super.c | 1 |
3 files changed, 20 insertions, 14 deletions
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index 00f9a50f986d..0f369da5cd97 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h | |||
@@ -3288,6 +3288,23 @@ void __btrfs_abort_transaction(struct btrfs_trans_handle *trans, | |||
3288 | struct btrfs_root *root, const char *function, | 3288 | struct btrfs_root *root, const char *function, |
3289 | unsigned int line, int errno); | 3289 | unsigned int line, int errno); |
3290 | 3290 | ||
3291 | #define btrfs_set_fs_incompat(__fs_info, opt) \ | ||
3292 | __btrfs_set_fs_incompat((__fs_info), BTRFS_FEATURE_INCOMPAT_##opt) | ||
3293 | |||
3294 | static inline void __btrfs_set_fs_incompat(struct btrfs_fs_info *fs_info, | ||
3295 | u64 flag) | ||
3296 | { | ||
3297 | struct btrfs_super_block *disk_super; | ||
3298 | u64 features; | ||
3299 | |||
3300 | disk_super = fs_info->super_copy; | ||
3301 | features = btrfs_super_incompat_flags(disk_super); | ||
3302 | if (!(features & flag)) { | ||
3303 | features |= flag; | ||
3304 | btrfs_set_super_incompat_flags(disk_super, features); | ||
3305 | } | ||
3306 | } | ||
3307 | |||
3291 | #define btrfs_abort_transaction(trans, root, errno) \ | 3308 | #define btrfs_abort_transaction(trans, root, errno) \ |
3292 | do { \ | 3309 | do { \ |
3293 | __btrfs_abort_transaction(trans, root, __func__, \ | 3310 | __btrfs_abort_transaction(trans, root, __func__, \ |
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index e54b663fd3aa..3f3cbe928a1a 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c | |||
@@ -1053,11 +1053,9 @@ int btrfs_defrag_file(struct inode *inode, struct file *file, | |||
1053 | u64 newer_than, unsigned long max_to_defrag) | 1053 | u64 newer_than, unsigned long max_to_defrag) |
1054 | { | 1054 | { |
1055 | struct btrfs_root *root = BTRFS_I(inode)->root; | 1055 | struct btrfs_root *root = BTRFS_I(inode)->root; |
1056 | struct btrfs_super_block *disk_super; | ||
1057 | struct file_ra_state *ra = NULL; | 1056 | struct file_ra_state *ra = NULL; |
1058 | unsigned long last_index; | 1057 | unsigned long last_index; |
1059 | u64 isize = i_size_read(inode); | 1058 | u64 isize = i_size_read(inode); |
1060 | u64 features; | ||
1061 | u64 last_len = 0; | 1059 | u64 last_len = 0; |
1062 | u64 skip = 0; | 1060 | u64 skip = 0; |
1063 | u64 defrag_end = 0; | 1061 | u64 defrag_end = 0; |
@@ -1244,11 +1242,8 @@ int btrfs_defrag_file(struct inode *inode, struct file *file, | |||
1244 | mutex_unlock(&inode->i_mutex); | 1242 | mutex_unlock(&inode->i_mutex); |
1245 | } | 1243 | } |
1246 | 1244 | ||
1247 | disk_super = root->fs_info->super_copy; | ||
1248 | features = btrfs_super_incompat_flags(disk_super); | ||
1249 | if (range->compress_type == BTRFS_COMPRESS_LZO) { | 1245 | if (range->compress_type == BTRFS_COMPRESS_LZO) { |
1250 | features |= BTRFS_FEATURE_INCOMPAT_COMPRESS_LZO; | 1246 | btrfs_set_fs_incompat(root->fs_info, COMPRESS_LZO); |
1251 | btrfs_set_super_incompat_flags(disk_super, features); | ||
1252 | } | 1247 | } |
1253 | 1248 | ||
1254 | ret = defrag_count; | 1249 | ret = defrag_count; |
@@ -2784,8 +2779,6 @@ static long btrfs_ioctl_default_subvol(struct file *file, void __user *argp) | |||
2784 | struct btrfs_path *path; | 2779 | struct btrfs_path *path; |
2785 | struct btrfs_key location; | 2780 | struct btrfs_key location; |
2786 | struct btrfs_disk_key disk_key; | 2781 | struct btrfs_disk_key disk_key; |
2787 | struct btrfs_super_block *disk_super; | ||
2788 | u64 features; | ||
2789 | u64 objectid = 0; | 2782 | u64 objectid = 0; |
2790 | u64 dir_id; | 2783 | u64 dir_id; |
2791 | 2784 | ||
@@ -2836,12 +2829,7 @@ static long btrfs_ioctl_default_subvol(struct file *file, void __user *argp) | |||
2836 | btrfs_mark_buffer_dirty(path->nodes[0]); | 2829 | btrfs_mark_buffer_dirty(path->nodes[0]); |
2837 | btrfs_free_path(path); | 2830 | btrfs_free_path(path); |
2838 | 2831 | ||
2839 | disk_super = root->fs_info->super_copy; | 2832 | btrfs_set_fs_incompat(root->fs_info, DEFAULT_SUBVOL); |
2840 | features = btrfs_super_incompat_flags(disk_super); | ||
2841 | if (!(features & BTRFS_FEATURE_INCOMPAT_DEFAULT_SUBVOL)) { | ||
2842 | features |= BTRFS_FEATURE_INCOMPAT_DEFAULT_SUBVOL; | ||
2843 | btrfs_set_super_incompat_flags(disk_super, features); | ||
2844 | } | ||
2845 | btrfs_end_transaction(trans, root); | 2833 | btrfs_end_transaction(trans, root); |
2846 | 2834 | ||
2847 | return 0; | 2835 | return 0; |
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 26da344231ac..75ee2c7791f0 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c | |||
@@ -401,6 +401,7 @@ int btrfs_parse_options(struct btrfs_root *root, char *options) | |||
401 | compress_type = "lzo"; | 401 | compress_type = "lzo"; |
402 | info->compress_type = BTRFS_COMPRESS_LZO; | 402 | info->compress_type = BTRFS_COMPRESS_LZO; |
403 | btrfs_set_opt(info->mount_opt, COMPRESS); | 403 | btrfs_set_opt(info->mount_opt, COMPRESS); |
404 | btrfs_set_fs_incompat(info, COMPRESS_LZO); | ||
404 | } else if (strncmp(args[0].from, "no", 2) == 0) { | 405 | } else if (strncmp(args[0].from, "no", 2) == 0) { |
405 | compress_type = "no"; | 406 | compress_type = "no"; |
406 | info->compress_type = BTRFS_COMPRESS_NONE; | 407 | info->compress_type = BTRFS_COMPRESS_NONE; |