Question: how understand the raid profile of a btrfs filesystem

Goffredo Baroncelli
2020-03-20T18:02:17Z

Hi all,

for a btrfs filesystem, how an user can understand which is the {data,mmetadata,system} [raid] profile in use ? E.g. the next chunk which profile will have ?
For simple filesystem it is easy looking at the output of (e.g) "btrfs fi df" or "btrfs fi us". But what if the filesystem is not simple ?

btrfs fi us t/.
Overall:
Device size: 40.00GiB
Device allocated: 19.52GiB
Device unallocated: 20.48GiB
Device missing: 0.00B
Used: 16.75GiB
Free (estimated): 12.22GiB (min: 8.27GiB)
Data ratio: 1.90
Metadata ratio: 2.00
Global reserve: 9.06MiB (used: 0.00B)

Data,single: Size:1.00GiB, Used:512.00MiB (50.00%)
/dev/loop0 1.00GiB

Data,RAID5: Size:3.00GiB, Used:2.48GiB (82.56%)
/dev/loop1 1.00GiB
/dev/loop2 1.00GiB
/dev/loop3 1.00GiB
/dev/loop0 1.00GiB

Data,RAID6: Size:4.00GiB, Used:3.71GiB (92.75%)
/dev/loop1 2.00GiB
/dev/loop2 2.00GiB
/dev/loop3 2.00GiB
/dev/loop0 2.00GiB

Data,RAID1C3: Size:2.00GiB, Used:1.88GiB (93.76%)
/dev/loop1 2.00GiB
/dev/loop2 2.00GiB
/dev/loop3 2.00GiB

Metadata,RAID1: Size:256.00MiB, Used:9.14MiB (3.57%)
/dev/loop2 256.00MiB
/dev/loop3 256.00MiB

System,RAID1: Size:8.00MiB, Used:16.00KiB (0.20%)
/dev/loop2 8.00MiB
/dev/loop3 8.00MiB

Unallocated:
/dev/loop1 5.00GiB
/dev/loop2 4.74GiB
/dev/loop3 4.74GiB
/dev/loop0 6.00GiB

This is an example of a strange but valid filesystem. So the question is: the next chunk which profile will have ?
Is there any way to understand what will happens ?

I expected that the next chunk will be allocated as the last "convert". However I discovered that this is not true.

Looking at the code it seems to me that the logic is the following (from btrfs_reduce_alloc_profile())

if (allowed & BTRFS_BLOCK_GROUP_RAID6)
allowed = BTRFS_BLOCK_GROUP_RAID6;
else if (allowed & BTRFS_BLOCK_GROUP_RAID5)
allowed = BTRFS_BLOCK_GROUP_RAID5;
else if (allowed & BTRFS_BLOCK_GROUP_RAID10)
allowed = BTRFS_BLOCK_GROUP_RAID10;
else if (allowed & BTRFS_BLOCK_GROUP_RAID1)
allowed = BTRFS_BLOCK_GROUP_RAID1;
else if (allowed & BTRFS_BLOCK_GROUP_RAID0)
allowed = BTRFS_BLOCK_GROUP_RAID0;

flags &= ~BTRFS_BLOCK_GROUP_PROFILE_MASK;

So in the case above the profile will be RAID6. And in the general if a RAID6 chunk is a filesystem, it wins !

But I am not sure.. Moreover I expected to see also reference to DUP and/or RAID1C[34] ...

Does someone have any suggestion ?

BR
G.Baroncelli