diff mbox

[1/2] Btrfs: Check INCOMPAT flags on remount with lzo compression

Message ID 1342805781-12162-2-git-send-email-mitch.harder@sabayonlinux.org (mailing list archive)
State New, archived
Headers show

Commit Message

Mitch Harder July 20, 2012, 5:36 p.m. UTC
In support of the recently added capability to remount with lzo
compression, check the compression INCOMPAT flags when remounting
with lzo compression, and set the flags if necessary.

Signed-off-by: Mitch Harder <mitch.harder@sabayonlinux.org>
---
 fs/btrfs/ctree.h |    1 +
 fs/btrfs/super.c |   21 ++++++++++++++++++++-
 2 files changed, 21 insertions(+), 1 deletions(-)

Comments

Josef Bacik July 20, 2012, 5:39 p.m. UTC | #1
On Fri, Jul 20, 2012 at 11:36:20AM -0600, Mitch Harder wrote:
> In support of the recently added capability to remount with lzo
> compression, check the compression INCOMPAT flags when remounting
> with lzo compression, and set the flags if necessary.
> 
> Signed-off-by: Mitch Harder <mitch.harder@sabayonlinux.org>
> ---
>  fs/btrfs/ctree.h |    1 +
>  fs/btrfs/super.c |   21 ++++++++++++++++++++-
>  2 files changed, 21 insertions(+), 1 deletions(-)
> 
> diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h
> index a0ee2f8..8bee032 100644
> --- a/fs/btrfs/ctree.h
> +++ b/fs/btrfs/ctree.h
> @@ -3094,6 +3094,7 @@ ssize_t btrfs_listxattr(struct dentry *dentry, char *buffer, size_t size);
>  
>  /* super.c */
>  int btrfs_parse_options(struct btrfs_root *root, char *options);
> +void btrfs_chk_lzo_incompat(struct btrfs_root *root);
>  int btrfs_sync_fs(struct super_block *sb, int wait);
>  void btrfs_printk(struct btrfs_fs_info *fs_info, const char *fmt, ...);
>  void __btrfs_std_error(struct btrfs_fs_info *fs_info, const char *function,
> diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
> index 26da344..4398fd2 100644
> --- a/fs/btrfs/super.c
> +++ b/fs/btrfs/super.c
> @@ -401,11 +401,13 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)
>  				compress_type = "lzo";
>  				info->compress_type = BTRFS_COMPRESS_LZO;
>  				btrfs_set_opt(info->mount_opt, COMPRESS);
> +				btrfs_chk_lzo_incompat(root);
>  			} else if (strncmp(args[0].from, "no", 2) == 0) {
>  				compress_type = "no";
>  				info->compress_type = BTRFS_COMPRESS_NONE;
>  				btrfs_clear_opt(info->mount_opt, COMPRESS);
> -				btrfs_clear_opt(info->mount_opt, FORCE_COMPRESS);
> +				btrfs_clear_opt(info->mount_opt,
> +						FORCE_COMPRESS);

Please don't include format changes that aren't related to the patch, I stared
at this for 5 seconds too long trying to figure out what you changed.  Thanks,

Josef
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h
index a0ee2f8..8bee032 100644
--- a/fs/btrfs/ctree.h
+++ b/fs/btrfs/ctree.h
@@ -3094,6 +3094,7 @@  ssize_t btrfs_listxattr(struct dentry *dentry, char *buffer, size_t size);
 
 /* super.c */
 int btrfs_parse_options(struct btrfs_root *root, char *options);
+void btrfs_chk_lzo_incompat(struct btrfs_root *root);
 int btrfs_sync_fs(struct super_block *sb, int wait);
 void btrfs_printk(struct btrfs_fs_info *fs_info, const char *fmt, ...);
 void __btrfs_std_error(struct btrfs_fs_info *fs_info, const char *function,
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
index 26da344..4398fd2 100644
--- a/fs/btrfs/super.c
+++ b/fs/btrfs/super.c
@@ -401,11 +401,13 @@  int btrfs_parse_options(struct btrfs_root *root, char *options)
 				compress_type = "lzo";
 				info->compress_type = BTRFS_COMPRESS_LZO;
 				btrfs_set_opt(info->mount_opt, COMPRESS);
+				btrfs_chk_lzo_incompat(root);
 			} else if (strncmp(args[0].from, "no", 2) == 0) {
 				compress_type = "no";
 				info->compress_type = BTRFS_COMPRESS_NONE;
 				btrfs_clear_opt(info->mount_opt, COMPRESS);
-				btrfs_clear_opt(info->mount_opt, FORCE_COMPRESS);
+				btrfs_clear_opt(info->mount_opt,
+						FORCE_COMPRESS);
 				compress_force = false;
 			} else {
 				ret = -EINVAL;
@@ -587,6 +589,23 @@  out:
 }
 
 /*
+ * Check the INCOMPAT features in the super block, and set the
+ * LZO INCOMPAT flag if it has not been set.
+ */
+void btrfs_chk_lzo_incompat(struct btrfs_root *root)
+{
+	struct btrfs_super_block *disk_super;
+	u64 features;
+
+	disk_super = root->fs_info->super_copy;
+	features = btrfs_super_incompat_flags(disk_super);
+	if (!(features & BTRFS_FEATURE_INCOMPAT_COMPRESS_LZO)) {
+		features |= BTRFS_FEATURE_INCOMPAT_COMPRESS_LZO;
+		btrfs_set_super_incompat_flags(disk_super, features);
+	}
+}
+
+/*
  * Parse mount options that are required early in the mount process.
  *
  * All other options will be parsed on much later in the mount process and