Add simple stripe size parameter

master v0.9
Chris Mason 2007-11-30 11:30:24 -05:00 committed by David Woodhouse
parent e3815ddde6
commit 1883251686
4 changed files with 44 additions and 10 deletions

15
ctree.h
View File

@ -122,6 +122,7 @@ struct btrfs_super_block {
__le32 sectorsize;
__le32 nodesize;
__le32 leafsize;
__le32 stripesize;
u8 root_level;
} __attribute__ ((__packed__));
@ -324,6 +325,9 @@ struct btrfs_root {
/* leaf allocations are done in leafsize units */
u32 leafsize;
/* leaf allocations are done in leafsize units */
u32 stripesize;
int ref_cows;
u32 type;
};
@ -903,6 +907,17 @@ static inline void btrfs_set_super_leafsize(struct btrfs_super_block *s,
s->leafsize = cpu_to_le32(val);
}
static inline u32 btrfs_super_stripesize(struct btrfs_super_block *s)
{
return le32_to_cpu(s->stripesize);
}
static inline void btrfs_set_super_stripesize(struct btrfs_super_block *s,
u32 val)
{
s->stripesize = cpu_to_le32(val);
}
static inline u64 btrfs_super_root_dir(struct btrfs_super_block *s)
{
return le64_to_cpu(s->root_dir_objectid);

View File

@ -320,6 +320,7 @@ static int __setup_root(struct btrfs_super_block *super,
root->sectorsize = btrfs_super_sectorsize(super);
root->nodesize = btrfs_super_nodesize(super);
root->leafsize = btrfs_super_leafsize(super);
root->stripesize = btrfs_super_stripesize(super);
root->ref_cows = 0;
root->fs_info = fs_info;
memset(&root->root_key, 0, sizeof(root->root_key));

View File

@ -372,6 +372,13 @@ int btrfs_free_extent(struct btrfs_trans_handle *trans, struct btrfs_root
return ret ? ret : pending_ret;
}
static u64 stripe_align(struct btrfs_root *root, u64 val)
{
u64 mask = ((u64)root->stripesize - 1);
u64 ret = (val + mask) & ~mask;
return ret;
}
/*
* walks the btree of allocated extents and find a hole of a given size.
* The key ins is changed to record the hole:
@ -390,6 +397,7 @@ static int find_free_extent(struct btrfs_trans_handle *trans, struct btrfs_root
u64 hole_size = 0;
int slot = 0;
u64 last_byte = 0;
u64 aligned;
int start_found;
struct btrfs_leaf *l;
struct btrfs_root * root = orig_root->fs_info->extent_root;
@ -397,6 +405,7 @@ static int find_free_extent(struct btrfs_trans_handle *trans, struct btrfs_root
if (root->fs_info->last_insert.objectid > search_start)
search_start = root->fs_info->last_insert.objectid;
search_start = stripe_align(root, search_start);
btrfs_set_key_type(ins, BTRFS_EXTENT_ITEM_KEY);
check_failed:
@ -421,13 +430,15 @@ check_failed:
if (ret < 0)
goto error;
if (!start_found) {
ins->objectid = search_start;
ins->offset = (u64)-1 - search_start;
aligned = stripe_align(root, search_start);
ins->objectid = aligned;
ins->offset = (u64)-1 - aligned;
start_found = 1;
goto check_pending;
}
ins->objectid = last_byte > search_start ?
last_byte : search_start;
ins->objectid = stripe_align(root,
last_byte > search_start ?
last_byte : search_start);
ins->offset = (u64)-1 - ins->objectid;
goto check_pending;
}
@ -438,9 +449,11 @@ check_failed:
if (start_found) {
if (last_byte < search_start)
last_byte = search_start;
hole_size = key.objectid - last_byte;
if (hole_size > total_needed) {
ins->objectid = last_byte;
aligned = stripe_align(root, last_byte);
hole_size = key.objectid - aligned;
if (key.objectid > aligned &&
hole_size > total_needed) {
ins->objectid = aligned;
ins->offset = hole_size;
goto check_pending;
}

11
mkfs.c
View File

@ -180,7 +180,7 @@ err:
}
int mkfs(int fd, char *pathname, u64 num_bytes, u32 nodesize, u32 leafsize,
u32 sectorsize)
u32 sectorsize, u32 stripesize)
{
struct btrfs_super_block super;
struct btrfs_leaf *empty_leaf;
@ -204,6 +204,7 @@ printf("blocksize is %d\n", leafsize);
btrfs_set_super_sectorsize(&super, sectorsize);
btrfs_set_super_leafsize(&super, leafsize);
btrfs_set_super_nodesize(&super, nodesize);
btrfs_set_super_stripesize(&super, stripesize);
num_bytes = (num_bytes / sectorsize) * sectorsize;
btrfs_set_super_total_bytes(&super, num_bytes);
@ -353,12 +354,13 @@ int main(int ac, char **av)
u32 leafsize = 8 * 1024;
u32 sectorsize = 4096;
u32 nodesize = 8 * 1024;
u32 stripesize = 4096;
char *buf = malloc(sectorsize);
char *realpath_name;
while(1) {
int c;
c = getopt(ac, av, "l:n:");
c = getopt(ac, av, "l:n:s:");
if (c < 0)
break;
switch(c) {
@ -368,6 +370,9 @@ int main(int ac, char **av)
case 'n':
nodesize = atol(optarg);
break;
case 's':
stripesize = atol(optarg);
break;
default:
print_usage();
}
@ -426,7 +431,7 @@ int main(int ac, char **av)
}
realpath_name = realpath(file, NULL);
ret = mkfs(fd, realpath_name, block_count, nodesize, leafsize,
sectorsize);
sectorsize, stripesize);
if (ret) {
fprintf(stderr, "error during mkfs %d\n", ret);
exit(1);