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:
parent
94789777b9
commit
ece0e1ea03
|
@ -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
16
mkfs.c
|
@ -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)) {
|
||||||
|
|
8
utils.c
8
utils.c
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
2
utils.h
2
utils.h
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue