On Wed, Mar 13, 2019 at 06:33:50PM +0800, Anand Jain wrote: > > > > On 3/13/19 1:36 PM, Anand Jain wrote: > > The compression property resets to NULL, instead of the old value if we > > fail to set the new compression parameter. > > > > btrfs prop get /btrfs compression > > compression=lzo > > btrfs prop set /btrfs compression zli > > ERROR: failed to set compression for /btrfs: Invalid argument > > btrfs prop get /btrfs compression > > > > This is because the compression property ->validate() is successful for > > 'zli' as the strncmp() used the len passed from the userland. > > > > Fix it by using the expected string length in strncmp(). > > > > Signed-off-by: Anand Jain <anand.j...@oracle.com> > > --- > > fs/btrfs/props.c | 6 +++--- > > 1 file changed, 3 insertions(+), 3 deletions(-) > > > > diff --git a/fs/btrfs/props.c b/fs/btrfs/props.c > > index ef6502a94712..7aa362c2fbcf 100644 > > --- a/fs/btrfs/props.c > > +++ b/fs/btrfs/props.c > > @@ -277,11 +277,11 @@ static int prop_compression_validate(struct inode > > *inode, const char *value, > > if (!value) > > return 0; > > > > - if (!strncmp("lzo", value, len)) > > + if (!strncmp("lzo", value, 3)) > > return 0; > > - else if (!strncmp("zlib", value, len)) > > + else if (!strncmp("zlib", value, 4)) > > return 0; > > - else if (!strncmp("zstd", value, len)) > > + else if (!strncmp("zstd", value, 4)) > > return 0; > > > > > Nack. > Now some junk value after expected string is not an error. > such as.. > > btrfs prop set /btrfs compression lzo110
This was intentional when the zlib levels were introduced so older kernels can understand newer compression specifier but still have a sane fallback (ie use the default level). Now it would be better to extend the validation to parse the method:level format at least. But as mentioned in the other mail, the level needs to be propagated elsewhere too so it's not just a change to the validation.