summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnand Jain <anand.jain@oracle.com>2013-08-30 16:50:37 +0800
committerChris Mason <chris.mason@fusionio.com>2013-10-16 08:20:03 -0400
commitcdbc10729266c03aeb2eb812c17a3ef6c1ceae26 (patch)
tree07f8b91940f7436f143800be36f91dcd998c919d
parent71d6bd3c8d70fb682c7fd50796f587ce1f1cf6f8 (diff)
btrfs-progs: mkfs should check for small vol well before
This fix the regression introduced by 830427d that it no more creates the FS if disk is small and if no mixed option is provided. This patch will bring it to the original design which will force mixed profile when disk is small and go ahead to create the FS. Which also means that before we open the device for the write we should also check if disk is small. v2: fixes the checkpatch.pl warnings Signed-off-by: Anand Jain <anand.jain@oracle.com> Signed-off-by: David Sterba <dsterba@suse.cz> Signed-off-by: Chris Mason <chris.mason@fusionio.com>
-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