diff options
author | Chris Mason <chris.mason@oracle.com> | 2008-04-25 16:55:21 -0400 |
---|---|---|
committer | David Woodhouse <dwmw2@hera.kernel.org> | 2008-04-25 16:55:21 -0400 |
commit | 083faf794fd87a7897545a2a16a15599f62beffb (patch) | |
tree | 6ad1c8046d93fefd2e0614da0137f6f1f8294260 | |
parent | 4415143185b8c3ac799301a72a9cdbbd746fc723 (diff) |
Add mkfs.btrfs -A offset to control allocation start on devices
This is a utility option for the resizer, it makes sure to allocate
at offset bytes in the disk or higher. It ensures the resizer will have
something to move when testing it.
-rw-r--r-- | ctree.h | 1 | ||||
-rw-r--r-- | mkfs.c | 8 | ||||
-rw-r--r-- | volumes.c | 4 |
3 files changed, 12 insertions, 1 deletions
@@ -501,6 +501,7 @@ struct btrfs_fs_info { u64 data_alloc_profile; u64 metadata_alloc_profile; u64 system_alloc_profile; + u64 alloc_start; struct btrfs_trans_handle *running_transaction; struct btrfs_super_block super_copy; @@ -280,6 +280,7 @@ static char *parse_label(char *input) } static struct option long_options[] = { + { "alloc-start", 1, NULL, 'A'}, { "byte-count", 1, NULL, 'b' }, { "leafsize", 1, NULL, 'l' }, { "label", 1, NULL, 'L'}, @@ -300,6 +301,7 @@ int main(int ac, char **av) u64 block_count = 0; u64 dev_block_count = 0; u64 blocks[6]; + u64 alloc_start; u64 metadata_profile = BTRFS_BLOCK_GROUP_RAID1 | BTRFS_BLOCK_GROUP_DUP; u64 data_profile = BTRFS_BLOCK_GROUP_RAID0; u32 leafsize = getpagesize(); @@ -315,11 +317,14 @@ int main(int ac, char **av) while(1) { int c; - c = getopt_long(ac, av, "b:l:n:s:m:d:L:", long_options, + c = getopt_long(ac, av, "A:b:l:n:s:m:d:L:", long_options, &option_index); if (c < 0) break; switch(c) { + case 'A': + alloc_start = parse_size(optarg); + break; case 'd': data_profile = parse_profile(optarg); break; @@ -397,6 +402,7 @@ int main(int ac, char **av) exit(1); } root = open_ctree(file, 0); + root->fs_info->alloc_start = alloc_start; trans = btrfs_start_transaction(root, 1); if (ac == 0) @@ -252,6 +252,10 @@ static int find_free_dev_extent(struct btrfs_trans_handle *trans, * so we make sure to start at an offset of at least 1MB */ search_start = max((u64)1024 * 1024, search_start); + + if (root->fs_info->alloc_start + num_bytes <= device->total_bytes) + search_start = max(root->fs_info->alloc_start, search_start); + key.objectid = device->devid; key.offset = search_start; key.type = BTRFS_DEV_EXTENT_KEY; |