btrfs-progs/common
Qu Wenruo bed70b939f btrfs-progs: fsfeatures: properly merge -O and -R options
[BUG]
Commit "btrfs-progs: prepare merging compat feature lists" tries to
merged "-O" and "-R" options, as they don't correctly represents
btrfs features.

But that commit caused the following bug during mkfs for experimental
build:

  $ mkfs.btrfs -f -O block-group-tree  /dev/nvme0n1
  btrfs-progs v5.19.1
  See http://btrfs.wiki.kernel.org for more information.

  ERROR: superblock magic doesn't match
  ERROR: illegal nodesize 16384 (not equal to 4096 for mixed block group)

[CAUSE]
Currently btrfs_parse_fs_features() will return a u64, and reuse the
same u64 for both incompat and compat RO flags for experimental branch.

This can easily leads to conflicts, as
BTRFS_FEATURE_INCOMPAT_MIXED_BLOCK_GROUP and
BTRFS_FEATURE_COMPAT_RO_BLOCK_GROUP_TREE both share the same bit
(1 << 2).

Thus for above case, mkfs.btrfs believe it has set MIXED_BLOCK_GROUP
feature, but what we really want is BLOCK_GROUP_TREE.

[FIX]
Instead of incorrectly re-using the same bits in btrfs_feature, split
the old flags into 3 flags:

- incompat_flag
- compat_ro_flag
- runtime_flag

The first two flags are easy to understand, the corresponding flag of
each feature.
The last runtime_flag is to compensate features which doesn't have any
on-disk flag set, like QUOTA and LIST_ALL.

And since we're no longer using a single u64 as features, we have to
introduce a new structure, btrfs_mkfs_features, to contain above 3
flags.

This also mean, things like default mkfs features must be converted to
use the new structure, thus those old macros are all converted to
const static structures:

- BTRFS_MKFS_DEFAULT_FEATURES + BTRFS_MKFS_DEFAULT_RUNTIME_FEATURES
  -> btrfs_mkfs_default_features

- BTRFS_CONVERT_ALLOWED_FEATURES -> btrfs_convert_allowed_features

And since we're using a structure, it's not longer as easy to implement
a disallowed mask.

Thus functions with @mask_disallowed are all changed to using
an @allowed structure pointer (which can be NULL).

Finally if we have experimental features enabled, all features can be
specified by -O options, and we can output a unified feature list,
instead of the old split ones.

Signed-off-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2022-10-11 09:08:11 +02:00
..
box.h btrfs-progs: build most common tools into one binary (busybox style) 2019-07-04 15:30:40 +02:00
defs.h btrfs-progs: move common-defs to common/ 2020-03-31 18:37:35 +02:00
device-scan.c btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
device-scan.h btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
device-utils.c btrfs-progs: device-utils: rename btrfs_device_size 2022-10-11 09:08:10 +02:00
device-utils.h btrfs-progs: device-utils: rename btrfs_device_size 2022-10-11 09:08:10 +02:00
extent-cache.c btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
extent-cache.h btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
filesystem-utils.c btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
filesystem-utils.h btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
format-output.c btrfs-progs: factor out common message helper for internal errors 2022-10-11 09:08:09 +02:00
format-output.h btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
fsfeatures.c btrfs-progs: fsfeatures: properly merge -O and -R options 2022-10-11 09:08:11 +02:00
fsfeatures.h btrfs-progs: fsfeatures: properly merge -O and -R options 2022-10-11 09:08:11 +02:00
help.c btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
help.h btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
internal.h
messages.c btrfs-progs: add helper to print messages to stderr 2022-10-11 09:08:11 +02:00
messages.h btrfs-progs: add helper to print messages to stderr 2022-10-11 09:08:11 +02:00
open-utils.c btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
open-utils.h btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
parse-utils.c btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
parse-utils.h btrfs-progs: move parse_qgroupid_or_path to parse-utils 2022-10-11 09:06:13 +02:00
path-utils.c btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
path-utils.h btrfs-progs: remove unnecessary linux/*.h includes 2021-05-06 16:41:47 +02:00
rbtree-utils.c btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
rbtree-utils.h btrfs-progs: remove c++ protection from internal headers 2021-10-08 20:47:04 +02:00
send-stream.c btrfs-progs: use template for out of memory error messages 2022-10-11 09:08:09 +02:00
send-stream.h btrfs-progs: receive: add support for fs-verity 2022-10-11 09:08:08 +02:00
send-utils.c btrfs-progs: use error helper for messages in non-kernel code 2022-10-11 09:08:07 +02:00
send-utils.h btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
string-table.c btrfs-progs: common: reorder includes 2022-10-11 09:06:12 +02:00
string-table.h btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
string-utils.c btrfs-progs: use error helper for messages in non-kernel code 2022-10-11 09:08:07 +02:00
string-utils.h btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
task-utils.c btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
task-utils.h btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
units.c btrfs-progs: use our ASSERT macro everywhere 2022-10-11 09:08:10 +02:00
units.h btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00
utils.c btrfs-progs: use warning helper for multiple profile messages 2022-10-11 09:08:07 +02:00
utils.h btrfs-progs: common: update include lists, part 1 2022-10-11 09:08:07 +02:00