btrfs-progs: Add new option for specify chunk root bytenr
[platform/upstream/btrfs-progs.git] / btrfs-image.c
index 6eddbd5..eba0e29 100644 (file)
@@ -733,39 +733,33 @@ static int metadump_init(struct metadump_struct *md, struct btrfs_root *root,
        int i, ret = 0;
 
        memset(md, 0, sizeof(*md));
-       pthread_cond_init(&md->cond, NULL);
-       pthread_mutex_init(&md->mutex, NULL);
+       md->cluster = calloc(1, BLOCK_SIZE);
+       if (!md->cluster)
+               return -ENOMEM;
+       md->threads = calloc(num_threads, sizeof(pthread_t));
+       if (!md->threads) {
+               free(md->cluster);
+               return -ENOMEM;
+       }
        INIT_LIST_HEAD(&md->list);
        INIT_LIST_HEAD(&md->ordered);
        md->root = root;
        md->out = out;
        md->pending_start = (u64)-1;
        md->compress_level = compress_level;
-       md->cluster = calloc(1, BLOCK_SIZE);
        md->sanitize_names = sanitize_names;
        if (sanitize_names > 1)
                crc32c_optimization_init();
 
-       if (!md->cluster) {
-               pthread_cond_destroy(&md->cond);
-               pthread_mutex_destroy(&md->mutex);
-               return -ENOMEM;
-       }
-
+       md->name_tree.rb_node = NULL;
+       md->num_threads = num_threads;
+       pthread_cond_init(&md->cond, NULL);
+       pthread_mutex_init(&md->mutex, NULL);
        meta_cluster_init(md, 0);
+
        if (!num_threads)
                return 0;
 
-       md->name_tree.rb_node = NULL;
-       md->num_threads = num_threads;
-       md->threads = calloc(num_threads, sizeof(pthread_t));
-       if (!md->threads) {
-               free(md->cluster);
-               pthread_cond_destroy(&md->cond);
-               pthread_mutex_destroy(&md->mutex);
-               return -ENOMEM;
-       }
-
        for (i = 0; i < num_threads; i++) {
                ret = pthread_create(md->threads + i, NULL, dump_worker, md);
                if (ret)
@@ -1470,8 +1464,7 @@ static int update_super(struct mdrestore_struct *mdres, u8 *buffer)
                        btrfs_set_stack_chunk_sub_stripes(chunk, 0);
                        btrfs_set_stack_chunk_type(chunk,
                                                   BTRFS_BLOCK_GROUP_SYSTEM);
-                       btrfs_set_stack_stripe_devid(&chunk->stripe,
-                                                    super->dev_item.devid);
+                       chunk->stripe.devid = super->dev_item.devid;
                        physical = logical_to_physical(mdres, key.offset,
                                                       &size);
                        if (size != (u64)-1)
@@ -1505,10 +1498,9 @@ static struct extent_buffer *alloc_dummy_eb(u64 bytenr, u32 size)
 {
        struct extent_buffer *eb;
 
-       eb = malloc(sizeof(struct extent_buffer) + size);
+       eb = calloc(1, sizeof(struct extent_buffer) + size);
        if (!eb)
                return NULL;
-       memset(eb, 0, sizeof(struct extent_buffer) + size);
 
        eb->start = bytenr;
        eb->len = size;
@@ -2479,7 +2471,7 @@ static int restore_metadump(const char *input, FILE *out, int old_restore,
        /* NOTE: open with write mode */
        if (fixup_offset) {
                BUG_ON(!target);
-               info = open_ctree_fs_info(target, 0, 0,
+               info = open_ctree_fs_info(target, 0, 0, 0,
                                          OPEN_CTREE_WRITES |
                                          OPEN_CTREE_RESTORE |
                                          OPEN_CTREE_PARTIAL);
@@ -2743,12 +2735,11 @@ int main(int argc, char *argv[])
                }
        }
 
-       argc = argc - optind;
        set_argv0(argv);
-       if (check_argc_min(argc, 2))
+       if (check_argc_min(argc - optind, 2))
                print_usage(1);
 
-       dev_cnt = argc - 1;
+       dev_cnt = argc - optind - 1;
 
        if (create) {
                if (old_restore) {
@@ -2786,11 +2777,16 @@ int main(int argc, char *argv[])
                }
        }
 
-       if ((compress_level > 0 || create == 0) &&
-           num_threads == 0) {
-               num_threads = sysconf(_SC_NPROCESSORS_ONLN);
-               if (num_threads <= 0)
-                       num_threads = 1;
+       if (compress_level > 0 || create == 0) {
+               if (num_threads == 0) {
+                       long tmp = sysconf(_SC_NPROCESSORS_ONLN);
+
+                       if (tmp <= 0)
+                               tmp = 1;
+                       num_threads = tmp;
+               }
+       } else {
+               num_threads = 0;
        }
 
        if (create) {
@@ -2821,13 +2817,12 @@ int main(int argc, char *argv[])
                u64 total_devs;
                int i;
 
-               info = open_ctree_fs_info(target, 0, 0,
+               info = open_ctree_fs_info(target, 0, 0, 0,
                                          OPEN_CTREE_PARTIAL |
                                          OPEN_CTREE_RESTORE);
                if (!info) {
-                       int e = errno;
                        fprintf(stderr, "unable to open %s error = %s\n",
-                               target, strerror(e));
+                               target, strerror(errno));
                        return 1;
                }
 
@@ -2878,5 +2873,7 @@ out:
                }
        }
 
+       btrfs_close_all_devices();
+
        return !!ret;
 }