Cow is the main feature of BTRFS.
Every write is a new 'version' of the file with only the change in it and a reference from the old file.
Snapshots will contain those 'versions' without adding much data to the disk.
Those 'Versions' are called extents (group of blocks)
defrag is the act of CREATING a new extents of the file with all update included inside which can grow your space usage if you have snapshots.
Because of CoW, DBs, VMs and logs/journal can be slower:
Files with a lot of random writes can become heavily fragmented (10000+ extents) causing thrashing on HDDs and excessive multi-second spikes of CPU load on systems with an SSD or large amount a RAM.
Quota groups applied to Subvolumes.
Modes allowing mount with damaged filesystem structures, all requires the filesystem to be mounted read-only and doesn’t allow remount to read-write. [2]
improvements to the background block group reclaim (BTRFS can over allocate memory when you write and this process help get that mem back),
automatically dropping the #QGroups of deleted subvolumes,
new modes of "rescue=" that allow to mount (as read-only) images that could have been partially converted by user space tools
- ignoremetacsums - invalid metadata checksums are ignored
- ignoresuperflags - super block flags that track conversion in progress (like UUID or checksums) userspace tool.
memory allocation optimizations, and other improvements[3]
there are some minor performance optimizations and fixes along with more folio API conversions [4]
new BTRFS_IOC_SUBVOL_SYNC_WAIT ioctl() command for the Btrfs filesystem will wait for the cleaning of one or more subvolumes. It is an unprivileged operation, and is intended to allow the "btrfs subvolume sync" command to work without privilege. TLDR New IOCTL that allow you to use the sync command that makes you wait until the deletion of a subvolume is done, this make sense if you have a backup sys that del a subvol and you want to know when you can check for how much place is left [5]
Btrfs now supports performing encoded reads (reading of compressed extents directly, without decompression) via io_uring.[6]
Some Btrfs configurations give the filesystem a choice of multiple devices (Raid 1) when the time comes to read a specific block. In current kernels, the PID of the reading process is used to make that decision, but that will focus all read traffic onto a single device in a single-reader workload. The 6.14 kernel adds a couple of new policy options that can implement either round-robin read balancing or simply focus reads onto a specific device. See this commit to set a specific device.[7]
1]: [Gotchas - btrfs Wiki (kernel.org)
2]: [BTRFS SPECIFIC MOUNT OPTIONS — BTRFS documentation
3]: [F2FS, exFAT Btrfs File-System Changes In Linux 6.11 - Phoronix
4]: [Btrfs Sees Minor Performance Optimizations With Linux 6.12 - Phoronix
5]: [btrfs: add new ioctl to wait for cleaned subvolumes - kernel/git/torvalds/linux.git - Linux kernel source tree
6]: [btrfs: add io_uring command for encoded reads (ENCODED_READ ioctl) - kernel/git/torvalds/linux.git - Linux kernel source tree
7]: [The first part of the 6.14 merge window [LWN.net]