File: Feature-by-version.rst

package info (click to toggle)
btrfs-progs 6.17-1
  • links: PTS, VCS
  • area: main
  • in suites: forky
  • size: 20,596 kB
  • sloc: ansic: 127,198; sh: 7,836; python: 1,385; makefile: 900; asm: 296
file content (731 lines) | stat: -rw-r--r-- 29,309 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
Changes (feature/version)
=========================

Major features or significant feature enhancements by kernel version. For more
information look below.

The version states at which version a feature has been merged into the mainline
kernel. It does not tell anything about at which kernel version it is
considered mature enough for production use. For an estimation on stability of
features see :doc:`Status<Status>` page.

6.x
---

6.0 - send protocol v2
        Send protocol update that adds new commands and extends existing
        functionality to write large data chunks. Compressed (and encrypted)
        extents can be optionally emitted and transferred as-is without the need
        to re-compress (or re-encrypt) on the receiving side.

6.0 - sysfs exports commit stats
        The file :file:`/sys/fs/btrfs/FSID/commit_stats` shows number of commits and
        various time related statistics.

6.0 - sysfs exports chunk sizes
        Chunk size value can be read from
        :file:`/sys/fs/btrfs/FSID/allocation/PROFILE/chunk_size`.

6.0 - sysfs shows zoned mode among features
        The zoned mode has been supported since 5.10 and adding functionality.
        Now it's advertised among features.

6.0 - checksum implementation is logged at mount time
        When a filesystem is mounted the implementation backing the checksums
        is logged. The information is also accessible in
        :file:`/sys/fs/btrfs/FSID/checksum`.

6.1 (stable)
------------

6.1 - sysfs support to temporarily skip exact qgroup accounting
        Allow user override of qgroup accounting and make it temporarily out
        of date e.g. in case when there are several subvolumes deleted and the
        qgroup numbers need to be updated at some cost, an update after that
        can amortize the costs.

6.1 - scrub also repairs superblock
        An improvement to scrub in case the superblock is detected to be
        corrupted, the repair happens immediately. Previously it was delayed
        until the next transaction commit for performance reasons that would
        store an updated and correct copy eventually.

6.1 - block group tree
        An incompatible change that has to be enabled at mkfs time. Add a new
        b-tree item that stores information about block groups in a compact way
        that significantly improves mount time that's usually long due to
        fragmentation and scattered b-tree items tracking the individual block
        groups. Requires and also enables the free-space-tree and no-holes
        features.

6.1 - discard stats available in sysfs
        The directory :file:`/sys/fs/btrfs/FSID/discard` exports statistics and
        tunables related to discard.

6.1 - additional qgroup stats in sysfs
        The overall status of qgroups are exported in
        :file:`/sys/sys/fs/btrfs/FSID/qgroups/`.

6.1 - check that super block is unchanged at thaw time
        Do full check of super block once a filesystem is thawed. This namely
        happens when system resumes from suspend or hibernation. Accidental
        change by other operating systems will be detected.

6.2 - discard=async on by default
        Devices that support trim/discard will enable the asynchronous discard
        for the whole filesystem.

6.3 - discard=async settings tuned
        The default IOPS limit has changed from 100 to 1000 and writing value 0
        to :file:`/sys/fs/btrfs/FSID/discard/iops_limit` newly means to not do any
        throttling.

6.3 - block group allocation class heuristics
        Pack files by size (up to 128k, up to 8M, more) to avoid fragmentation
        in block groups, assuming that file size and life time is correlated,
        in particular this may help during balance. The stats about the number
        of used classes per block group type is exported in
        :file:`/sys/fs/btrfs/FSID/allocation/\*/size_classes`.

6.3 - in DEV_INFO ioctl export per-device FSID
        A seeding device could have a different FSID, available in sysfs and now
        available via DEV_INFO ioctl.

6.3 - send utimes cache, reduced stream size
        Utimes for directories are emitted into the send stream only when
        finalizing the directory, the cache also gains significant speedups (up
        to 10x).

6.6 (stable)
------------

6.7 - raid-stripe-tree
        New tree for logical mapping, allows some RAID modes for zoned mode.

6.7 - simplified quota accounting
        A simplified mode of qgroups accounting

6.7 - temporary fsid
        Mount of cloned devices is now possible, the filesystem will get a new
        randomly generated UUID on mount

