diff --git a/common/fsfeatures.c b/common/fsfeatures.c index 469b6b17..569208a9 100644 --- a/common/fsfeatures.c +++ b/common/fsfeatures.c @@ -17,6 +17,7 @@ #include "kerncompat.h" #include #include +#include #include "common/fsfeatures.h" #include "kernel-shared/ctree.h" #include "common/utils.h" @@ -326,6 +327,25 @@ u32 get_running_kernel_version(void) return version; } +int btrfs_check_sectorsize(u32 sectorsize) +{ + u32 page_size = (u32)sysconf(_SC_PAGESIZE); + + if (!is_power_of_2(sectorsize)) { + error("invalid sectorsize %u, must be power of 2", sectorsize); + return -EINVAL; + } + if (sectorsize < SZ_4K || sectorsize > SZ_64K) { + error("invalid sectorsize %u, expected range is [4K, 64K]", + sectorsize); + return -EINVAL; + } + if (page_size != sectorsize) + warning( +"the filesystem may not be mountable, sectorsize %u doesn't match page size %u", + sectorsize, page_size); + return 0; +} int btrfs_check_nodesize(u32 nodesize, u32 sectorsize, u64 features) { diff --git a/common/fsfeatures.h b/common/fsfeatures.h index f76fc099..74ec2a21 100644 --- a/common/fsfeatures.h +++ b/common/fsfeatures.h @@ -53,5 +53,6 @@ void btrfs_parse_runtime_features_to_string(char *buf, u64 flags); void print_kernel_version(FILE *stream, u32 version); u32 get_running_kernel_version(void); int btrfs_check_nodesize(u32 nodesize, u32 sectorsize, u64 features); +int btrfs_check_sectorsize(u32 sectorsize); #endif diff --git a/mkfs/main.c b/mkfs/main.c index 3eb74821..4317cfaf 100644 --- a/mkfs/main.c +++ b/mkfs/main.c @@ -922,9 +922,8 @@ int BOX_MAIN(mkfs)(int argc, char **argv) u64 dev_block_count = 0; u64 metadata_profile = 0; u64 data_profile = 0; - u32 nodesize = max_t(u32, sysconf(_SC_PAGESIZE), - BTRFS_MKFS_DEFAULT_NODE_SIZE); - u32 sectorsize = 4096; + u32 nodesize = 0; + u32 sectorsize = 0; u32 stripesize = 4096; int zero_end = 1; int fd = -1; @@ -1092,7 +1091,14 @@ int BOX_MAIN(mkfs)(int argc, char **argv) printf("See %s for more information.\n\n", PACKAGE_URL); } - sectorsize = max(sectorsize, (u32)sysconf(_SC_PAGESIZE)); + if (!sectorsize) + sectorsize = (u32)sysconf(_SC_PAGESIZE); + if (btrfs_check_sectorsize(sectorsize)) + goto error; + + if (!nodesize) + nodesize = max_t(u32, sectorsize, BTRFS_MKFS_DEFAULT_NODE_SIZE); + stripesize = sectorsize; saved_optind = optind; dev_cnt = argc - optind;