From 7781d1a2daa6564c3988dc268eb0680e057027f5 Mon Sep 17 00:00:00 2001 From: Li Zhang Date: Sun, 16 Jan 2022 16:52:43 +0800 Subject: [PATCH] btrfs-progs: props: don't translate value of compression=none References: JSC#PED-1711 Currently, if user specifies value 'no' or 'none' on the command line, it gets translated to an empty value that is passed to kernel. There was a change in kernel 5.14 done by commit 5548c8c6f55b ("btrfs: props: change how empty value is interpreted") that changes the behaviour in that case. The empty value is supposed to mean 'the default value' for any property. For compression there is a need to distinguish resetting the value and also setting the NOCOMPRESS property. The translation to empty value makes that impossible. The explanation and behaviour copied from the kernel patch: Old behaviour: $ lsattr file ---------------------- file # the NOCOMPRESS bit is set $ btrfs prop set file compression '' $ lsattr file ---------------------m file This is equivalent to 'btrfs prop set file compression no' in current btrfs-progs as the 'no' or 'none' values are translated to an empty string. This is where the new behaviour is different: empty string drops the compression flag (-c) and nocompress (-m): $ lsattr file ---------------------- file # No change $ btrfs prop set file compression '' $ lsattr file ---------------------- file $ btrfs prop set file compression lzo $ lsattr file --------c------------- file $ btrfs prop get file compression compression=lzo $ btrfs prop set file compression '' # Reset to the initial state $ lsattr file ---------------------- file # Set NOCOMPRESS bit $ btrfs prop set file compression no $ lsattr file ---------------------m file This obviously brings problems with backward compatibility, so this patch should not be backported without making sure the updated btrfs-progs are also used and that scripts have been updated to use the new semantics. Summary: - old kernel: no, none, "" - set NOCOMPRESS bit - new kernel: no, none - set NOCOMPRESS bit "" - drop all compression flags, ie. COMPRESS and NOCOMPRESS Signed-off-by: Li Zhang [ update changelog ] Signed-off-by: David Sterba --- Documentation/btrfs-property.8 | 11 +++++++++-- Documentation/btrfs-property.asciidoc | 3 ++- cmds/property.c | 2 -- 3 files changed, 11 insertions(+), 5 deletions(-) --- a/Documentation/btrfs-property.8 +++ b/Documentation/btrfs-property.8 @@ -82,10 +82,17 @@ compression algorithm set for an inode, possible values: \fIlzo\fR, \fIzlib\fR, -\fIzstd\fR\&. To disable compression use "" (empty string), +\fIzstd\fR\&. To disable compression use \fIno\fR or -\fInone\fR\&. +\fInone\fR\&. Empty value resets the property and sets a default value. +.br +.PP +.ps +1 +\fBNote\fR +.ps -1 +.br +An empty value resetting compression property has changed since kernel 5.14. Earlier versions would disable compression. .RE .RE .PP --- a/Documentation/btrfs-property.asciidoc +++ b/Documentation/btrfs-property.asciidoc @@ -47,7 +47,8 @@ device as object. For a mounted filesystem, specify a mount point. compression:::: compression algorithm set for an inode, possible values: 'lzo', 'zlib', 'zstd'. -To disable compression use "" (empty string), 'no' or 'none'. +To disable compression use 'no' or 'none'. An empty string "" resets the property and sets a default value. +'Note:' An empty value resetting compression property has changed since kernel 5.14. Earlier versions would disable compression. *list* [-t ] :: Lists available properties with their descriptions for the given object. --- a/cmds/property.c +++ b/cmds/property.c @@ -126,8 +126,6 @@ xattr_name[XATTR_BTRFS_PREFIX_LEN + strlen(name)] = '\0'; if (value) { - if (strcmp(value, "no") == 0 || strcmp(value, "none") == 0) - value = ""; sret = fsetxattr(fd, xattr_name, value, strlen(value), 0); } else { sret = fgetxattr(fd, xattr_name, NULL, 0);