Add some check for sectorsize and nodesize, make it consistent with kernel.
Signed-off-by: Gu Jinxiang <g...@cn.fujitsu.com> --- convert/main.c | 6 +----- fsfeatures.h | 2 +- mkfs/main.c | 8 +------- utils.c | 21 +++++++++++++++++++-- 4 files changed, 22 insertions(+), 15 deletions(-) diff --git a/convert/main.c b/convert/main.c index 4f65765..bcadcfa 100644 --- a/convert/main.c +++ b/convert/main.c @@ -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) { diff --git a/fsfeatures.h b/fsfeatures.h index 513ed1e..fa8fb14 100644 --- a/fsfeatures.h +++ b/fsfeatures.h @@ -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 diff --git a/mkfs/main.c b/mkfs/main.c index 2b109a5..7a25f01 100644 --- a/mkfs/main.c +++ b/mkfs/main.c @@ -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", diff --git a/utils.c b/utils.c index 243ee1e..c276b58 100644 --- a/utils.c +++ b/utils.c @@ -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; -- 2.9.4 -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html