Re: [PATCH v3 1/5] btrfs: fix -o compress= level getting inherited by compression xattr property
Qu Wenruo <[email protected]>
| Newsgroups | org.kernel.vger.linux-btrfs |
|---|---|
| Message-ID | <[email protected]> |
在 2026/8/10 05:45, Zygo Blaxell 写道: > On Sun, Aug 09, 2026 at 08:52:59PM +0200, koraynilay wrote: >> When setting the btrfs.compression xattr, btrfs uses the mount option level >> (since levels in the xattr aren't supported yet) to compress the data, even >> if the compression algorithm between the property and the compress= option >> are different (!!). >> For example, when mounting with compress=zstd:15 and setting >> btrfs.compression=zlib, the data would get compressed at zlib:9, because >> btrfs would take "zlib" from the xattr but "15" from the mount option, >> which would then get correctly clamped at 9. >> >> To fix, just hard-code the compress level at 0, forcing the property's >> algorithm default. >> >> Reported-by: Zygo Blaxell <[email protected]> >> Signed-off-by: koraynilay <[email protected]> >> --- >> fs/btrfs/inode.c | 2 ++ >> 1 file changed, 2 insertions(+) >> >> diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c >> index 2534cd9284d5..6d7f2aa2555c 100644 >> --- a/fs/btrfs/inode.c >> +++ b/fs/btrfs/inode.c >> @@ -938,6 +938,7 @@ static void compress_file_range(struct btrfs_work *work) >> compress_level = inode->defrag_compress_level; >> } else if (inode->prop_compress) { >> compress_type = inode->prop_compress; >> + compress_level = 0; > > This set to zero should be conditional on inode->prop_compress != > fs_info->compress_type; otherwise, it prevents the compress-level mount > option from working in the common case where 'btrfs.compression=zstd' > or 'chattr +c' has been set. No, read this discussion. https://lore.kernel.org/linux-btrfs/[email protected]/T/#m79e6c1ecbcc61ebb57dca5cbb3eceabd052ecdbc > >> } >> >> /* Compression level is applied here. */ >> @@ -2326,6 +2327,7 @@ static int run_delalloc_inline(struct btrfs_inode *inode, struct folio *locked_f >> compress_level = inode->defrag_compress_level; >> } else if (inode->prop_compress) { >> compress_type = inode->prop_compress; >> + compress_level = 0; >> } >> cb = btrfs_compress_bio(inode, 0, blocksize, compress_type, compress_level, 0); >> if (IS_ERR(cb)) { >> -- >> 2.55.0 >> >>