hc
2024-05-10 9999e48639b3cecb08ffb37358bcba3b48161b29
kernel/fs/btrfs/block-group.c
....@@ -77,14 +77,21 @@
7777 }
7878 allowed &= flags;
7979
80
- if (allowed & BTRFS_BLOCK_GROUP_RAID6)
80
+ /* Select the highest-redundancy RAID level. */
81
+ if (allowed & BTRFS_BLOCK_GROUP_RAID1C4)
82
+ allowed = BTRFS_BLOCK_GROUP_RAID1C4;
83
+ else if (allowed & BTRFS_BLOCK_GROUP_RAID6)
8184 allowed = BTRFS_BLOCK_GROUP_RAID6;
85
+ else if (allowed & BTRFS_BLOCK_GROUP_RAID1C3)
86
+ allowed = BTRFS_BLOCK_GROUP_RAID1C3;
8287 else if (allowed & BTRFS_BLOCK_GROUP_RAID5)
8388 allowed = BTRFS_BLOCK_GROUP_RAID5;
8489 else if (allowed & BTRFS_BLOCK_GROUP_RAID10)
8590 allowed = BTRFS_BLOCK_GROUP_RAID10;
8691 else if (allowed & BTRFS_BLOCK_GROUP_RAID1)
8792 allowed = BTRFS_BLOCK_GROUP_RAID1;
93
+ else if (allowed & BTRFS_BLOCK_GROUP_DUP)
94
+ allowed = BTRFS_BLOCK_GROUP_DUP;
8895 else if (allowed & BTRFS_BLOCK_GROUP_RAID0)
8996 allowed = BTRFS_BLOCK_GROUP_RAID0;
9097
....@@ -2279,10 +2286,20 @@
22792286 }
22802287
22812288 ret = inc_block_group_ro(cache, 0);
2282
- if (!do_chunk_alloc || ret == -ETXTBSY)
2283
- goto unlock_out;
22842289 if (!ret)
22852290 goto out;
2291
+ if (ret == -ETXTBSY)
2292
+ goto unlock_out;
2293
+
2294
+ /*
2295
+ * Skip chunk alloction if the bg is SYSTEM, this is to avoid system
2296
+ * chunk allocation storm to exhaust the system chunk array. Otherwise
2297
+ * we still want to try our best to mark the block group read-only.
2298
+ */
2299
+ if (!do_chunk_alloc && ret == -ENOSPC &&
2300
+ (cache->flags & BTRFS_BLOCK_GROUP_SYSTEM))
2301
+ goto unlock_out;
2302
+
22862303 alloc_flags = btrfs_get_alloc_profile(fs_info, cache->space_info->flags);
22872304 ret = btrfs_chunk_alloc(trans, alloc_flags, CHUNK_ALLOC_FORCE);
22882305 if (ret < 0)