6.8 - new mount API
        Use new mount API (https://lwn.net/Articles/753473/)

6.9 - statx can read the subvolume id
        The extendable syscall *statx* also returns the subvolume id and
        sets the *result_mask* bit *STATX_SUBVOL*.

6.9 - reflinked file range and concurrent read
        An optimization for concurrent access to a range that is reflinked
        and read at the same time, the read latency is decreased due to reduced
        locking.

6.10 - automatic stale subvolume group removal
        This applies to 0 level qgroups (the one automatically created for a
        subvolume), once the subvolume is deleted the respective qgroup is
        also deleted. This may take some time until the qgroup accounting is
        correct and consistent again as the subvolume deletion is delayed.

        This is also affected by presence of the subvolume qgroup in higher
        level qgroups or the sysfs setting of *drop_subtree_threshold* that will
        need a quota rescan.

6.10 - sysfs reports reclaim status
        A per-filesystem report of background reclaim status, file names
        matching *reclaim_* in the space info directory.

6.10 - tunable dynamic background reclaim threshold
        Run background block group reclaim (using the relocation/balance mechanism)
        if the used size is above the configured value and the dynamic reclaim
        is enabled (not by default). When enabled, there's a heuristic that ties to
        avoid increasing system load if there's enough unallocated space but will
        try hard (but cannot be perfect) to avoid a situation when there's last
        chunk remaining to make the relocation possible.

6.10 - new mount option rescue= mode *ignoremetacsums*
        When enabled, any metadata checksum mismatch is ignored (in read-only mount),
        this may be useful in an interrupted checksum type conversion (:doc:`btrfstune`).

6.10 - new mount option rescue= mode *ignoresuperflags*
        An option to ignore unknown super block flags, at this point applies
        only to the interrupted checksum conversion, but can be useful for
        similar operations in the future.

6.10 - tree-checker updates
        Properly verify all types of directory items and reject unknown ones.
        Do relevant device item checks.

6.10 - allow to clone/reflink the tail extent
        Check if the last inode extent (not a full block length) can be cloned
        and do it, this fixes a problem in send/receive.

6.10 - unlink updates ctime
        Mandated by POSIX (https://pubs.opengroup.org/onlinepubs/9699919799/functions/unlink.html),
        the link count is changed.

6.11 - unconditionally wake up cleaner thread on SYNC ioctl
        Avoid indirection when the BTRFS_IOC_SYNC ioctl is called and wake
        up the cleaner thread which is among other things responsible to
        clean deleted subvolumes.

6.11 - reduced locking around buffered reads
        Improve concurrency by reducing scope of locking around buffered
        reads. The direct io is still locked but this should not be mixed with
        buffered writes.

6.12 (stable)
-------------

-6.12 - cancellable discard/TRIM
        Add more points where the discard can be interrupted by signals before
        it finishes the whole operation.

6.13 - new config option CONFIG_BTRFS_EXPERIMENTAL
        Add separate config option to distinguish purely debugging features
        (like extended safety checks) and features that still need some
        refinements (and were hidden under the debugging config option not to
        expose them to users). When enabled this namely covers extent tree v2,
        raid stripe tree, send protocol version 3 and checksum offloading strategy.

6.13 - encoded read integration with io_uring
        The io_uring subsystem understands a command that is directed to
        Btrfs encoded read ioctl.

6.13 - new ioctl to wait for cleaned subvolumes
        Add specialized ioctl to wait for deleted (and maybe not yet cleaned)
        subvolumes, available to any user. The related command :command:`btrfs subvolume sync`
        uses the privileged SEARCH_TREE ioctl otherwise.

6.13 - seeding device use case change
        The sprout device (the writable one added to the seeding device) does
        not touch the superblock read-only status, preventing removal of
        accumulated deleted snapshots to be cleaned.

6.13 - tree-checker update for inline extent references
        Update tree-checker to detect more wrong inline extent references.

6.14 - support READ_VERITY_METADATA ioctl
        Add support for FS_IOC_READ_VERITY_METADATA to directly query the
        Merkle tree, descriptor and signature blocks for fs-verity enabled
        files.

6.14 - *experimental* read balancing policies
        Add more read balancing policies, configurable in :file:`/sys/fs/btrfs/FSID/read_policy`
        or as module parameter *read_policy*.  Newly added *round-robin*,
        *devid:N* (select a specific mirror number *N*).

6.14 - encoded write integration with io_uring
        The io_uring subsystem understands a command that is directed to
        Btrfs encoded write ioctl.

6.15 - always do buffered IO for files with checksums
        Direct IO may lead to data and their checksums mismatch. Use the direct
        to buffered fallback in case the file has checksums. This has a negative
        performance impact.

6.15 - negative (fast) levels for zstd
        Mount options for *zstd* compression accept negative values *-1..-15*
        match the levels. They provide faster compression at the cost of worse
        ratio.

6.15 - *(debug builds)* accept 2K block size on x86_64
        For testing the *subpage* block size feature, the size of 2K is accepted
        on x86_64 which has 4K pages.

6.15 - defrag ioctl accepts negative zstd levels
        The defrag ioctl also accepts the negative zstd levels that can be set as
        mount option.

6.17 (latest)
-------------

6.17 - track current commit duration in commit_stats
        Add entry to :file:`commit_stats` to detect commit stalls, for
        debugging or monitoring purposes.

6.17 - *experimental* large folio support
        Large folios abstract contiguous page ranges representing some filesystem
        data or metadata as one structure instead of several ones. This simplifies
        code and has a positive impact on performance. As it touches the core
        data structure it is not enabled by default.

6.17 - restrict writes to mounted devices
        Any btrfs mounted device cannot be opened for writes.

6.17 - defrag ioctl can force no compression
        The defrag ioctl was not able to uncompress a given range, now it's
        possible.

6.17 - send (v2 protocol) uses fallocate for hole punching
        File holes, ranges not representing data, were emulated by a zero
        filled data. This is less efficient than puching holes.

5.x
---

5.0 - swapfile
        With some limitations where COW design does not work well with the swap
        implementation (nodatacow file, no compression, cannot be snapshotted,
        not possible on multiple devices, ...), as this is the most restricted
        but working setup, we'll try to improve that in the future

5.0 - metadata uuid
        An optional incompat feature to assign a new filesystem UUID without
        overwriting all metadata blocks, stored only in superblock, unlike what
        :command:`btrfstune -u`

5.1 - FORGET_DEV ioctl
        Unregister devices previously added by the scan ioctl, same effect as
        if the kernel module is reloaded.

5.1 - ZSTD level
        Allow to set the ZSTD compression level via mount option, e.g. like
        *compress=zstd:9*. The levels match the default ZSTD compression
        levels. The default is 3, maximum is 15.

5.2 - pre-write checks
        Verify metadata blocks before submitting them to the devices. This can
        catch consistency problems or bitflips.

5.4 (stable)
------------

5.5 - more checksums
        New checksum algorithms: xxhash (64b), SHA256 (256b), BLAKE2b (256b).

5.5 - RAID1C34
        RAID1 with 3- and 4- copies (over all devices).

5.6 - async discard
        Mode of discard (*mount -o discard=async*) that merges freed extents to
        larger chunks and submits them for discard in a less intrusive way

5.6 - device info in sysfs
        More information about device state can be found in per-filesystem sysfs directory.

5.7 - reflink/clone works on inline files
        Inline files can be reflinked to the tail extent of other files

5.7 - faster balance cancel
        More cancellation points in balance that will shorten the time to stop
        processing once :command:`btrfs balance cancel` is called.

5.7 - *removed flag BTRFS_SUBVOL_CREATE_ASYNC*
        Remove support of flag BTRFS_SUBVOL_CREATE_ASYNC from subvolume creation ioctl.

5.7 - v2 of snapshot deletion ioctl
        New ioctl BTRFS_IOC_SNAP_DESTROY_V2, deletion by subvolume id is now possible.

5.9 - mount option *rescue*
        Unified mount option for actions that may help to access a damaged
        filesystem. Now supports: nologreplay, usebackuproot

5.9 - qgroups in sysfs
        The information about qgroup status and relations is exported in :file:`/sys/fs/UUID/qgroups`

5.9 - FS_INFO ioctl
        Export more information: checksum type, checksum size, generation, metadata_uuid

5.10 (stable)
-------------

5.10 - exclusive ops in sysfs
        Export which filesystem exclusive operation is running (balance,
        resize, device add/delete/replace, ...)

5.11 - remove *inode_cache*
        Remove inode number caching feature (mount -o inode_cache)

5.11 - more rescue= modes
        Additional modes for mount option *rescue=*: ignorebadroots/ibadroots,
        ignoredatacsums/idatacsums. All are exported in
        :file:`/sys/fs/btrfs/features/supported_rescue_options`.

5.12 - zoned mode
        Support for zoned devices with special allocation/write mode to
        fixed-size zones. See :doc:`Zoned<Zoned-mode>`.

5.13 - supported_sectorsizes in sysfs
        List supported sector sizes in sysfs file :file:`/sys/fs/btrfs/features/supported_sectorsizes`.

5.14 - sysfs scrub bw limit
        Tunable bandwidth limit
        :file:`/sys/fs/btrfs/FSID/devinfo/DEVID/scrub_speed_max` for scrub (and
        device replace) for a given device.

5.14 - sysfs device stats
        The device stats can be also found in :file:`/sys/fs/btrfs/FSID/devinfo/DEVID/error_stats`.

5.14 - cancellable resize, device delete
        The filesystem resize and device delete operations can be cancelled by
        specifying *cancel* as the device name.

5.14 - property value reset
        Change how empty value is interpreted. New behaviour will delete the
        value and reset it to default. This affects *btrfs.compression* where
        value *no* sets NOCOMPRESS bit while empty value resets all compression
        settings (either compression or NOCOMPRESS bit).

5.15 (stable)
-------------

5.15 - fsverity
        The fs-verity is a support layer that filesystems can hook into to
        support transparent integrity and authenticity protection of read-only
        files. https://www.kernel.org/doc/html/latest/filesystems/fsverity.html

5.15 - idmapped mount
        Support mount with UID/GID mapped according to another namespace.
        https://lwn.net/Articles/837566/

5.16 - ZNS in zoned
        Zoned namespaces. https://zonedstorage.io/docs/introduction/zns ,
        https://lwn.net/Articles/865988/

5.17 - send and relocation
        Send and relocation (balance, device remove, shrink, block group
        reclaim) can now work in parallel.

5.17 - device add vs balance
        It is possible to add a device with paused balance.

        .. note::
           Since kernel 5.17.7 and btrfs-progs 5.17.1

5.17 - *no warning with flushoncommit*
        Mounting with *-o flushoncommit* does not trigger the (harmless)
        warning at each transaction commit.

        .. note::
           Also backported to 5.15.27 and 5.16.13

5.18 - zoned and DUP metadata
        DUP metadata works with zoned mode.

5.18 - encoded data ioctl
        New ioctls to read and write pre-encoded data (i.e. no transformation
        and directly written as extents), now works for compressed data.

5.18 - *removed balance ioctl v1*
        The support for ioctl BTRFS_IOC_BALANCE has been removed, superseded by
        BTRFS_IOC_BALANCE_V2 long time ago.

5.18 - *cross-mount reflink works*
        The VFS limitation to reflink files on separate subvolume mounts of the
        same filesystem has been removed.

5.18 - syslog error messages with filesystem state
        Messages are printed with a one letter tag ("state: X") that denotes in
        which state the filesystem was at this point:

        * A - transaction aborted (permanent)
        * E - filesystem error (permanent)
        * M - remount in progress (transient)
        * R - device replace in progress (transient)
        * C - checksum checks disabled by mount option (rescue=ignoredatacsums)
        * L - log tree replay did not complete due to some error

5.18 - tree-checker verifies transaction id pre-write
        Metadata buffer to be written gets an extra check if the stored
        transaction number matches the current state of the filesystem.

5.19 - subpage support pages > 4KiB
        Metadata node size is supported regardless of the CPU page size
        (minimum size is 4KiB), data sector size is supported <= page size.
        Additionally subpage also supports RAID56.

5.19 - per-type background threshold for reclaim
        Add sysfs tunable for background reclaim threshold for all block group
        types (data, metadata, system).

5.19 - automatically repair device number mismatch
        Device information is stored in two places, the number in the super
        block and items in the device tree. When this is goes out of sync, e.g.
        by device removal short before unmount, the next mount could fail.
        The b-tree is an authoritative information an can be used to override
        the stale value in the superblock.

5.19 - defrag can convert inline files to regular ones
        The logic has been changed so that inline files are considered for
        defragmentation even if the mount option max_inline would prevent that.
        No defragmentation might happen but the inlined files are not skipped.

5.19 - explicit minimum zone size is 4MiB
        Set the minimum limit of zone on zoned devices to 4MiB. Real devices
        zones are much larger, this is for emulated devices.

5.19 - sysfs tunable for automatic block group reclaim
        Add possibility to set a threshold to automatically reclaim block groups
        also in non-zoned mode. By default completely empty block groups are
        reclaimed automatically but the threshold can be tuned in
        :file:`/sys/fs/btrfs/FSID/allocation/PROFILE/bg_reclaim_threshold`.

5.19 - tree-checker verifies metadata block ownership
        Additional check done by tree-checker to verify relationship between a
        tree block and it's tree root owner.

4.x
---

4.0 - store otime
        Save creation time (otime) for all new files and directories. For
        future use, current tool cannot read it directly.

4.2 - rootid ioctl accessible
        The INO_LOOKUP will return root id (id of the containing subvolume),
        unrestricted and to all users if the *treeid* is 0.

4.2 - dedupe possible on the same inode
        The EXTENT_SAME ioctl will accept the same inode as source and
        destination (ranges must not overlap).

4.3 - trim all free space
        Trim will be performed also on the space that's not allocated by the
        chunks, not only free space within the allocated chunks.

4.4 - balance filter updates
        Enhanced syntax and new balance filters:

        *  limit=min..max
        *  usage=min..max
        *  stripes=min..max

4.5 - free space tree
        Improved implementation of free space cache (aka v2), using b-trees.

        .. note::
           Default since btrfs-progs 5.15, Kernel 4.9 fixes endianness bugs on
           big-endian machines, x86* is ok

4.5 - balance filter updates
        Conversion to data/DUP profile possible through balance filters -- on single-device filesystem.

        .. note::
           mkfs.btrfs allows creating DUP on single device in the non-mixed mode since 4.4

4.6 - max_inline default
        The default value of max_inline changed to 2048.

4.6 - read features from control device
        The existing ioctl GET_SUPPORTED_FEATURES can be now used on the
        control device (:file:`/dev/btrfs-control`) and returns the supported features
        without any mounted filesystem.

4.7 - delete device by id
        Add new ioctl RM_DEV_V2, pass device to be deleted by its ID.

4.7 - more renameat2 modes
        Add support for RENAME_EXCHANGE and RENAME_WHITEOUT to *renameat2*
        syscall. This also means that *overlayfs* is now supported on top of
        btrfs.

4.7 - balance filter updates
        Conversion to data/DUP profile possible through balance filters -- on multiple-device filesystems.

        .. note::
           mkfs.btrfs allows creating DUP on multiple devices since 4.5.1

4.12 - RAID56: auto repair
        Scrub will attempt auto-repair (similar to raid1/raid10)

4.13 - statx
        Support for the enhanced statx syscall; file creation timestamp

4.13 - sysfs qgroups override
        qgroups: new sysfs control file to allow temporary quota override with CAP_SYS_RESOURCE

4.13 - *deprecated mount option alloc_start*
        That was a debugging helper, not used and not supposed to be used nowadays.

4.14 - ZSTD compression
        New compression algorithm ZSTD, supposedly better ratio/speed performance.

4.14 - improved degraded mount
        Allow degraded mount based on the chunk constraints, not device number
        constraints. E.g. when one device is missing but the remaining one holds
        all *single* chunks.

4.14 - *deprecated user transaction ioctl*
        BTRFS_IOC_TRANS_START and BTRFS_IOC_TRANS_END, no known users, tricky
        to use; scheduled to be removed in 4.17

4.14 - refine SSD optimizations
        The mount option *ssd* does not make any assumptions about block layout
        or management by the device anymore, leaving only the speedups based on
        low seek cost active.  This could avoid some corner cases leading to
        excessive fragmentation.
        https://git.kernel.org/linus/583b723151794e2ff1691f1510b4e43710293875
        The story so far.

4.15 - overlayfs
        Overlayfs can now use btrfs as the lower filesystem.

4.15 - *ref-verify*
        Debugging functionality to verify extent references. New mount option
        *ref-verify*, must be built with CONFIG_BTRFS_FS_REF_VERIFY.

4.15 - ZLIB level
        Allow to set the ZLIB compression level via mount option, e.g. like
        *compress=zlib:9*. The levels match the default ZLIB compression
        levels. The default is 3.

4.15 - v2 of LOGICAL_INO ioctl
        An enhanced version of ioctl that can translate logical extent offset
        to inode numbers, "who owns this block". For certain use cases the V1
        performs bad and this is addressed by V2.
        See for more https://git.kernel.org/linus/d24a67b2d997c860a42516076f3315c2ad2d2884 .

4.15 - compression heuristics
        Apply a few heuristics to the data before they're compressed to decide
        if it's likely to gain any space savings. The methods: frequency
        sampling, repeated pattern detection, Shannon entropy calculation.

4.16 - fallocate: zero range
        Mode of the *fallocate* syscall to zero file range.

4.17 - *removed user transaction ioctl*
        Deprecated in 4.14, see above.

4.17 - *rmdir* on subvolumes
        Allow *rmdir* to delete an empty subvolume.

4.18 - XFLAGS ioctl
        Add support for ioctl FS_IOC_FSSETXATTR/FS_IOC_FSGETXATTR, successor of
        FS_IOC_SETFLAGS/FS_IOC_GETFLAGS ioctl. Currently supports: APPEND,
        IMMUTABLE, NOATIME, NODUMP, SYNC. Note that the naming is very
        confusing, though it's named *xattr*, it does not mean the extended
        attributes. It should be referenced as extended inode flags or
        *xflags*.

4.18 - EXTENT_SAME ioctl / 16MiB chunks
        The range for out-of-band deduplication implemented by the EXTENT_SAME
        ioctl will split the range into 16MiB chunks. Up to now this was the
        overall limit and effectively only the first 16MiB was deduplicated.

4.18 - GET_SUBVOL_INFO ioctl
        New ioctl to read subvolume information (id, directory name,
        generation, flags, UUIDs, time). This does not require root
        permissions, only the regular access to to the subvolume.

4.18 - GET_SUBVOL_ROOTREF ioctl
        New ioctl to enumerate subvolume references of a given subvolume. This
        does not require root permissions, only the regular access to to the
        subvolume.

4.18 - INO_LOOKUP_USER ioctl
        New ioctl to lookup path by inode number. This does not require root
        permissions, only the regular access to to the subvolume, unlike the
        INO_LOOKUP ioctl.

4.19 - defrag ro/rw
        Allow to run defrag on files that are normally accessible for
        read-write, but are currently opened in read-only mode.

3.x
---

3.0 - scrub
        Read all data and verify checksums, repair if possible.

3.2 - auto raid repair
        Automatic repair of broken data from a good copy

3.2 - root backups
        Save a few previous versions of the most important tree roots at commit time, used by *-o recovery*

3.3 - integrity checker
        Optional infrastructure to verify integrity of written metadata blocks

3.3 - backref walking
        Groundwork to allow tracking owner of blocks, used via *inspect-internal*

3.3 - restriper
        RAID profiles can be changed on-line, balance filters

3.4 - big metadata blocks
        Support for metadata blocks larger than page size

        .. note::
           Default nodesize is 16KiB since btrfs-progs 3.12

3.4 - error handling
        Generic infrastructure for graceful error handling (EIO)

3.5 - device statistics
        Persistent statistics about device errors

3.5 - fsync speedup
        Noticeable improvements in fsync() implementation

3.6 - qgroups
        Subvolume-aware quotas

3.6 - send/receive
        Ability to transfer one filesystem via a data stream (full or
        incremental) and apply the changes on a remote filesystem.

3.7 - extrefs
        Hardlink count limit is lifted to 65536.

        .. note::
           Default since btrfs-progs 3.12

3.7 - hole punching
        Implement the FALLOC_FL_PUNCH_HOLE mode of *fallocate*.

3.8 - device replace
        Efficient replacement of existing device (add/remove in one go).

3.9 - raid 5/6 *(incomplete)*
        Basic support for RAID5/6 profiles, no crash resiliency, replace and
        scrub support.

3.9 - snapshot-aware defrag
        Defrag does not break links between shared extents (snapshots,
        reflinked files).

        .. note::
           Disabled since 3.14 (and backported to some stable kernel versions)
           due to problems. Has been completely removed in 5.6.

3.9 - lightweight send
        A mode of *send* that does not add the actual file data to the stream.

3.9 - on-line label set/get
        Label editable on mounted filesystems.

3.10 - skinny metadata
        Reduced metadata size (format change) of extents.

       .. note::
          Default since btrfs-progs 3.18

3.10 - qgroup rescan
        Sync qgroups with existing filesystem data.

3.12 - UUID tree
        A map of subvolume/UUID that vastly speeds up send/receive.

3.12 - out-of-bound deduplication
        Support for deduplicating extents on a given set of files.

3.14 - no-holes
        No extent representation for file holes (format change), may reduce
        overall metadata consumption

3.14 - feature bits in sysfs
        :file:`/sys/fs/btrfs` exports various bits about filesystem
        capabilities and feature support

3.16 - O_TMPFILE
        Mode of open() to safely create a temporary file

3.16 - search ioctl v2
        The extended SEARCH_TREE ioctl able to get more than a 4k data

3.18 - auto block group reclaim
        Automatically remove block groups (aka. chunks) that become completely empty.

3.19 - RAID56: scrub, replace
        Scrub and device replace works on RAID56 filesystems.