在 2025/5/23 06:35, Sasha Levin 写道:
This is a note to let you know that I've just added the patch titled
btrfs: properly limit inline data extent according to block size
to the 6.14-stable tree which can be found at: http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git%3Ba=su...
The filename of the patch is: btrfs-properly-limit-inline-data-extent-according-to.patch and it can be found in the queue-6.14 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let stable@vger.kernel.org know about it.
Please drop this patch.
This is mostly for the incoming large folios support for btrfs.
For older kernels this patch will not cause any behavior change.
Thanks, Qu>
commit ec02842137bdccb74ed331a1b0a335ee22eb179c Author: Qu Wenruo wqu@suse.com Date: Tue Feb 25 14:30:44 2025 +1030
btrfs: properly limit inline data extent according to block size [ Upstream commit 23019d3e6617a8ec99a8d2f5947aa3dd8a74a1b8 ] Btrfs utilizes inline data extent for the following cases: - Regular small files - Symlinks And "btrfs check" detects any file extents that are too large as an error. It's not a problem for 4K block size, but for the incoming smaller block sizes (2K), it can cause problems due to bad limits: - Non-compressed inline data extents We do not allow a non-compressed inline data extent to be as large as block size. - Symlinks Currently the only real limit on symlinks are 4K, which can be larger than 2K block size. These will result btrfs-check to report too large file extents. Fix it by adding proper size checks for the above cases. Signed-off-by: Qu Wenruo <wqu@suse.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index a06fca7934d55..9a648fb130230 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -583,6 +583,10 @@ static bool can_cow_file_range_inline(struct btrfs_inode *inode, if (size > fs_info->sectorsize) return false;
- /* We do not allow a non-compressed extent to be as large as block size. */
- if (data_len >= fs_info->sectorsize)
return false;
- /* We cannot exceed the maximum inline data size. */ if (data_len > BTRFS_MAX_INLINE_DATA_SIZE(fs_info)) return false;
@@ -8671,7 +8675,12 @@ static int btrfs_symlink(struct mnt_idmap *idmap, struct inode *dir, struct extent_buffer *leaf; name_len = strlen(symname);
- if (name_len > BTRFS_MAX_INLINE_DATA_SIZE(fs_info))
- /*
* Symlinks utilize uncompressed inline extent data, which should not
* reach block size.
*/
- if (name_len > BTRFS_MAX_INLINE_DATA_SIZE(fs_info) ||
return -ENAMETOOLONG;name_len >= fs_info->sectorsize)
inode = new_inode(dir->i_sb);
linux-stable-mirror@lists.linaro.org