@@ -1221,11 +1221,7 @@ static int do_convert(const char *devname, u32 convert_flags, u32 nodesize,
blocksize = cctx.blocksize;
total_bytes = (u64)blocksize * (u64)cctx.block_count;
- if (blocksize < 4096) {
- error("block size is too small: %u < 4096", blocksize);
- goto fail;
- }
- if (btrfs_check_nodesize(nodesize, blocksize, features))
+ if (btrfs_check_sizes(nodesize, blocksize, features))
goto fail;
fd = open(devname, O_RDWR);
if (fd < 0) {
@@ -45,6 +45,6 @@ void btrfs_process_fs_features(u64 flags);
void btrfs_parse_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_sizes(u32 nodesize, u32 sectorsize, u64 features);
#endif
@@ -1626,16 +1626,10 @@ int main(int argc, char **argv)
features |= BTRFS_FEATURE_INCOMPAT_RAID56;
}
- if (btrfs_check_nodesize(nodesize, sectorsize,
+ if (btrfs_check_sizes(nodesize, sectorsize,
features))
exit(1);
- if (sectorsize < sizeof(struct btrfs_super_block)) {
- error("sectorsize smaller than superblock: %u < %zu",
- sectorsize, sizeof(struct btrfs_super_block));
- exit(1);
- }
-
/* Check device/block_count after the nodesize is determined */
if (block_count && block_count < btrfs_min_dev_size(nodesize)) {
error("size %llu is too small to make a usable filesystem",
@@ -2120,9 +2120,26 @@ int btrfs_tree_search2_ioctl_supported(int fd)
return ret;
}
-int btrfs_check_nodesize(u32 nodesize, u32 sectorsize, u64 features)
+int btrfs_check_sizes(u32 nodesize, u32 sectorsize, u64 features)
{
- if (nodesize < sectorsize) {
+ /* check sectorsize */
+ if (!is_power_of_2(sectorsize)) {
+ error("illegal sectorsize %u (not power of 2)", sectorsize);
+ return -1;
+ } else if (sectorsize < SZ_4K) {
+ error("illegal sectorsize %u (smaller than %u)",
+ sectorsize, SZ_4K);
+ return -1;
+ } else if (sectorsize > BTRFS_MAX_METADATA_BLOCKSIZE) {
+ error("illegal sectorsize %u (larger than %u)",
+ sectorsize, BTRFS_MAX_METADATA_BLOCKSIZE);
+ return -1;
+ }
+ /* check nodesize */
+ if (!is_power_of_2(nodesize)) {
+ error("illegal nodesize %u (not power of 2)", nodesize);
+ return -1;
+ } else if (nodesize < sectorsize) {
error("illegal nodesize %u (smaller than %u)",
nodesize, sectorsize);
return -1;
Add some check for sectorsize and nodesize, make it consistent with kernel. Signed-off-by: Gu Jinxiang <gujx@cn.fujitsu.com> --- convert/main.c | 6 +----- fsfeatures.h | 2 +- mkfs/main.c | 8 +------- utils.c | 21 +++++++++++++++++++-- 4 files changed, 22 insertions(+), 15 deletions(-)