How to set a non default zstd compression level at btrfs filesystem defragment

btrfszstd

# btrfs filesystem defragment -r -v -czstd:15 /
ERROR: unknown compression type zstd:15
# btrfs filesystem defragment -r -v -czstd_15 /
ERROR: unknown compression type zstd_15
# btrfs filesystem defragment -r -v -czstd15 /
ERROR: unknown compression type zstd15

The btrfs manual page doesn't give the clue on how to select a compression level:

-c[algo]

compress file contents while defragmenting. Optional argument selects the compression algorithm, zlib (default), lzo or zstd.
Currently it’s not possible to select no compression. See also section
EXAMPLES.

How to select a non-default zstd compression level to re-compress existing btrfs filesystems?


Note: btrfs filesystem defragment on snapshots might result in much larger disk space consumption:

Warning: Defragmenting with Linux kernel versions < 3.9 or ≥ 3.14-rc2
as well as with Linux stable kernel versions ≥ 3.10.31, ≥ 3.12.12 or ≥
3.13.4 will break up the ref-links of COW data (for example files copied with cp –reflink, snapshots or de-duplicated data). This may
cause considerable increase of space usage depending on the broken up
ref-links.

Best Answer

Kernel 5.1 added ZSTD level support. I tested it with rc1 today using a mount option compress=zstd:12 in /etc/fstab. The default level is 3. To be clear: The change affects only files that are written after this mount command. Some benchmark results: https://lkml.org/lkml/2019/1/28/1930