2017-01-25 15:54:35 +00:00
|
|
|
/*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public
|
|
|
|
* License v2 as published by the Free Software Foundation.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public
|
|
|
|
* License along with this program; if not, write to the
|
|
|
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
|
|
* Boston, MA 021110-1307, USA.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Defines and function declarations for users of the mkfs API, no internal
|
2018-06-02 20:30:22 +00:00
|
|
|
* definitions.
|
2017-01-25 15:54:35 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __BTRFS_MKFS_COMMON_H__
|
|
|
|
#define __BTRFS_MKFS_COMMON_H__
|
|
|
|
|
|
|
|
#include "kerncompat.h"
|
2022-09-15 11:59:39 +00:00
|
|
|
#include <stdbool.h>
|
|
|
|
#include "kernel-lib/sizes.h"
|
2023-08-28 20:12:13 +00:00
|
|
|
#include "kernel-shared/uapi/btrfs_tree.h"
|
2020-03-04 20:09:30 +00:00
|
|
|
#include "common/defs.h"
|
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-05 01:48:07 +00:00
|
|
|
#include "common/fsfeatures.h"
|
2017-01-25 15:54:35 +00:00
|
|
|
|
2022-09-15 11:59:39 +00:00
|
|
|
struct btrfs_root;
|
|
|
|
struct btrfs_trans_handle;
|
|
|
|
|
2017-01-31 22:13:54 +00:00
|
|
|
#define BTRFS_MKFS_SYSTEM_GROUP_SIZE SZ_4M
|
|
|
|
#define BTRFS_MKFS_SMALL_VOLUME_SIZE SZ_1G
|
|
|
|
|
2020-07-21 10:13:27 +00:00
|
|
|
/*
|
|
|
|
* Default settings for block group types
|
|
|
|
*/
|
|
|
|
#define BTRFS_MKFS_DEFAULT_DATA_ONE_DEVICE 0 /* SINGLE */
|
|
|
|
#define BTRFS_MKFS_DEFAULT_META_ONE_DEVICE BTRFS_BLOCK_GROUP_DUP
|
|
|
|
|
2020-07-21 10:28:05 +00:00
|
|
|
#define BTRFS_MKFS_DEFAULT_DATA_MULTI_DEVICE 0 /* SINGLE */
|
2020-07-21 10:13:27 +00:00
|
|
|
#define BTRFS_MKFS_DEFAULT_META_MULTI_DEVICE BTRFS_BLOCK_GROUP_RAID1
|
|
|
|
|
2017-06-28 09:59:24 +00:00
|
|
|
/*
|
|
|
|
* Tree root blocks created during mkfs
|
|
|
|
*/
|
|
|
|
enum btrfs_mkfs_block {
|
|
|
|
MKFS_ROOT_TREE,
|
|
|
|
MKFS_EXTENT_TREE,
|
|
|
|
MKFS_CHUNK_TREE,
|
|
|
|
MKFS_DEV_TREE,
|
|
|
|
MKFS_FS_TREE,
|
|
|
|
MKFS_CSUM_TREE,
|
2021-08-23 20:14:54 +00:00
|
|
|
MKFS_FREE_SPACE_TREE,
|
2022-03-07 22:10:51 +00:00
|
|
|
MKFS_BLOCK_GROUP_TREE,
|
2021-08-23 20:14:54 +00:00
|
|
|
|
2022-08-09 06:03:51 +00:00
|
|
|
/* MKFS_BLOCK_COUNT should be the max blocks we can have at mkfs time. */
|
|
|
|
MKFS_BLOCK_COUNT
|
2021-08-23 20:14:46 +00:00
|
|
|
};
|
|
|
|
|
2022-08-09 06:03:51 +00:00
|
|
|
static const enum btrfs_mkfs_block default_blocks[] = {
|
2022-03-07 22:10:51 +00:00
|
|
|
MKFS_ROOT_TREE,
|
|
|
|
MKFS_EXTENT_TREE,
|
|
|
|
MKFS_CHUNK_TREE,
|
|
|
|
MKFS_DEV_TREE,
|
|
|
|
MKFS_FS_TREE,
|
|
|
|
MKFS_CSUM_TREE,
|
|
|
|
MKFS_FREE_SPACE_TREE,
|
|
|
|
};
|
|
|
|
|
2017-01-25 15:54:35 +00:00
|
|
|
struct btrfs_mkfs_config {
|
2017-02-01 13:17:12 +00:00
|
|
|
/* Label of the new filesystem */
|
2017-02-01 13:27:24 +00:00
|
|
|
const char *label;
|
2018-06-02 20:30:22 +00:00
|
|
|
/* Block sizes */
|
2017-01-25 15:54:35 +00:00
|
|
|
u32 nodesize;
|
|
|
|
u32 sectorsize;
|
|
|
|
u32 stripesize;
|
2022-02-22 22:26:12 +00:00
|
|
|
u32 leaf_data_size;
|
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-05 01:48:07 +00:00
|
|
|
struct btrfs_mkfs_features features;
|
2017-02-01 13:17:12 +00:00
|
|
|
/* Size of the filesystem in bytes */
|
|
|
|
u64 num_bytes;
|
2019-09-24 13:21:36 +00:00
|
|
|
/* checksum algorithm to use */
|
|
|
|
enum btrfs_csum_type csum_type;
|
2021-04-26 06:27:36 +00:00
|
|
|
u64 zone_size;
|
2017-02-01 13:17:12 +00:00
|
|
|
|
|
|
|
/* Output fields, set during creation */
|
2017-02-01 13:25:18 +00:00
|
|
|
|
|
|
|
/* Logical addresses of superblock [0] and other tree roots */
|
2017-06-28 09:59:24 +00:00
|
|
|
u64 blocks[MKFS_BLOCK_COUNT + 1];
|
2023-10-03 03:46:14 +00:00
|
|
|
|
|
|
|
/* btrfs_super_block filesystem uuid */
|
2017-02-01 13:17:12 +00:00
|
|
|
char fs_uuid[BTRFS_UUID_UNPARSED_SIZE];
|
2023-10-03 03:46:14 +00:00
|
|
|
|
|
|
|
/* Set the given uuid to super block device_item. */
|
|
|
|
char dev_uuid[BTRFS_UUID_UNPARSED_SIZE];
|
2017-02-01 13:17:12 +00:00
|
|
|
char chunk_uuid[BTRFS_UUID_UNPARSED_SIZE];
|
2017-01-25 15:54:35 +00:00
|
|
|
|
2017-02-01 13:17:12 +00:00
|
|
|
/* Superblock offset after make_btrfs */
|
2017-01-25 15:54:35 +00:00
|
|
|
u64 super_bytenr;
|
|
|
|
};
|
|
|
|
|
|
|
|
int make_btrfs(int fd, struct btrfs_mkfs_config *cfg);
|
2021-04-29 22:07:15 +00:00
|
|
|
int btrfs_make_root_dir(struct btrfs_trans_handle *trans,
|
|
|
|
struct btrfs_root *root, u64 objectid);
|
2017-10-12 06:24:34 +00:00
|
|
|
u64 btrfs_min_dev_size(u32 nodesize, int mixed, u64 meta_profile,
|
|
|
|
u64 data_profile);
|
2017-10-16 08:22:56 +00:00
|
|
|
int test_minimum_size(const char *file, u64 min_dev_size);
|
2017-01-31 22:13:54 +00:00
|
|
|
int is_vol_small(const char *file);
|
|
|
|
int test_num_disk_vs_raid(u64 metadata_profile, u64 data_profile,
|
|
|
|
u64 dev_cnt, int mixed, int ssd);
|
2023-06-07 22:08:35 +00:00
|
|
|
bool test_status_for_mkfs(const char *file, bool force_overwrite);
|
|
|
|
bool test_dev_for_mkfs(const char *file, int force_overwrite);
|
2017-01-25 15:54:35 +00:00
|
|
|
|
|
|
|
#endif
|