mkfs.btrfs did not force mixed data/metadata groups if the size of
rootdir given by -r option is small.

 # mkdir -p /tmp/mydir
 # echo "aaa" > /tmp/mydir/myfile
 # mkfs.btrfs -f -r /tmp/mydir /dev/sdb1
 ...
 fs created label (null) on /dev/sdb1
        nodesize 16384 leafsize 16384 sectorsize 4096 size 28.00MiB
 ...

leafsize and sectorsize are different means it is not using mixed
groups.

after this patch:

 # mkfs.btrfs -f -r /tmp/mydir /dev/sdb1
 ...
 Turning ON incompat feature 'mixed-bg': mixed data and metadata block
 groups
 ...
 fs created label (null) on /dev/sdb1
        nodesize 4096 leafsize 4096 sectorsize 4096 size 28.00MiB
 ...

Also the size check in option -b is inconsistent with other similar
size checks in utils.c. Make it consistent by removing '='.

Signed-off-by: Guangyu Sun <[email protected]>
---
 mkfs.c |   21 ++++++++++++---------
 1 file changed, 12 insertions(+), 9 deletions(-)

diff --git a/mkfs.c b/mkfs.c
index 16e9222..71aea40 100644
--- a/mkfs.c
+++ b/mkfs.c
@@ -1332,11 +1332,6 @@ int main(int ac, char **av)
                                break;
                        case 'b':
                                block_count = parse_size(optarg);
-                               if (block_count <= 1024*1024*1024) {
-                                       printf("SMALL VOLUME: forcing mixed "
-                                              "metadata/data groups\n");
-                                       mixed = 1;
-                               }
                                zero_end = 0;
                                break;
                        case 'V':
@@ -1388,6 +1383,18 @@ int main(int ac, char **av)
                mixed = 1;
        }
 
+       if (source_dir_set) {
+               source_dir_size = size_sourcedir(source_dir, sectorsize,
+                                            &num_of_meta_chunks, 
&size_of_data);
+               if (block_count < source_dir_size)
+                       block_count = source_dir_size;
+       }
+
+       if (block_count && block_count < 1024 * 1024 * 1024 && !mixed) {
+               printf("SMALL VOLUME: forcing mixed metadata/data groups\n");
+               mixed = 1;
+       }
+
        /*
        * Set default profiles according to number of added devices.
        * For mixed groups defaults are single/single.
@@ -1475,10 +1482,6 @@ int main(int ac, char **av)
                }
 
                first_file = file;
-               source_dir_size = size_sourcedir(source_dir, sectorsize,
-                                            &num_of_meta_chunks, 
&size_of_data);
-               if(block_count < source_dir_size)
-                       block_count = source_dir_size;
                ret = zero_output_file(fd, block_count, sectorsize);
                if (ret) {
                        fprintf(stderr, "unable to zero the output file\n");
-- 
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to