btrfs-progs: mkfs: refactor how we handle sectorsize override
There are several problems for current sectorsize check: - No check at all for sectorsize This means you can even specify "-s 62k". - No way to specify sectorsize smaller than page size Fix all these problems by: - Introduce btrfs_check_sectorsize() To do: * power of 2 check for sectorsize * lower and upper boundary check for sectorsize * warn about sectorsize mismatch with page size - Remove the max() between page size and sectorsize This allows us to override the sectorsize for 64K page systems. - Make nodesize calculation based on sectorsize No need to use page size any more. Users who specify sectorsize manually really know what they are doing, and we have warned them already. Signed-off-by: Qu Wenruo <wqu@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
3cbb2d630b
commit
90020a7605
|
@ -17,6 +17,7 @@
|
|||
#include "kerncompat.h"
|
||||
#include <sys/utsname.h>
|
||||
#include <linux/version.h>
|
||||
#include <unistd.h>
|
||||
#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)
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
14
mkfs/main.c
14
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;
|
||||
|
|
Loading…
Reference in New Issue