btrfs: allow setting zlib compression level via :9
authorAdam Borowski <kilobyte@angband.pl>
Fri, 15 Sep 2017 15:36:58 +0000 (17:36 +0200)
committerDavid Sterba <dsterba@suse.com>
Wed, 1 Nov 2017 19:45:34 +0000 (20:45 +0100)
This is bikeshedding, but it seems people are drastically more likely to
understand "zlib:9" as compression level rather than an algorithm
version compared to "zlib9".

Based on feedback on the mailinglist, the ":9" will be the only accepted
syntax. The level must be a single digit. Unrecognized format will
result to the default, for forward compatibility in a similar way the
compression algorithm specifier was relaxed in commit
a7164fa4e055daf6368c ("btrfs: prepare for extensions in compression
options").

Signed-off-by: Adam Borowski <kilobyte@angband.pl>
Reviewed-by: David Sterba <dsterba@suse.com>
[ tighten the accepted format ]
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/compression.c
fs/btrfs/super.c

index 3e452525f8ad611e897a9248bf7894500a3adcc0..083f9c485875239383d415c1c3b3b31c5fa424de 100644 (file)
@@ -1111,8 +1111,9 @@ unsigned int btrfs_compress_str2level(const char *str)
        if (strncmp(str, "zlib", 4) != 0)
                return 0;
 
-       if ('1' <= str[4] && str[4] <= '9' )
-               return str[4] - '0';
+       /* Accepted form: zlib:1 up to zlib:9 and nothing left after the number */
+       if (str[4] == ':' && '1' <= str[5] && str[5] <= '9' && str[6] == 0)
+               return str[5] - '0';
 
        return 0;
 }
index 57f3f9600e18bc82a7e36c1689531508fb680abb..65af029559b58a793961623412010eee71f80d83 100644 (file)
@@ -1261,7 +1261,7 @@ static int btrfs_show_options(struct seq_file *seq, struct dentry *dentry)
                else
                        seq_printf(seq, ",compress=%s", compress_type);
                if (info->compress_level)
-                       seq_printf(seq, "%d", info->compress_level);
+                       seq_printf(seq, ":%d", info->compress_level);
        }
        if (btrfs_test_opt(info, NOSSD))
                seq_puts(seq, ",nossd");