btrfs-progs: mkfs: move source dir size calculation to its own files
authorQu Wenruo <wqu@suse.com>
Thu, 19 Oct 2017 05:41:38 +0000 (13:41 +0800)
committerDavid Sterba <dsterba@suse.com>
Mon, 8 Jan 2018 17:11:33 +0000 (18:11 +0100)
Also rename the function from size_sourcedir() to mkfs_size_dir().

Signed-off-by: Qu Wenruo <wqu@suse.com>
Reviewed-by: Nikolay Borisov <nborisov@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
mkfs/main.c
mkfs/rootdir.c
mkfs/rootdir.h

index 2a415ae..7a9d904 100644 (file)
@@ -31,7 +31,6 @@
 #include <uuid/uuid.h>
 #include <ctype.h>
 #include <blkid/blkid.h>
-#include <ftw.h>
 #include "ctree.h"
 #include "disk-io.h"
 #include "volumes.h"
@@ -448,67 +447,6 @@ static int create_chunks(struct btrfs_trans_handle *trans,
        return ret;
 }
 
-/*
- * This ignores symlinks with unreadable targets and subdirs that can't
- * be read.  It's a best-effort to give a rough estimate of the size of
- * a subdir.  It doesn't guarantee that prepopulating btrfs from this
- * tree won't still run out of space.
- */
-static u64 global_total_size;
-static u64 fs_block_size;
-static int ftw_add_entry_size(const char *fpath, const struct stat *st,
-                             int type)
-{
-       if (type == FTW_F || type == FTW_D)
-               global_total_size += round_up(st->st_size, fs_block_size);
-
-       return 0;
-}
-
-static u64 size_sourcedir(const char *dir_name, u64 sectorsize,
-                         u64 *num_of_meta_chunks_ret, u64 *size_of_data_ret)
-{
-       u64 dir_size = 0;
-       u64 total_size = 0;
-       int ret;
-       u64 default_chunk_size = SZ_8M;
-       u64 allocated_meta_size = SZ_8M;
-       u64 allocated_total_size = 20 * SZ_1M;  /* 20MB */
-       u64 num_of_meta_chunks = 0;
-       u64 num_of_data_chunks = 0;
-       u64 num_of_allocated_meta_chunks =
-                       allocated_meta_size / default_chunk_size;
-
-       global_total_size = 0;
-       fs_block_size = sectorsize;
-       ret = ftw(dir_name, ftw_add_entry_size, 10);
-       dir_size = global_total_size;
-       if (ret < 0) {
-               error("ftw subdir walk of %s failed: %s", dir_name,
-                       strerror(errno));
-               exit(1);
-       }
-
-       num_of_data_chunks = (dir_size + default_chunk_size - 1) /
-               default_chunk_size;
-
-       num_of_meta_chunks = (dir_size / 2) / default_chunk_size;
-       if (((dir_size / 2) % default_chunk_size) != 0)
-               num_of_meta_chunks++;
-       if (num_of_meta_chunks <= num_of_allocated_meta_chunks)
-               num_of_meta_chunks = 0;
-       else
-               num_of_meta_chunks -= num_of_allocated_meta_chunks;
-
-       total_size = allocated_total_size +
-                    (num_of_data_chunks * default_chunk_size) +
-                    (num_of_meta_chunks * default_chunk_size);
-
-       *num_of_meta_chunks_ret = num_of_meta_chunks;
-       *size_of_data_ret = num_of_data_chunks * default_chunk_size;
-       return total_size;
-}
-
 static int zero_output_file(int out_fd, u64 size)
 {
        int loop_num;
@@ -1096,8 +1034,8 @@ int main(int argc, char **argv)
                        goto error;
                }
 
-               source_dir_size = size_sourcedir(source_dir, sectorsize,
-                                            &num_of_meta_chunks, &size_of_data);
+               source_dir_size = btrfs_mkfs_size_dir(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);
index 2cc8a3a..83a3191 100644 (file)
@@ -24,6 +24,7 @@
 #include <dirent.h>
 #include <unistd.h>
 #include <fcntl.h>
+#include <ftw.h>
 #include "ctree.h"
 #include "internal.h"
 #include "disk-io.h"
 #include "mkfs/rootdir.h"
 #include "send-utils.h"
 
+/*
+ * This ignores symlinks with unreadable targets and subdirs that can't
+ * be read.  It's a best-effort to give a rough estimate of the size of
+ * a subdir.  It doesn't guarantee that prepopulating btrfs from this
+ * tree won't still run out of space.
+ */
+static u64 global_total_size;
+static u64 fs_block_size;
+
 static u64 index_cnt = 2;
 
 static int add_directory_items(struct btrfs_trans_handle *trans,
@@ -670,3 +680,56 @@ fail:
 out:
        return ret;
 }
+
+static int ftw_add_entry_size(const char *fpath, const struct stat *st,
+                             int type)
+{
+       if (type == FTW_F || type == FTW_D)
+               global_total_size += round_up(st->st_size, fs_block_size);
+
+       return 0;
+}
+
+u64 btrfs_mkfs_size_dir(const char *dir_name, u64 sectorsize,
+                       u64 *num_of_meta_chunks_ret, u64 *size_of_data_ret)
+{
+       u64 dir_size = 0;
+       u64 total_size = 0;
+       int ret;
+       u64 default_chunk_size = SZ_8M;
+       u64 allocated_meta_size = SZ_8M;
+       u64 allocated_total_size = 20 * SZ_1M;  /* 20MB */
+       u64 num_of_meta_chunks = 0;
+       u64 num_of_data_chunks = 0;
+       u64 num_of_allocated_meta_chunks =
+                       allocated_meta_size / default_chunk_size;
+
+       global_total_size = 0;
+       fs_block_size = sectorsize;
+       ret = ftw(dir_name, ftw_add_entry_size, 10);
+       dir_size = global_total_size;
+       if (ret < 0) {
+               error("ftw subdir walk of %s failed: %s", dir_name,
+                       strerror(errno));
+               exit(1);
+       }
+
+       num_of_data_chunks = (dir_size + default_chunk_size - 1) /
+               default_chunk_size;
+
+       num_of_meta_chunks = (dir_size / 2) / default_chunk_size;
+       if (((dir_size / 2) % default_chunk_size) != 0)
+               num_of_meta_chunks++;
+       if (num_of_meta_chunks <= num_of_allocated_meta_chunks)
+               num_of_meta_chunks = 0;
+       else
+               num_of_meta_chunks -= num_of_allocated_meta_chunks;
+
+       total_size = allocated_total_size +
+                    (num_of_data_chunks * default_chunk_size) +
+                    (num_of_meta_chunks * default_chunk_size);
+
+       *num_of_meta_chunks_ret = num_of_meta_chunks;
+       *size_of_data_ret = num_of_data_chunks * default_chunk_size;
+       return total_size;
+}
index 015e5ad..c4b120c 100644 (file)
@@ -30,5 +30,7 @@ struct directory_name_entry {
 
 int btrfs_mkfs_fill_dir(const char *source_dir, struct btrfs_root *root,
                        bool verbose);
+u64 btrfs_mkfs_size_dir(const char *dir_name, u64 sectorsize,
+                       u64 *num_of_meta_chunks_ret, u64 *size_of_data_ret);
 
 #endif