Add mkfs.btrfs -A offset to control allocation start on devices
authorChris Mason <chris.mason@oracle.com>
Fri, 25 Apr 2008 20:55:21 +0000 (16:55 -0400)
committerDavid Woodhouse <dwmw2@hera.kernel.org>
Fri, 25 Apr 2008 20:55:21 +0000 (16:55 -0400)
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.

ctree.h
mkfs.c
volumes.c

diff --git a/ctree.h b/ctree.h
index 8de4608..d285344 100644 (file)
--- a/ctree.h
+++ b/ctree.h
@@ -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;
diff --git a/mkfs.c b/mkfs.c
index 7317bcd..ac81ab5 100644 (file)
--- a/mkfs.c
+++ b/mkfs.c
@@ -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)
index 0a9ee02..2d04f64 100644 (file)
--- a/volumes.c
+++ b/volumes.c
@@ -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;