summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Mason <chris.mason@fusionio.com>2013-11-08 13:51:52 -0500
committerChris Mason <chris.mason@fusionio.com>2013-11-08 13:51:52 -0500
commitc652e4efb8e2dd76ef1627d8cd649c6af5905902 (patch)
treeba667f15a917328daaeac9a87c17ae400de73cb8
parent06ceeb209ecaefb5dc0e9ac1cc31501c49ca9594 (diff)
mkfs: change default metadata blocksize to 16KB
16KB is faster and leads to less metadata fragmentation in almost all workloads. It does slightly increase lock contention on the root nodes in some workloads, but that is best dealt with by adding more subvolumes (for now). This uses 16KB or the page size, whichever is bigger. If you're doing a mixed block group mkfs, it uses the sectorsize instead. Since the kernel refuses to mount a mixed block group FS where the metadata leaf size doesn't match the data sectorsize, this also adds a similar check during mkfs. Signed-off-by: Chris Mason <chris.mason@fusionio.com>
-rw-r--r--mkfs.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/mkfs.c b/mkfs.c
index bf8a831d..cd0af9ef 100644
--- a/mkfs.c
+++ b/mkfs.c
@@ -46,6 +46,8 @@
static u64 index_cnt = 2;
+#define DEFAULT_MKFS_LEAF_SIZE 16384
+
struct directory_name_entry {
char *dir_name;
char *path;
@@ -1222,7 +1224,7 @@ int main(int ac, char **av)
u64 alloc_start = 0;
u64 metadata_profile = 0;
u64 data_profile = 0;
- u32 leafsize = sysconf(_SC_PAGESIZE);
+ u32 leafsize = max_t(u32, sysconf(_SC_PAGESIZE), DEFAULT_MKFS_LEAF_SIZE);
u32 sectorsize = 4096;
u32 nodesize = leafsize;
u32 stripesize = 4096;
@@ -1232,6 +1234,7 @@ int main(int ac, char **av)
int ret;
int i;
int mixed = 0;
+ int leaf_forced = 0;
int data_profile_opt = 0;
int metadata_profile_opt = 0;
int discard = 1;
@@ -1269,6 +1272,7 @@ int main(int ac, char **av)
case 'n':
nodesize = parse_size(optarg);
leafsize = parse_size(optarg);
+ leaf_forced = 1;
break;
case 'L':
label = parse_label(optarg);
@@ -1386,8 +1390,21 @@ int main(int ac, char **av)
BTRFS_BLOCK_GROUP_RAID0 : 0; /* raid0 or single */
}
} else {
+ u32 best_leafsize = max_t(u32, sysconf(_SC_PAGESIZE), sectorsize);
metadata_profile = 0;
data_profile = 0;
+
+ if (!leaf_forced) {
+ leafsize = best_leafsize;
+ nodesize = best_leafsize;
+ if (check_leaf_or_node_size(leafsize, sectorsize))
+ exit(1);
+ }
+ if (leafsize != sectorsize) {
+ fprintf(stderr, "Error: mixed metadata/data block groups "
+ "require metadata blocksizes equal to the sectorsize\n");
+ exit(1);
+ }
}
ret = test_num_disk_vs_raid(metadata_profile, data_profile,