From: Qu Wenruo <wqu@suse.com>
To: Hengyu Liang <hengyul@cs.unc.edu>
Cc: David Sterba <dsterba@suse.com>, Chris Mason <mason@kernel.org>,
Filipe Manana <fdmanana@suse.com>,
linux-btrfs@vger.kernel.org, linux-kernel@vger.kernel.org,
stable@vger.kernel.org
Subject: Re: [PATCH] btrfs: fix chattr failing on nodatasum files that have the compress flag
Date: Sun, 11 Oct 2026 16:23:03 +1030 [thread overview]
Message-ID: <841e395e-f85d-4359-b680-1eee502ec2f0@suse.com> (raw)
In-Reply-To: <20261011034731.1054465-1-hengyul@cs.unc.edu>
在 2026/10/11 14:17, Hengyu Liang 写道:
> On 2026/10/11 07:47, Qu Wenruo wrote:
>> This is very LLM-like, and very LLM's objective-oriented behavior.
>> Disclose it first.
>
> Yes, and sorry for not saying so in the patch. I found this while
> comparing the behaviour of different kernel versions. I used an LLM to
> analyse the difference, write the patch and the changelog and run the
> tests in VMs.
>
>> Explain the reason why it fails.
>
> chattr reads the flags and writes the whole set back, so FS_COMPR_FL is
> in the new flags. btrfs_fileattr_set() then calls btrfs_set_prop() for
> btrfs.compression, and since cf1afec09e9f that runs
> prop_compression_validate(), which returns -EINVAL because
> btrfs_inode_can_compress() is false for a NODATASUM inode.
>
>> So when setting compress in the first place, the NODATASUM/NODATACOW
>> flag should be cleared.
>
> OK, I will do it this way: a new inode that inherits the compress flag
> does not get NODATASUM/NODATACOW from the mount options, and chattr +c
> on an empty file clears NODATASUM.
>
> This differs from the documentation in one place. btrfs(5) says that
> all files created under nodatasum have no checksums and that
> compression is disabled when nodatasum is enabled.
Prop has higher priority than mount option, and defrag has even higher
priority than prop.
That's the long existing behavior.
> With this change a
> file created in a +c directory on a nodatasum mount has checksums and
> is compressed. Is that what you intend?
>
> In chattr there are two cases where I would not clear the flag:
>
> - The file has NODATASUM and already has data. The existing extents
> have no checksums, so clearing NODATASUM would make them unreadable.
> chattr +c would return -EINVAL here, the same as setting the
> btrfs.compression property does since commit 0e852ab8974c ("btrfs:
> do not allow compression on nodatacow files").
That's expected. Non-empty files can not change their
NODATASUM/NODATACOW flags.
Thus in that case, adding compression to a nodatasum/nodatacow inode
should fail.
>
> - The file has +C. check_fsflags() already rejects chattr +c on it
> with -EINVAL and I would keep that.
>
> One more question before v2. Files with both flags and data can already
> exist on disk,
In that case NODATASUM/NODATACOW overrides the COMPRESS inode flags, and
no compressed extent will be generated.
That's a much safer default behavior.
If we go the other way, we will trigger a log problems like odd csum items.
Although setting COMPRESS flag on NODATASUM/NODATACOW is a much bigger
change, it should be addressed in a dedicated series, with a lot of
extra corner cases to consider.
> and chattr +A on them fails since 7.2. Is it OK to leave
> the compress flag and the property alone on these files when only other
> flags change?
Yes, that's why unlike other properties, compression has both
FS_NOCOMP_FL and FS_COMPR_FL.
If neither FS_NOCOMP_FL nor FS_COMPR_FL is set, COMPRESS flag should not
be touched.
Obviously the code just before update_flags: label is not properly
following that behavior.
If your objective is only to not return error, then that's what you
should touch, skipping the btrfs_set_prop() completely when neither
FS_NOCOMP_FL nor FS_COMPR_FL is set.
>
> Thanks,
> Hengyu
prev parent reply other threads:[~2026-10-11 5:53 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-10 10:54 Hengyu Liang
2026-10-10 21:17 ` Qu Wenruo
2026-10-10 21:20 ` Qu Wenruo
2026-10-11 3:47 ` Hengyu Liang
2026-10-11 5:53 ` Qu Wenruo [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=841e395e-f85d-4359-b680-1eee502ec2f0@suse.com \
--to=wqu@suse.com \
--cc=dsterba@suse.com \
--cc=fdmanana@suse.com \
--cc=hengyul@cs.unc.edu \
--cc=linux-btrfs@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mason@kernel.org \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®