btrfs-progs: utils: Check nodesize against features

Check nodesize against features, not only sectorsize.
In fact, one of the btrfs-convert and mkfs differs in the nodesize
check.

This patch also provides the basis for later btrfs-convert fix.

Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com>
Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
Qu Wenruo 2015-09-25 18:15:44 +02:00 committed by David Sterba
parent 94789777b9
commit ece0e1ea03
4 changed files with 14 additions and 14 deletions

View File

@ -2319,7 +2319,7 @@ static int do_convert(const char *devname, int datacsum, int packing, int noxatt
fprintf(stderr, "filetype feature is missing\n"); fprintf(stderr, "filetype feature is missing\n");
goto fail; goto fail;
} }
if (btrfs_check_nodesize(nodesize, blocksize)) if (btrfs_check_nodesize(nodesize, blocksize, features))
goto fail; goto fail;
blocks_per_node = nodesize / blocksize; blocks_per_node = nodesize / blocksize;
ret = -blocks_per_node; ret = -blocks_per_node;

16
mkfs.c
View File

@ -1466,9 +1466,8 @@ int main(int ac, char **av)
print_usage(c != GETOPT_VAL_HELP); print_usage(c != GETOPT_VAL_HELP);
} }
} }
sectorsize = max(sectorsize, (u32)sysconf(_SC_PAGESIZE)); sectorsize = max(sectorsize, (u32)sysconf(_SC_PAGESIZE));
if (btrfs_check_nodesize(nodesize, sectorsize))
exit(1);
saved_optind = optind; saved_optind = optind;
dev_cnt = ac - optind; dev_cnt = ac - optind;
if (dev_cnt == 0) if (dev_cnt == 0)
@ -1542,17 +1541,12 @@ int main(int ac, char **av)
} }
} }
if (!nodesize_forced) { if (!nodesize_forced)
nodesize = best_nodesize; nodesize = best_nodesize;
if (btrfs_check_nodesize(nodesize, sectorsize)) }
if (btrfs_check_nodesize(nodesize, sectorsize,
features))
exit(1); exit(1);
}
if (nodesize != sectorsize) {
fprintf(stderr, "Error: mixed metadata/data block groups "
"require metadata blocksizes equal to the sectorsize\n");
exit(1);
}
}
/* Check device/block_count after the nodesize is determined */ /* Check device/block_count after the nodesize is determined */
if (block_count && block_count < btrfs_min_dev_size(nodesize)) { if (block_count && block_count < btrfs_min_dev_size(nodesize)) {

View File

@ -2928,7 +2928,7 @@ int btrfs_tree_search2_ioctl_supported(int fd)
return v2_supported; return v2_supported;
} }
int btrfs_check_nodesize(u32 nodesize, u32 sectorsize) int btrfs_check_nodesize(u32 nodesize, u32 sectorsize, u64 features)
{ {
if (nodesize < sectorsize) { if (nodesize < sectorsize) {
fprintf(stderr, fprintf(stderr,
@ -2945,6 +2945,12 @@ int btrfs_check_nodesize(u32 nodesize, u32 sectorsize)
"ERROR: Illegal nodesize %u (not aligned to %u)\n", "ERROR: Illegal nodesize %u (not aligned to %u)\n",
nodesize, sectorsize); nodesize, sectorsize);
return -1; return -1;
} else if (features & BTRFS_FEATURE_INCOMPAT_MIXED_GROUPS &&
nodesize != sectorsize) {
fprintf(stderr,
"ERROR: Illegal nodesize %u (not equal to %u for mixed block group)\n",
nodesize, sectorsize);
return -1;
} }
return 0; return 0;
} }

View File

@ -242,7 +242,7 @@ static inline u64 div_factor(u64 num, int factor)
} }
int btrfs_tree_search2_ioctl_supported(int fd); int btrfs_tree_search2_ioctl_supported(int fd);
int btrfs_check_nodesize(u32 nodesize, u32 sectorsize); int btrfs_check_nodesize(u32 nodesize, u32 sectorsize, u64 features);
const char *get_argv0_buf(void); const char *get_argv0_buf(void);