summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQu Wenruo <quwenruo@cn.fujitsu.com>2015-09-25 18:15:44 +0200
committerDavid Sterba <dsterba@suse.com>2015-10-02 17:54:04 +0200
commitece0e1ea036e6d1c952f304ff74762a12786c37f (patch)
treebba6fb117552bb74b000b84e9de7deb85bde5cc4
parent94789777b9e8f350ba815b07baa5383e99cd1944 (diff)
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>
-rw-r--r--btrfs-convert.c2
-rw-r--r--mkfs.c16
-rw-r--r--utils.c8
-rw-r--r--utils.h2
4 files changed, 14 insertions, 14 deletions
diff --git a/btrfs-convert.c b/btrfs-convert.c
index e7f3c9e1..802930c9 100644
--- a/btrfs-convert.c
+++ b/btrfs-convert.c
@@ -2319,7 +2319,7 @@ static int do_convert(const char *devname, int datacsum, int packing, int noxatt
fprintf(stderr, "filetype feature is missing\n");
goto fail;
}
- if (btrfs_check_nodesize(nodesize, blocksize))
+ if (btrfs_check_nodesize(nodesize, blocksize, features))
goto fail;
blocks_per_node = nodesize / blocksize;
ret = -blocks_per_node;
diff --git a/mkfs.c b/mkfs.c
index 14e7eb40..b8879fcf 100644
--- a/mkfs.c
+++ b/mkfs.c
@@ -1466,9 +1466,8 @@ int main(int ac, char **av)
print_usage(c != GETOPT_VAL_HELP);
}
}
+
sectorsize = max(sectorsize, (u32)sysconf(_SC_PAGESIZE));
- if (btrfs_check_nodesize(nodesize, sectorsize))
- exit(1);
saved_optind = optind;
dev_cnt = ac - optind;
if (dev_cnt == 0)
@@ -1542,17 +1541,12 @@ int main(int ac, char **av)
}
}
- if (!nodesize_forced) {
+ if (!nodesize_forced)
nodesize = best_nodesize;
- if (btrfs_check_nodesize(nodesize, sectorsize))
- exit(1);
- }
- if (nodesize != sectorsize) {
- fprintf(stderr, "Error: mixed metadata/data block groups "
- "require metadata blocksizes equal to the sectorsize\n");
- exit(1);
- }
}
+ if (btrfs_check_nodesize(nodesize, sectorsize,
+ features))
+ exit(1);
/* Check device/block_count after the nodesize is determined */
if (block_count && block_count < btrfs_min_dev_size(nodesize)) {
diff --git a/utils.c b/utils.c
index bb4091ec..0f8f91dd 100644
--- a/utils.c
+++ b/utils.c
@@ -2928,7 +2928,7 @@ int btrfs_tree_search2_ioctl_supported(int fd)
return v2_supported;
}
-int btrfs_check_nodesize(u32 nodesize, u32 sectorsize)
+int btrfs_check_nodesize(u32 nodesize, u32 sectorsize, u64 features)
{
if (nodesize < sectorsize) {
fprintf(stderr,
@@ -2945,6 +2945,12 @@ int btrfs_check_nodesize(u32 nodesize, u32 sectorsize)
"ERROR: Illegal nodesize %u (not aligned to %u)\n",
nodesize, sectorsize);
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;
}
diff --git a/utils.h b/utils.h
index 93e1de6b..192f3d1c 100644
--- a/utils.h
+++ b/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_check_nodesize(u32 nodesize, u32 sectorsize);
+int btrfs_check_nodesize(u32 nodesize, u32 sectorsize, u64 features);
const char *get_argv0_buf(void);