mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	btrfs: accept and ignore compression level for lzo
The compression level is meaningless for lzo, but before commit3f093ccb95("btrfs: harden parsing of compression mount options"), it was silently ignored if passed. After that commit, passing a level with lzo fails to mount: BTRFS error: unrecognized compression value lzo:1 It seems reasonable for users to expect that lzo would permit a numeric level option, as all the other algos do, even though the kernel's implementation of LZO currently only supports a single level. Because it has always worked to pass a level, it seems likely to me that users in the real world are relying on doing so. This patch restores the old behavior, giving "lzo:N" the same semantics as all of the other compression algos. To be clear, silly variants like "lzo:one", "lzo:the_first_option", or "lzo:armageddon" also used to work. This isn't meant to suggest that any possible mis-interpretation of mount options that once worked must continue to work forever. This is an exceptional case where it makes sense to preserve compatibility, both because the mis-interpretation is reasonable, and because nothing tangible is sacrificed. Finally update btrfs_show_options() to ignore the level of LZO, as it is only the default level without any extra meaning. Fixes:3f093ccb95("btrfs: harden parsing of compression mount options") Reviewed-by: Daniel Vacek <neelx@suse.com> Reviewed-by: Qu Wenruo <wqu@suse.com> Signed-off-by: Calvin Owens <calvin@wbinvd.org> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
		
							parent
							
								
									de134cb54c
								
							
						
					
					
						commit
						6db1df415d
					
				
					 1 changed files with 6 additions and 3 deletions
				
			
		| 
						 | 
				
			
			@ -299,9 +299,12 @@ static int btrfs_parse_compress(struct btrfs_fs_context *ctx,
 | 
			
		|||
		btrfs_set_opt(ctx->mount_opt, COMPRESS);
 | 
			
		||||
		btrfs_clear_opt(ctx->mount_opt, NODATACOW);
 | 
			
		||||
		btrfs_clear_opt(ctx->mount_opt, NODATASUM);
 | 
			
		||||
	} else if (btrfs_match_compress_type(string, "lzo", false)) {
 | 
			
		||||
	} else if (btrfs_match_compress_type(string, "lzo", true)) {
 | 
			
		||||
		ctx->compress_type = BTRFS_COMPRESS_LZO;
 | 
			
		||||
		ctx->compress_level = 0;
 | 
			
		||||
		ctx->compress_level = btrfs_compress_str2level(BTRFS_COMPRESS_LZO,
 | 
			
		||||
							       string + 3);
 | 
			
		||||
		if (string[3] == ':' && string[4])
 | 
			
		||||
			btrfs_warn(NULL, "Compression level ignored for LZO");
 | 
			
		||||
		btrfs_set_opt(ctx->mount_opt, COMPRESS);
 | 
			
		||||
		btrfs_clear_opt(ctx->mount_opt, NODATACOW);
 | 
			
		||||
		btrfs_clear_opt(ctx->mount_opt, NODATASUM);
 | 
			
		||||
| 
						 | 
				
			
			@ -1079,7 +1082,7 @@ static int btrfs_show_options(struct seq_file *seq, struct dentry *dentry)
 | 
			
		|||
			seq_printf(seq, ",compress-force=%s", compress_type);
 | 
			
		||||
		else
 | 
			
		||||
			seq_printf(seq, ",compress=%s", compress_type);
 | 
			
		||||
		if (info->compress_level)
 | 
			
		||||
		if (info->compress_level && info->compress_type != BTRFS_COMPRESS_LZO)
 | 
			
		||||
			seq_printf(seq, ":%d", info->compress_level);
 | 
			
		||||
	}
 | 
			
		||||
	if (btrfs_test_opt(info, NOSSD))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue