struct btrfs_root *root;
FILE *out;
- struct meta_cluster *cluster;
+ union {
+ struct meta_cluster cluster;
+ char meta_cluster_bytes[BLOCK_SIZE];
+ };
- pthread_t *threads;
+ pthread_t threads[MAX_WORKER_THREADS];
size_t num_threads;
pthread_mutex_t mutex;
pthread_cond_t cond;
FILE *in;
FILE *out;
- pthread_t *threads;
+ pthread_t threads[MAX_WORKER_THREADS];
size_t num_threads;
pthread_mutex_t mutex;
pthread_cond_t cond;
md->num_items = 0;
md->num_ready = 0;
- header = &md->cluster->header;
+ header = &md->cluster.header;
header->magic = cpu_to_le64(HEADER_MAGIC);
header->bytenr = cpu_to_le64(start);
header->nritems = cpu_to_le32(0);
free(name->sub);
free(name);
}
- free(md->threads);
- free(md->cluster);
}
static int metadump_init(struct metadump_struct *md, struct btrfs_root *root,
int i, ret = 0;
memset(md, 0, sizeof(*md));
- 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;
static int write_buffers(struct metadump_struct *md, u64 *next)
{
- struct meta_cluster_header *header = &md->cluster->header;
+ struct meta_cluster_header *header = &md->cluster.header;
struct meta_cluster_item *item;
struct async_work *async;
u64 bytenr = 0;
/* setup and write index block */
list_for_each_entry(async, &md->ordered, ordered) {
- item = md->cluster->items + nritems;
+ item = &md->cluster.items[nritems];
item->bytenr = cpu_to_le64(async->start);
item->size = cpu_to_le32(async->bufsize);
nritems++;
}
header->nritems = cpu_to_le32(nritems);
- ret = fwrite(md->cluster, BLOCK_SIZE, 1, md->out);
+ ret = fwrite(&md->cluster, BLOCK_SIZE, 1, md->out);
if (ret != 1) {
error("unable to write out cluster: %s", strerror(errno));
return -errno;
pthread_cond_destroy(&mdres->cond);
pthread_mutex_destroy(&mdres->mutex);
- free(mdres->threads);
}
static int mdrestore_init(struct mdrestore_struct *mdres,
return 0;
mdres->num_threads = num_threads;
- mdres->threads = calloc(num_threads, sizeof(pthread_t));
- if (!mdres->threads)
- return -ENOMEM;
for (i = 0; i < num_threads; i++) {
- ret = pthread_create(mdres->threads + i, NULL, restore_worker,
+ ret = pthread_create(&mdres->threads[i], NULL, restore_worker,
mdres);
if (ret) {
/* pthread_create returns errno directly */