summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mkfs.c20
-rw-r--r--utils.c29
-rw-r--r--utils.h1
3 files changed, 41 insertions, 9 deletions
diff --git a/mkfs.c b/mkfs.c
index 5d662e43..69df39b7 100644
--- a/mkfs.c
+++ b/mkfs.c
@@ -1409,6 +1409,17 @@ int main(int ac, char **av)
file = av[optind++];
ssd = is_ssd(file);
+ if (is_vol_small(file)) {
+ printf("SMALL VOLUME: forcing mixed metadata/data groups\n");
+ mixed = 1;
+ if (metadata_profile != data_profile) {
+ if (metadata_profile_opt || data_profile_opt) {
+ fprintf(stderr,
+ "With mixed block groups data and metadata profiles must be the same\n");
+ exit(1);
+ }
+ }
+ }
/*
* Set default profiles according to number of added devices.
* For mixed groups defaults are single/single.
@@ -1429,7 +1440,6 @@ int main(int ac, char **av)
BTRFS_BLOCK_GROUP_RAID0 : 0; /* raid0 or single */
}
} else {
- /* this is not needed but just for completeness */
metadata_profile = 0;
data_profile = 0;
}
@@ -1488,14 +1498,6 @@ int main(int ac, char **av)
}
- if (mixed) {
- if (metadata_profile != data_profile) {
- fprintf(stderr, "With mixed block groups data and metadata "
- "profiles must be the same\n");
- exit(1);
- }
- }
-
blocks[0] = BTRFS_SUPER_INFO_OFFSET;
for (i = 1; i < 7; i++) {
blocks[i] = BTRFS_SUPER_INFO_OFFSET + 1024 * 1024 +
diff --git a/utils.c b/utils.c
index 8121188d..d022d58a 100644
--- a/utils.c
+++ b/utils.c
@@ -1920,3 +1920,32 @@ int scan_for_btrfs(int where, int update_kernel)
}
return ret;
}
+
+int is_vol_small(char *file)
+{
+ int fd = -1;
+ int e;
+ struct stat st;
+ u64 size;
+
+ fd = open(file, O_RDONLY);
+ if (fd < 0)
+ return -errno;
+ if (fstat(fd, &st) < 0) {
+ e = -errno;
+ close(fd);
+ return e;
+ }
+ size = btrfs_device_size(fd, &st);
+ if (size == 0) {
+ close(fd);
+ return -1;
+ }
+ if (size < 1024 * 1024 * 1024) {
+ close(fd);
+ return 1;
+ } else {
+ close(fd);
+ return 0;
+ }
+}
diff --git a/utils.h b/utils.h
index 5dc1d98c..dc795f41 100644
--- a/utils.h
+++ b/utils.h
@@ -77,4 +77,5 @@ int scan_for_btrfs(int where, int update_kernel);
int get_label_mounted(const char *mount_path, char *labelp);
int test_num_disk_vs_raid(u64 metadata_profile, u64 data_profile,
u64 dev_cnt, int mixed, char *estr);
+int is_vol_small(char *file);
#endif