aboutsummaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/btrfs-tools/btrfs-tools/upstream-tmp/0007-Btrfs-progs-add-support-for-mixed-data-metadata-bloc.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta/recipes-devtools/btrfs-tools/btrfs-tools/upstream-tmp/0007-Btrfs-progs-add-support-for-mixed-data-metadata-bloc.patch')
-rw-r--r--meta/recipes-devtools/btrfs-tools/btrfs-tools/upstream-tmp/0007-Btrfs-progs-add-support-for-mixed-data-metadata-bloc.patch403
1 files changed, 0 insertions, 403 deletions
diff --git a/meta/recipes-devtools/btrfs-tools/btrfs-tools/upstream-tmp/0007-Btrfs-progs-add-support-for-mixed-data-metadata-bloc.patch b/meta/recipes-devtools/btrfs-tools/btrfs-tools/upstream-tmp/0007-Btrfs-progs-add-support-for-mixed-data-metadata-bloc.patch
deleted file mode 100644
index f533c5b0b4..0000000000
--- a/meta/recipes-devtools/btrfs-tools/btrfs-tools/upstream-tmp/0007-Btrfs-progs-add-support-for-mixed-data-metadata-bloc.patch
+++ /dev/null
@@ -1,403 +0,0 @@
-Upstream-Status: Inappropriate [Backport]
-From e7ef1f26a25d06d5606934dced7b52f3e33f1d33 Mon Sep 17 00:00:00 2001
-From: Josef Bacik <josef@redhat.com>
-Date: Thu, 9 Dec 2010 18:31:08 +0000
-Subject: [PATCH 07/15] Btrfs-progs: add support for mixed data+metadata block groups
-
-So alot of crazy people (I'm looking at you Meego) want to use btrfs on phones
-and such with small devices. Unfortunately the way we split out metadata/data
-chunks it makes space usage inefficient for volumes that are smaller than
-1gigabyte. So add a -M option for mixing metadata+data, and default to this
-mixed mode if the filesystem is less than or equal to 1 gigabyte. I've tested
-this with xfstests on a 100mb filesystem and everything is a-ok.
-
-Signed-off-by: Josef Bacik <josef@redhat.com>
-Signed-off-by: Chris Mason <chris.mason@oracle.com>
----
- btrfs-vol.c | 4 +-
- btrfs_cmds.c | 13 +++++-
- ctree.h | 10 +++--
- mkfs.c | 122 +++++++++++++++++++++++++++++++++++++++++-----------------
- utils.c | 10 ++--
- utils.h | 2 +-
- 6 files changed, 112 insertions(+), 49 deletions(-)
-
-diff --git a/btrfs-vol.c b/btrfs-vol.c
-index 4ed799d..f573023 100644
---- a/btrfs-vol.c
-+++ b/btrfs-vol.c
-@@ -143,7 +143,9 @@ int main(int ac, char **av)
- exit(1);
- }
- if (cmd == BTRFS_IOC_ADD_DEV) {
-- ret = btrfs_prepare_device(devfd, device, 1, &dev_block_count);
-+ int mixed = 0;
-+
-+ ret = btrfs_prepare_device(devfd, device, 1, &dev_block_count, &mixed);
- if (ret) {
- fprintf(stderr, "Unable to init %s\n", device);
- exit(1);
-diff --git a/btrfs_cmds.c b/btrfs_cmds.c
-index 775bfe1..c21a007 100644
---- a/btrfs_cmds.c
-+++ b/btrfs_cmds.c
-@@ -720,6 +720,7 @@ int do_add_volume(int nargs, char **args)
- int devfd, res;
- u64 dev_block_count = 0;
- struct stat st;
-+ int mixed = 0;
-
- devfd = open(args[i], O_RDWR);
- if (!devfd) {
-@@ -742,7 +743,7 @@ int do_add_volume(int nargs, char **args)
- continue;
- }
-
-- res = btrfs_prepare_device(devfd, args[i], 1, &dev_block_count);
-+ res = btrfs_prepare_device(devfd, args[i], 1, &dev_block_count, &mixed);
- if (res) {
- fprintf(stderr, "ERROR: Unable to init '%s'\n", args[i]);
- close(devfd);
-@@ -920,8 +921,14 @@ int do_df_filesystem(int nargs, char **argv)
- memset(description, 0, 80);
-
- if (flags & BTRFS_BLOCK_GROUP_DATA) {
-- snprintf(description, 5, "%s", "Data");
-- written += 4;
-+ if (flags & BTRFS_BLOCK_GROUP_METADATA) {
-+ snprintf(description, 15, "%s",
-+ "Data+Metadata");
-+ written += 14;
-+ } else {
-+ snprintf(description, 5, "%s", "Data");
-+ written += 4;
-+ }
- } else if (flags & BTRFS_BLOCK_GROUP_SYSTEM) {
- snprintf(description, 7, "%s", "System");
- written += 6;
-diff --git a/ctree.h b/ctree.h
-index 962c510..ed83d02 100644
---- a/ctree.h
-+++ b/ctree.h
-@@ -352,13 +352,15 @@ struct btrfs_super_block {
- * ones specified below then we will fail to mount
- */
- #define BTRFS_FEATURE_INCOMPAT_MIXED_BACKREF (1ULL << 0)
--#define BTRFS_FEATURE_INCOMPAT_DEFAULT_SUBVOL (2ULL << 0)
-+#define BTRFS_FEATURE_INCOMPAT_DEFAULT_SUBVOL (1ULL << 1)
-+#define BTRFS_FEATURE_INCOMPAT_MIXED_GROUPS (1ULL << 2)
-
- #define BTRFS_FEATURE_COMPAT_SUPP 0ULL
- #define BTRFS_FEATURE_COMPAT_RO_SUPP 0ULL
--#define BTRFS_FEATURE_INCOMPAT_SUPP \
-- (BTRFS_FEATURE_INCOMPAT_MIXED_BACKREF | \
-- BTRFS_FEATURE_INCOMPAT_DEFAULT_SUBVOL)
-+#define BTRFS_FEATURE_INCOMPAT_SUPP \
-+ (BTRFS_FEATURE_INCOMPAT_MIXED_BACKREF | \
-+ BTRFS_FEATURE_INCOMPAT_DEFAULT_SUBVOL | \
-+ BTRFS_FEATURE_INCOMPAT_MIXED_GROUPS)
-
- /*
- * A leaf is full of items. offset and size tell us where to find
-diff --git a/mkfs.c b/mkfs.c
-index 2e99b95..04de93a 100644
---- a/mkfs.c
-+++ b/mkfs.c
-@@ -69,7 +69,7 @@ static u64 parse_size(char *s)
- return atol(s) * mult;
- }
-
--static int make_root_dir(struct btrfs_root *root)
-+static int make_root_dir(struct btrfs_root *root, int mixed)
- {
- struct btrfs_trans_handle *trans;
- struct btrfs_key location;
-@@ -88,30 +88,47 @@ static int make_root_dir(struct btrfs_root *root)
- 0, BTRFS_MKFS_SYSTEM_GROUP_SIZE);
- BUG_ON(ret);
-
-- ret = btrfs_alloc_chunk(trans, root->fs_info->extent_root,
-- &chunk_start, &chunk_size,
-- BTRFS_BLOCK_GROUP_METADATA);
-- BUG_ON(ret);
-- ret = btrfs_make_block_group(trans, root, 0,
-- BTRFS_BLOCK_GROUP_METADATA,
-- BTRFS_FIRST_CHUNK_TREE_OBJECTID,
-- chunk_start, chunk_size);
-- BUG_ON(ret);
-+ if (mixed) {
-+ ret = btrfs_alloc_chunk(trans, root->fs_info->extent_root,
-+ &chunk_start, &chunk_size,
-+ BTRFS_BLOCK_GROUP_METADATA |
-+ BTRFS_BLOCK_GROUP_DATA);
-+ BUG_ON(ret);
-+ ret = btrfs_make_block_group(trans, root, 0,
-+ BTRFS_BLOCK_GROUP_METADATA |
-+ BTRFS_BLOCK_GROUP_DATA,
-+ BTRFS_FIRST_CHUNK_TREE_OBJECTID,
-+ chunk_start, chunk_size);
-+ BUG_ON(ret);
-+ printf("Created a data/metadata chunk of size %llu\n", chunk_size);
-+ } else {
-+ ret = btrfs_alloc_chunk(trans, root->fs_info->extent_root,
-+ &chunk_start, &chunk_size,
-+ BTRFS_BLOCK_GROUP_METADATA);
-+ BUG_ON(ret);
-+ ret = btrfs_make_block_group(trans, root, 0,
-+ BTRFS_BLOCK_GROUP_METADATA,
-+ BTRFS_FIRST_CHUNK_TREE_OBJECTID,
-+ chunk_start, chunk_size);
-+ BUG_ON(ret);
-+ }
-
- root->fs_info->system_allocs = 0;
- btrfs_commit_transaction(trans, root);
- trans = btrfs_start_transaction(root, 1);
- BUG_ON(!trans);
-
-- ret = btrfs_alloc_chunk(trans, root->fs_info->extent_root,
-- &chunk_start, &chunk_size,
-- BTRFS_BLOCK_GROUP_DATA);
-- BUG_ON(ret);
-- ret = btrfs_make_block_group(trans, root, 0,
-- BTRFS_BLOCK_GROUP_DATA,
-- BTRFS_FIRST_CHUNK_TREE_OBJECTID,
-- chunk_start, chunk_size);
-- BUG_ON(ret);
-+ if (!mixed) {
-+ ret = btrfs_alloc_chunk(trans, root->fs_info->extent_root,
-+ &chunk_start, &chunk_size,
-+ BTRFS_BLOCK_GROUP_DATA);
-+ BUG_ON(ret);
-+ ret = btrfs_make_block_group(trans, root, 0,
-+ BTRFS_BLOCK_GROUP_DATA,
-+ BTRFS_FIRST_CHUNK_TREE_OBJECTID,
-+ chunk_start, chunk_size);
-+ BUG_ON(ret);
-+ }
-
- ret = btrfs_make_root_dir(trans, root->fs_info->tree_root,
- BTRFS_ROOT_TREE_DIR_OBJECTID);
-@@ -200,7 +217,7 @@ static int create_one_raid_group(struct btrfs_trans_handle *trans,
-
- static int create_raid_groups(struct btrfs_trans_handle *trans,
- struct btrfs_root *root, u64 data_profile,
-- u64 metadata_profile)
-+ u64 metadata_profile, int mixed)
- {
- u64 num_devices = btrfs_super_num_devices(&root->fs_info->super_copy);
- u64 allowed;
-@@ -215,20 +232,24 @@ static int create_raid_groups(struct btrfs_trans_handle *trans,
- allowed = BTRFS_BLOCK_GROUP_RAID0 | BTRFS_BLOCK_GROUP_RAID1;
-
- if (allowed & metadata_profile) {
-+ u64 meta_flags = BTRFS_BLOCK_GROUP_METADATA;
-+
- ret = create_one_raid_group(trans, root,
- BTRFS_BLOCK_GROUP_SYSTEM |
- (allowed & metadata_profile));
- BUG_ON(ret);
-
-- ret = create_one_raid_group(trans, root,
-- BTRFS_BLOCK_GROUP_METADATA |
-+ if (mixed)
-+ meta_flags |= BTRFS_BLOCK_GROUP_DATA;
-+
-+ ret = create_one_raid_group(trans, root, meta_flags |
- (allowed & metadata_profile));
- BUG_ON(ret);
-
- ret = recow_roots(trans, root);
- BUG_ON(ret);
- }
-- if (num_devices > 1 && (allowed & data_profile)) {
-+ if (!mixed && num_devices > 1 && (allowed & data_profile)) {
- ret = create_one_raid_group(trans, root,
- BTRFS_BLOCK_GROUP_DATA |
- (allowed & data_profile));
-@@ -274,6 +295,7 @@ static void print_usage(void)
- fprintf(stderr, "\t -l --leafsize size of btree leaves\n");
- fprintf(stderr, "\t -L --label set a label\n");
- fprintf(stderr, "\t -m --metadata metadata profile, values like data profile\n");
-+ fprintf(stderr, "\t -M --mixed mix metadata and data together\n");
- fprintf(stderr, "\t -n --nodesize size of btree nodes\n");
- fprintf(stderr, "\t -s --sectorsize min block allocation\n");
- fprintf(stderr, "%s\n", BTRFS_BUILD_VERSION);
-@@ -328,6 +350,7 @@ static struct option long_options[] = {
- { "leafsize", 1, NULL, 'l' },
- { "label", 1, NULL, 'L'},
- { "metadata", 1, NULL, 'm' },
-+ { "mixed", 0, NULL, 'M' },
- { "nodesize", 1, NULL, 'n' },
- { "sectorsize", 1, NULL, 's' },
- { "data", 1, NULL, 'd' },
-@@ -358,10 +381,13 @@ int main(int ac, char **av)
- int first_fd;
- int ret;
- int i;
-+ int mixed = 0;
-+ int data_profile_opt = 0;
-+ int metadata_profile_opt = 0;
-
- while(1) {
- int c;
-- c = getopt_long(ac, av, "A:b:l:n:s:m:d:L:V", long_options,
-+ c = getopt_long(ac, av, "A:b:l:n:s:m:d:L:VM", long_options,
- &option_index);
- if (c < 0)
- break;
-@@ -371,6 +397,7 @@ int main(int ac, char **av)
- break;
- case 'd':
- data_profile = parse_profile(optarg);
-+ data_profile_opt = 1;
- break;
- case 'l':
- leafsize = parse_size(optarg);
-@@ -380,6 +407,10 @@ int main(int ac, char **av)
- break;
- case 'm':
- metadata_profile = parse_profile(optarg);
-+ metadata_profile_opt = 1;
-+ break;
-+ case 'M':
-+ mixed = 1;
- break;
- case 'n':
- nodesize = parse_size(optarg);
-@@ -389,12 +420,10 @@ int main(int ac, char **av)
- break;
- case 'b':
- block_count = parse_size(optarg);
-- if (block_count < 256*1024*1024) {
-- fprintf(stderr, "File system size "
-- "%llu bytes is too small, "
-- "256M is required at least\n",
-- (unsigned long long)block_count);
-- exit(1);
-+ if (block_count <= 1024*1024*1024) {
-+ printf("SMALL VOLUME: forcing mixed "
-+ "metadata/data groups\n");
-+ mixed = 1;
- }
- zero_end = 0;
- break;
-@@ -439,9 +468,22 @@ int main(int ac, char **av)
- }
- first_fd = fd;
- first_file = file;
-- ret = btrfs_prepare_device(fd, file, zero_end, &dev_block_count);
-+ ret = btrfs_prepare_device(fd, file, zero_end, &dev_block_count,
-+ &mixed);
- if (block_count == 0)
- block_count = dev_block_count;
-+ if (mixed) {
-+ if (!metadata_profile_opt)
-+ metadata_profile = 0;
-+ if (!data_profile_opt)
-+ data_profile = 0;
-+
-+ if (metadata_profile != data_profile) {
-+ fprintf(stderr, "With mixed block groups data and metadata "
-+ "profiles must be the same\n");
-+ exit(1);
-+ }
-+ }
-
- blocks[0] = BTRFS_SUPER_INFO_OFFSET;
- for (i = 1; i < 7; i++) {
-@@ -459,7 +501,7 @@ int main(int ac, char **av)
- root = open_ctree(file, 0, O_RDWR);
- root->fs_info->alloc_start = alloc_start;
-
-- ret = make_root_dir(root);
-+ ret = make_root_dir(root, mixed);
- if (ret) {
- fprintf(stderr, "failed to setup the root directory\n");
- exit(1);
-@@ -478,6 +520,8 @@ int main(int ac, char **av)
-
- zero_end = 1;
- while(ac-- > 0) {
-+ int old_mixed = mixed;
-+
- file = av[optind++];
- ret = check_mounted(file);
- if (ret < 0) {
-@@ -503,8 +547,8 @@ int main(int ac, char **av)
- continue;
- }
- ret = btrfs_prepare_device(fd, file, zero_end,
-- &dev_block_count);
--
-+ &dev_block_count, &mixed);
-+ mixed = old_mixed;
- BUG_ON(ret);
-
- ret = btrfs_add_to_fsid(trans, root, fd, file, dev_block_count,
-@@ -515,12 +559,20 @@ int main(int ac, char **av)
-
- raid_groups:
- ret = create_raid_groups(trans, root, data_profile,
-- metadata_profile);
-+ metadata_profile, mixed);
- BUG_ON(ret);
-
- ret = create_data_reloc_tree(trans, root);
- BUG_ON(ret);
-
-+ if (mixed) {
-+ struct btrfs_super_block *super = &root->fs_info->super_copy;
-+ u64 flags = btrfs_super_incompat_flags(super);
-+
-+ flags |= BTRFS_FEATURE_INCOMPAT_MIXED_GROUPS;
-+ btrfs_set_super_incompat_flags(super, flags);
-+ }
-+
- printf("fs created label %s on %s\n\tnodesize %u leafsize %u "
- "sectorsize %u size %s\n",
- label, first_file, nodesize, leafsize, sectorsize,
-diff --git a/utils.c b/utils.c
-index 35e17b8..ad980ae 100644
---- a/utils.c
-+++ b/utils.c
-@@ -512,7 +512,8 @@ int btrfs_add_to_fsid(struct btrfs_trans_handle *trans,
- return 0;
- }
-
--int btrfs_prepare_device(int fd, char *file, int zero_end, u64 *block_count_ret)
-+int btrfs_prepare_device(int fd, char *file, int zero_end, u64 *block_count_ret,
-+ int *mixed)
- {
- u64 block_count;
- u64 bytenr;
-@@ -532,10 +533,9 @@ int btrfs_prepare_device(int fd, char *file, int zero_end, u64 *block_count_ret)
- }
- zero_end = 1;
-
-- if (block_count < 256 * 1024 * 1024) {
-- fprintf(stderr, "device %s is too small "
-- "(must be at least 256 MB)\n", file);
-- exit(1);
-+ if (block_count < 1024 * 1024 * 1024 && !(*mixed)) {
-+ printf("SMALL VOLUME: forcing mixed metadata/data groups\n");
-+ *mixed = 1;
- }
- ret = zero_dev_start(fd);
- if (ret) {
-diff --git a/utils.h b/utils.h
-index 9dce5b0..a28d7f4 100644
---- a/utils.h
-+++ b/utils.h
-@@ -27,7 +27,7 @@ int make_btrfs(int fd, const char *device, const char *label,
- int btrfs_make_root_dir(struct btrfs_trans_handle *trans,
- struct btrfs_root *root, u64 objectid);
- int btrfs_prepare_device(int fd, char *file, int zero_end,
-- u64 *block_count_ret);
-+ u64 *block_count_ret, int *mixed);
- int btrfs_add_to_fsid(struct btrfs_trans_handle *trans,
- struct btrfs_root *root, int fd, char *path,
- u64 block_count, u32 io_width, u32 io_align,
---
-1.7.2.3
-