btrfs-progs: mkfs: handle block ordering errors in make_btrfs
[platform/upstream/btrfs-progs.git] / utils.c
1 /*
2  * Copyright (C) 2007 Oracle.  All rights reserved.
3  * Copyright (C) 2008 Morey Roof.  All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public
7  * License v2 as published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public
15  * License along with this program; if not, write to the
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA 021110-1307, USA.
18  */
19
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include <string.h>
23 #include <sys/ioctl.h>
24 #include <sys/mount.h>
25 #include <sys/types.h>
26 #include <sys/stat.h>
27 #include <uuid/uuid.h>
28 #include <fcntl.h>
29 #include <unistd.h>
30 #include <mntent.h>
31 #include <ctype.h>
32 #include <linux/loop.h>
33 #include <linux/major.h>
34 #include <linux/kdev_t.h>
35 #include <limits.h>
36 #include <blkid/blkid.h>
37 #include <sys/vfs.h>
38 #include <sys/statfs.h>
39 #include <linux/magic.h>
40 #include <getopt.h>
41
42 #include "kerncompat.h"
43 #include "radix-tree.h"
44 #include "ctree.h"
45 #include "disk-io.h"
46 #include "transaction.h"
47 #include "crc32c.h"
48 #include "utils.h"
49 #include "volumes.h"
50 #include "ioctl.h"
51 #include "commands.h"
52
53 #ifndef BLKDISCARD
54 #define BLKDISCARD      _IO(0x12,119)
55 #endif
56
57 static int btrfs_scan_done = 0;
58
59 static char argv0_buf[ARGV0_BUF_SIZE] = "btrfs";
60
61 static int rand_seed_initlized = 0;
62 static unsigned short rand_seed[3];
63
64 const char *get_argv0_buf(void)
65 {
66         return argv0_buf;
67 }
68
69 void fixup_argv0(char **argv, const char *token)
70 {
71         int len = strlen(argv0_buf);
72
73         snprintf(argv0_buf + len, sizeof(argv0_buf) - len, " %s", token);
74         argv[0] = argv0_buf;
75 }
76
77 void set_argv0(char **argv)
78 {
79         strncpy(argv0_buf, argv[0], sizeof(argv0_buf));
80         argv0_buf[sizeof(argv0_buf) - 1] = 0;
81 }
82
83 int check_argc_exact(int nargs, int expected)
84 {
85         if (nargs < expected)
86                 fprintf(stderr, "%s: too few arguments\n", argv0_buf);
87         if (nargs > expected)
88                 fprintf(stderr, "%s: too many arguments\n", argv0_buf);
89
90         return nargs != expected;
91 }
92
93 int check_argc_min(int nargs, int expected)
94 {
95         if (nargs < expected) {
96                 fprintf(stderr, "%s: too few arguments\n", argv0_buf);
97                 return 1;
98         }
99
100         return 0;
101 }
102
103 int check_argc_max(int nargs, int expected)
104 {
105         if (nargs > expected) {
106                 fprintf(stderr, "%s: too many arguments\n", argv0_buf);
107                 return 1;
108         }
109
110         return 0;
111 }
112
113
114 /*
115  * Discard the given range in one go
116  */
117 static int discard_range(int fd, u64 start, u64 len)
118 {
119         u64 range[2] = { start, len };
120
121         if (ioctl(fd, BLKDISCARD, &range) < 0)
122                 return errno;
123         return 0;
124 }
125
126 /*
127  * Discard blocks in the given range in 1G chunks, the process is interruptible
128  */
129 static int discard_blocks(int fd, u64 start, u64 len)
130 {
131         while (len > 0) {
132                 /* 1G granularity */
133                 u64 chunk_size = min_t(u64, len, 1*1024*1024*1024);
134                 int ret;
135
136                 ret = discard_range(fd, start, chunk_size);
137                 if (ret)
138                         return ret;
139                 len -= chunk_size;
140                 start += chunk_size;
141         }
142
143         return 0;
144 }
145
146 static u64 reference_root_table[] = {
147         [1] =   BTRFS_ROOT_TREE_OBJECTID,
148         [2] =   BTRFS_EXTENT_TREE_OBJECTID,
149         [3] =   BTRFS_CHUNK_TREE_OBJECTID,
150         [4] =   BTRFS_DEV_TREE_OBJECTID,
151         [5] =   BTRFS_FS_TREE_OBJECTID,
152         [6] =   BTRFS_CSUM_TREE_OBJECTID,
153 };
154
155 int test_uuid_unique(char *fs_uuid)
156 {
157         int unique = 1;
158         blkid_dev_iterate iter = NULL;
159         blkid_dev dev = NULL;
160         blkid_cache cache = NULL;
161
162         if (blkid_get_cache(&cache, NULL) < 0) {
163                 printf("ERROR: lblkid cache get failed\n");
164                 return 1;
165         }
166         blkid_probe_all(cache);
167         iter = blkid_dev_iterate_begin(cache);
168         blkid_dev_set_search(iter, "UUID", fs_uuid);
169
170         while (blkid_dev_next(iter, &dev) == 0) {
171                 dev = blkid_verify(cache, dev);
172                 if (dev) {
173                         unique = 0;
174                         break;
175                 }
176         }
177
178         blkid_dev_iterate_end(iter);
179         blkid_put_cache(cache);
180
181         return unique;
182 }
183
184 /*
185  * Reserve space from free_tree.
186  * The algorithm is very simple, find the first cache_extent with enough space
187  * and allocate from its beginning.
188  */
189 static int reserve_free_space(struct cache_tree *free_tree, u64 len,
190                               u64 *ret_start)
191 {
192         struct cache_extent *cache;
193         int found = 0;
194
195         ASSERT(ret_start != NULL);
196         cache = first_cache_extent(free_tree);
197         while (cache) {
198                 if (cache->size > len) {
199                         found = 1;
200                         *ret_start = cache->start;
201
202                         cache->size -= len;
203                         if (cache->size == 0) {
204                                 remove_cache_extent(free_tree, cache);
205                                 free(cache);
206                         } else {
207                                 cache->start += len;
208                         }
209                         break;
210                 }
211                 cache = next_cache_extent(cache);
212         }
213         if (!found)
214                 return -ENOSPC;
215         return 0;
216 }
217
218 static inline int write_temp_super(int fd, struct btrfs_super_block *sb,
219                                    u64 sb_bytenr)
220 {
221         u32 crc = ~(u32)0;
222         int ret;
223
224         crc = btrfs_csum_data(NULL, (char *)sb + BTRFS_CSUM_SIZE, crc,
225                               BTRFS_SUPER_INFO_SIZE - BTRFS_CSUM_SIZE);
226         btrfs_csum_final(crc, (char *)&sb->csum[0]);
227         ret = pwrite(fd, sb, BTRFS_SUPER_INFO_SIZE, sb_bytenr);
228         if (ret < BTRFS_SUPER_INFO_SIZE)
229                 ret = (ret < 0 ? -errno : -EIO);
230         else
231                 ret = 0;
232         return ret;
233 }
234
235 /*
236  * Setup temporary superblock at cfg->super_bynter
237  * Needed info are extracted from cfg, and root_bytenr, chunk_bytenr
238  *
239  * For now sys chunk array will be empty and dev_item is empty too.
240  * They will be re-initialized at temp chunk tree setup.
241  *
242  * The superblock signature is not valid, denotes a partially created
243  * filesystem, needs to be finalized.
244  */
245 static int setup_temp_super(int fd, struct btrfs_mkfs_config *cfg,
246                             u64 root_bytenr, u64 chunk_bytenr)
247 {
248         unsigned char chunk_uuid[BTRFS_UUID_SIZE];
249         char super_buf[BTRFS_SUPER_INFO_SIZE];
250         struct btrfs_super_block *super = (struct btrfs_super_block *)super_buf;
251         int ret;
252
253         memset(super_buf, 0, BTRFS_SUPER_INFO_SIZE);
254         cfg->num_bytes = round_down(cfg->num_bytes, cfg->sectorsize);
255
256         if (*cfg->fs_uuid) {
257                 if (uuid_parse(cfg->fs_uuid, super->fsid) != 0) {
258                         error("cound not parse UUID: %s", cfg->fs_uuid);
259                         ret = -EINVAL;
260                         goto out;
261                 }
262                 if (!test_uuid_unique(cfg->fs_uuid)) {
263                         error("non-unique UUID: %s", cfg->fs_uuid);
264                         ret = -EINVAL;
265                         goto out;
266                 }
267         } else {
268                 uuid_generate(super->fsid);
269                 uuid_unparse(super->fsid, cfg->fs_uuid);
270         }
271         uuid_generate(chunk_uuid);
272         uuid_unparse(chunk_uuid, cfg->chunk_uuid);
273
274         btrfs_set_super_bytenr(super, cfg->super_bytenr);
275         btrfs_set_super_num_devices(super, 1);
276         btrfs_set_super_magic(super, BTRFS_MAGIC_PARTIAL);
277         btrfs_set_super_generation(super, 1);
278         btrfs_set_super_root(super, root_bytenr);
279         btrfs_set_super_chunk_root(super, chunk_bytenr);
280         btrfs_set_super_total_bytes(super, cfg->num_bytes);
281         /*
282          * Temporary filesystem will only have 6 tree roots:
283          * chunk tree, root tree, extent_tree, device tree, fs tree
284          * and csum tree.
285          */
286         btrfs_set_super_bytes_used(super, 6 * cfg->nodesize);
287         btrfs_set_super_sectorsize(super, cfg->sectorsize);
288         btrfs_set_super_leafsize(super, cfg->nodesize);
289         btrfs_set_super_nodesize(super, cfg->nodesize);
290         btrfs_set_super_stripesize(super, cfg->stripesize);
291         btrfs_set_super_csum_type(super, BTRFS_CSUM_TYPE_CRC32);
292         btrfs_set_super_chunk_root(super, chunk_bytenr);
293         btrfs_set_super_cache_generation(super, -1);
294         btrfs_set_super_incompat_flags(super, cfg->features);
295         if (cfg->label)
296                 __strncpy_null(super->label, cfg->label, BTRFS_LABEL_SIZE - 1);
297
298         /* Sys chunk array will be re-initialized at chunk tree init time */
299         super->sys_chunk_array_size = 0;
300
301         ret = write_temp_super(fd, super, cfg->super_bytenr);
302 out:
303         return ret;
304 }
305
306 /*
307  * Setup an extent buffer for tree block.
308  */
309 static int setup_temp_extent_buffer(struct extent_buffer *buf,
310                                     struct btrfs_mkfs_config *cfg,
311                                     u64 bytenr, u64 owner)
312 {
313         unsigned char fsid[BTRFS_FSID_SIZE];
314         unsigned char chunk_uuid[BTRFS_UUID_SIZE];
315         int ret;
316
317         ret = uuid_parse(cfg->fs_uuid, fsid);
318         if (ret)
319                 return -EINVAL;
320         ret = uuid_parse(cfg->chunk_uuid, chunk_uuid);
321         if (ret)
322                 return -EINVAL;
323
324         memset(buf->data, 0, cfg->nodesize);
325         buf->len = cfg->nodesize;
326         btrfs_set_header_bytenr(buf, bytenr);
327         btrfs_set_header_generation(buf, 1);
328         btrfs_set_header_backref_rev(buf, BTRFS_MIXED_BACKREF_REV);
329         btrfs_set_header_owner(buf, owner);
330         btrfs_set_header_flags(buf, BTRFS_HEADER_FLAG_WRITTEN);
331         write_extent_buffer(buf, chunk_uuid, btrfs_header_chunk_tree_uuid(buf),
332                             BTRFS_UUID_SIZE);
333         write_extent_buffer(buf, fsid, btrfs_header_fsid(), BTRFS_FSID_SIZE);
334         return 0;
335 }
336
337 static inline int write_temp_extent_buffer(int fd, struct extent_buffer *buf,
338                                            u64 bytenr)
339 {
340         int ret;
341
342         csum_tree_block_size(buf, BTRFS_CRC32_SIZE, 0);
343
344         /* Temporary extent buffer is always mapped 1:1 on disk */
345         ret = pwrite(fd, buf->data, buf->len, bytenr);
346         if (ret < buf->len)
347                 ret = (ret < 0 ? ret : -EIO);
348         else
349                 ret = 0;
350         return ret;
351 }
352
353 /*
354  * Insert a root item for temporary tree root
355  *
356  * Only used in make_btrfs_v2().
357  */
358 static void insert_temp_root_item(struct extent_buffer *buf,
359                                   struct btrfs_mkfs_config *cfg,
360                                   int *slot, u32 *itemoff, u64 objectid,
361                                   u64 bytenr)
362 {
363         struct btrfs_root_item root_item;
364         struct btrfs_inode_item *inode_item;
365         struct btrfs_disk_key disk_key;
366
367         btrfs_set_header_nritems(buf, *slot + 1);
368         (*itemoff) -= sizeof(root_item);
369         memset(&root_item, 0, sizeof(root_item));
370         inode_item = &root_item.inode;
371         btrfs_set_stack_inode_generation(inode_item, 1);
372         btrfs_set_stack_inode_size(inode_item, 3);
373         btrfs_set_stack_inode_nlink(inode_item, 1);
374         btrfs_set_stack_inode_nbytes(inode_item, cfg->nodesize);
375         btrfs_set_stack_inode_mode(inode_item, S_IFDIR | 0755);
376         btrfs_set_root_refs(&root_item, 1);
377         btrfs_set_root_used(&root_item, cfg->nodesize);
378         btrfs_set_root_generation(&root_item, 1);
379         btrfs_set_root_bytenr(&root_item, bytenr);
380
381         memset(&disk_key, 0, sizeof(disk_key));
382         btrfs_set_disk_key_type(&disk_key, BTRFS_ROOT_ITEM_KEY);
383         btrfs_set_disk_key_objectid(&disk_key, objectid);
384         btrfs_set_disk_key_offset(&disk_key, 0);
385
386         btrfs_set_item_key(buf, &disk_key, *slot);
387         btrfs_set_item_offset(buf, btrfs_item_nr(*slot), *itemoff);
388         btrfs_set_item_size(buf, btrfs_item_nr(*slot), sizeof(root_item));
389         write_extent_buffer(buf, &root_item,
390                             btrfs_item_ptr_offset(buf, *slot),
391                             sizeof(root_item));
392         (*slot)++;
393 }
394
395 static int setup_temp_root_tree(int fd, struct btrfs_mkfs_config *cfg,
396                                 u64 root_bytenr, u64 extent_bytenr,
397                                 u64 dev_bytenr, u64 fs_bytenr, u64 csum_bytenr)
398 {
399         struct extent_buffer *buf = NULL;
400         u32 itemoff = __BTRFS_LEAF_DATA_SIZE(cfg->nodesize);
401         int slot = 0;
402         int ret;
403
404         /*
405          * Provided bytenr must in ascending order, or tree root will have a
406          * bad key order.
407          */
408         if (!(root_bytenr < extent_bytenr && extent_bytenr < dev_bytenr &&
409               dev_bytenr < fs_bytenr && fs_bytenr < csum_bytenr)) {
410                 error("bad tree bytenr order: "
411                                 "root < extent %llu < %llu, "
412                                 "extent < dev %llu < %llu, "
413                                 "dev < fs %llu < %llu, "
414                                 "fs < csum %llu < %llu",
415                                 (unsigned long long)root_bytenr,
416                                 (unsigned long long)extent_bytenr,
417                                 (unsigned long long)extent_bytenr,
418                                 (unsigned long long)dev_bytenr,
419                                 (unsigned long long)dev_bytenr,
420                                 (unsigned long long)fs_bytenr,
421                                 (unsigned long long)fs_bytenr,
422                                 (unsigned long long)csum_bytenr);
423                 return -EINVAL;
424         }
425         buf = malloc(sizeof(*buf) + cfg->nodesize);
426         if (!buf)
427                 return -ENOMEM;
428
429         ret = setup_temp_extent_buffer(buf, cfg, root_bytenr,
430                                        BTRFS_ROOT_TREE_OBJECTID);
431         if (ret < 0)
432                 goto out;
433
434         insert_temp_root_item(buf, cfg, &slot, &itemoff,
435                               BTRFS_EXTENT_TREE_OBJECTID, extent_bytenr);
436         insert_temp_root_item(buf, cfg, &slot, &itemoff,
437                               BTRFS_DEV_TREE_OBJECTID, dev_bytenr);
438         insert_temp_root_item(buf, cfg, &slot, &itemoff,
439                               BTRFS_FS_TREE_OBJECTID, fs_bytenr);
440         insert_temp_root_item(buf, cfg, &slot, &itemoff,
441                               BTRFS_CSUM_TREE_OBJECTID, csum_bytenr);
442
443         ret = write_temp_extent_buffer(fd, buf, root_bytenr);
444 out:
445         free(buf);
446         return ret;
447 }
448
449 static int insert_temp_dev_item(int fd, struct extent_buffer *buf,
450                                 struct btrfs_mkfs_config *cfg,
451                                 int *slot, u32 *itemoff)
452 {
453         struct btrfs_disk_key disk_key;
454         struct btrfs_dev_item *dev_item;
455         char super_buf[BTRFS_SUPER_INFO_SIZE];
456         unsigned char dev_uuid[BTRFS_UUID_SIZE];
457         unsigned char fsid[BTRFS_FSID_SIZE];
458         struct btrfs_super_block *super = (struct btrfs_super_block *)super_buf;
459         int ret;
460
461         ret = pread(fd, super_buf, BTRFS_SUPER_INFO_SIZE, cfg->super_bytenr);
462         if (ret < BTRFS_SUPER_INFO_SIZE) {
463                 ret = (ret < 0 ? -errno : -EIO);
464                 goto out;
465         }
466
467         btrfs_set_header_nritems(buf, *slot + 1);
468         (*itemoff) -= sizeof(*dev_item);
469         /* setup device item 1, 0 is for replace case */
470         btrfs_set_disk_key_type(&disk_key, BTRFS_DEV_ITEM_KEY);
471         btrfs_set_disk_key_objectid(&disk_key, BTRFS_DEV_ITEMS_OBJECTID);
472         btrfs_set_disk_key_offset(&disk_key, 1);
473         btrfs_set_item_key(buf, &disk_key, *slot);
474         btrfs_set_item_offset(buf, btrfs_item_nr(*slot), *itemoff);
475         btrfs_set_item_size(buf, btrfs_item_nr(*slot), sizeof(*dev_item));
476
477         dev_item = btrfs_item_ptr(buf, *slot, struct btrfs_dev_item);
478         /* Generate device uuid */
479         uuid_generate(dev_uuid);
480         write_extent_buffer(buf, dev_uuid,
481                         (unsigned long)btrfs_device_uuid(dev_item),
482                         BTRFS_UUID_SIZE);
483         uuid_parse(cfg->fs_uuid, fsid);
484         write_extent_buffer(buf, fsid,
485                         (unsigned long)btrfs_device_fsid(dev_item),
486                         BTRFS_FSID_SIZE);
487         btrfs_set_device_id(buf, dev_item, 1);
488         btrfs_set_device_generation(buf, dev_item, 0);
489         btrfs_set_device_total_bytes(buf, dev_item, cfg->num_bytes);
490         /*
491          * The number must match the initial SYSTEM and META chunk size
492          */
493         btrfs_set_device_bytes_used(buf, dev_item,
494                         BTRFS_MKFS_SYSTEM_GROUP_SIZE +
495                         BTRFS_CONVERT_META_GROUP_SIZE);
496         btrfs_set_device_io_align(buf, dev_item, cfg->sectorsize);
497         btrfs_set_device_io_width(buf, dev_item, cfg->sectorsize);
498         btrfs_set_device_sector_size(buf, dev_item, cfg->sectorsize);
499         btrfs_set_device_type(buf, dev_item, 0);
500
501         /* Super dev_item is not complete, copy the complete one to sb */
502         read_extent_buffer(buf, &super->dev_item, (unsigned long)dev_item,
503                            sizeof(*dev_item));
504         ret = write_temp_super(fd, super, cfg->super_bytenr);
505         (*slot)++;
506 out:
507         return ret;
508 }
509
510 static int insert_temp_chunk_item(int fd, struct extent_buffer *buf,
511                                   struct btrfs_mkfs_config *cfg,
512                                   int *slot, u32 *itemoff, u64 start, u64 len,
513                                   u64 type)
514 {
515         struct btrfs_chunk *chunk;
516         struct btrfs_disk_key disk_key;
517         char super_buf[BTRFS_SUPER_INFO_SIZE];
518         struct btrfs_super_block *sb = (struct btrfs_super_block *)super_buf;
519         int ret = 0;
520
521         ret = pread(fd, super_buf, BTRFS_SUPER_INFO_SIZE,
522                     cfg->super_bytenr);
523         if (ret < BTRFS_SUPER_INFO_SIZE) {
524                 ret = (ret < 0 ? ret : -EIO);
525                 return ret;
526         }
527
528         btrfs_set_header_nritems(buf, *slot + 1);
529         (*itemoff) -= btrfs_chunk_item_size(1);
530         btrfs_set_disk_key_type(&disk_key, BTRFS_CHUNK_ITEM_KEY);
531         btrfs_set_disk_key_objectid(&disk_key, BTRFS_FIRST_CHUNK_TREE_OBJECTID);
532         btrfs_set_disk_key_offset(&disk_key, start);
533         btrfs_set_item_key(buf, &disk_key, *slot);
534         btrfs_set_item_offset(buf, btrfs_item_nr(*slot), *itemoff);
535         btrfs_set_item_size(buf, btrfs_item_nr(*slot),
536                             btrfs_chunk_item_size(1));
537
538         chunk = btrfs_item_ptr(buf, *slot, struct btrfs_chunk);
539         btrfs_set_chunk_length(buf, chunk, len);
540         btrfs_set_chunk_owner(buf, chunk, BTRFS_EXTENT_TREE_OBJECTID);
541         btrfs_set_chunk_stripe_len(buf, chunk, 64 * 1024);
542         btrfs_set_chunk_type(buf, chunk, type);
543         btrfs_set_chunk_io_align(buf, chunk, cfg->sectorsize);
544         btrfs_set_chunk_io_width(buf, chunk, cfg->sectorsize);
545         btrfs_set_chunk_sector_size(buf, chunk, cfg->sectorsize);
546         btrfs_set_chunk_num_stripes(buf, chunk, 1);
547         /* TODO: Support DUP profile for system chunk */
548         btrfs_set_stripe_devid_nr(buf, chunk, 0, 1);
549         /* We are doing 1:1 mapping, so start is its dev offset */
550         btrfs_set_stripe_offset_nr(buf, chunk, 0, start);
551         write_extent_buffer(buf, &sb->dev_item.uuid,
552                             (unsigned long)btrfs_stripe_dev_uuid_nr(chunk, 0),
553                             BTRFS_UUID_SIZE);
554         (*slot)++;
555
556         /*
557          * If it's system chunk, also copy it to super block.
558          */
559         if (type & BTRFS_BLOCK_GROUP_SYSTEM) {
560                 char *cur;
561
562                 cur = (char *)sb->sys_chunk_array + sb->sys_chunk_array_size;
563                 memcpy(cur, &disk_key, sizeof(disk_key));
564                 cur += sizeof(disk_key);
565                 read_extent_buffer(buf, cur, (unsigned long int)chunk,
566                                    btrfs_chunk_item_size(1));
567                 sb->sys_chunk_array_size += btrfs_chunk_item_size(1) +
568                                             sizeof(disk_key);
569
570                 ret = write_temp_super(fd, sb, cfg->super_bytenr);
571         }
572         return ret;
573 }
574
575 static int setup_temp_chunk_tree(int fd, struct btrfs_mkfs_config *cfg,
576                                  u64 sys_chunk_start, u64 meta_chunk_start,
577                                  u64 chunk_bytenr)
578 {
579         struct extent_buffer *buf = NULL;
580         u32 itemoff = __BTRFS_LEAF_DATA_SIZE(cfg->nodesize);
581         int slot = 0;
582         int ret;
583
584         /* Must ensure SYS chunk starts before META chunk */
585         if (meta_chunk_start < sys_chunk_start) {
586                 error("wrong chunk order: meta < system %llu < %llu",
587                                 (unsigned long long)meta_chunk_start,
588                                 (unsigned long long)sys_chunk_start);
589                 return -EINVAL;
590         }
591         buf = malloc(sizeof(*buf) + cfg->nodesize);
592         if (!buf)
593                 return -ENOMEM;
594         ret = setup_temp_extent_buffer(buf, cfg, chunk_bytenr,
595                                        BTRFS_CHUNK_TREE_OBJECTID);
596         if (ret < 0)
597                 goto out;
598
599         ret = insert_temp_dev_item(fd, buf, cfg, &slot, &itemoff);
600         if (ret < 0)
601                 goto out;
602         ret = insert_temp_chunk_item(fd, buf, cfg, &slot, &itemoff,
603                                      sys_chunk_start,
604                                      BTRFS_MKFS_SYSTEM_GROUP_SIZE,
605                                      BTRFS_BLOCK_GROUP_SYSTEM);
606         if (ret < 0)
607                 goto out;
608         ret = insert_temp_chunk_item(fd, buf, cfg, &slot, &itemoff,
609                                      meta_chunk_start,
610                                      BTRFS_CONVERT_META_GROUP_SIZE,
611                                      BTRFS_BLOCK_GROUP_METADATA);
612         if (ret < 0)
613                 goto out;
614         ret = write_temp_extent_buffer(fd, buf, chunk_bytenr);
615
616 out:
617         free(buf);
618         return ret;
619 }
620
621 static void insert_temp_dev_extent(struct extent_buffer *buf,
622                                    int *slot, u32 *itemoff, u64 start, u64 len)
623 {
624         struct btrfs_dev_extent *dev_extent;
625         struct btrfs_disk_key disk_key;
626
627         btrfs_set_header_nritems(buf, *slot + 1);
628         (*itemoff) -= sizeof(*dev_extent);
629         btrfs_set_disk_key_type(&disk_key, BTRFS_DEV_EXTENT_KEY);
630         btrfs_set_disk_key_objectid(&disk_key, 1);
631         btrfs_set_disk_key_offset(&disk_key, start);
632         btrfs_set_item_key(buf, &disk_key, *slot);
633         btrfs_set_item_offset(buf, btrfs_item_nr(*slot), *itemoff);
634         btrfs_set_item_size(buf, btrfs_item_nr(*slot), sizeof(*dev_extent));
635
636         dev_extent = btrfs_item_ptr(buf, *slot, struct btrfs_dev_extent);
637         btrfs_set_dev_extent_chunk_objectid(buf, dev_extent,
638                                             BTRFS_FIRST_CHUNK_TREE_OBJECTID);
639         btrfs_set_dev_extent_length(buf, dev_extent, len);
640         btrfs_set_dev_extent_chunk_offset(buf, dev_extent, start);
641         btrfs_set_dev_extent_chunk_tree(buf, dev_extent,
642                                         BTRFS_CHUNK_TREE_OBJECTID);
643         (*slot)++;
644 }
645
646 static int setup_temp_dev_tree(int fd, struct btrfs_mkfs_config *cfg,
647                                u64 sys_chunk_start, u64 meta_chunk_start,
648                                u64 dev_bytenr)
649 {
650         struct extent_buffer *buf = NULL;
651         u32 itemoff = __BTRFS_LEAF_DATA_SIZE(cfg->nodesize);
652         int slot = 0;
653         int ret;
654
655         /* Must ensure SYS chunk starts before META chunk */
656         if (meta_chunk_start < sys_chunk_start) {
657                 error("wrong chunk order: meta < system %llu < %llu",
658                                 (unsigned long long)meta_chunk_start,
659                                 (unsigned long long)sys_chunk_start);
660                 return -EINVAL;
661         }
662         buf = malloc(sizeof(*buf) + cfg->nodesize);
663         if (!buf)
664                 return -ENOMEM;
665         ret = setup_temp_extent_buffer(buf, cfg, dev_bytenr,
666                                        BTRFS_DEV_TREE_OBJECTID);
667         if (ret < 0)
668                 goto out;
669         insert_temp_dev_extent(buf, &slot, &itemoff, sys_chunk_start,
670                                BTRFS_MKFS_SYSTEM_GROUP_SIZE);
671         insert_temp_dev_extent(buf, &slot, &itemoff, meta_chunk_start,
672                                BTRFS_CONVERT_META_GROUP_SIZE);
673         ret = write_temp_extent_buffer(fd, buf, dev_bytenr);
674 out:
675         free(buf);
676         return ret;
677 }
678
679 static int setup_temp_fs_tree(int fd, struct btrfs_mkfs_config *cfg,
680                               u64 fs_bytenr)
681 {
682         struct extent_buffer *buf = NULL;
683         int ret;
684
685         buf = malloc(sizeof(*buf) + cfg->nodesize);
686         if (!buf)
687                 return -ENOMEM;
688         ret = setup_temp_extent_buffer(buf, cfg, fs_bytenr,
689                                        BTRFS_FS_TREE_OBJECTID);
690         if (ret < 0)
691                 goto out;
692         /*
693          * Temporary fs tree is completely empty.
694          */
695         ret = write_temp_extent_buffer(fd, buf, fs_bytenr);
696 out:
697         free(buf);
698         return ret;
699 }
700
701 static int setup_temp_csum_tree(int fd, struct btrfs_mkfs_config *cfg,
702                                 u64 csum_bytenr)
703 {
704         struct extent_buffer *buf = NULL;
705         int ret;
706
707         buf = malloc(sizeof(*buf) + cfg->nodesize);
708         if (!buf)
709                 return -ENOMEM;
710         ret = setup_temp_extent_buffer(buf, cfg, csum_bytenr,
711                                        BTRFS_CSUM_TREE_OBJECTID);
712         if (ret < 0)
713                 goto out;
714         /*
715          * Temporary csum tree is completely empty.
716          */
717         ret = write_temp_extent_buffer(fd, buf, csum_bytenr);
718 out:
719         free(buf);
720         return ret;
721 }
722
723 /*
724  * Insert one temporary extent item.
725  *
726  * NOTE: if skinny_metadata is not enabled, this function must be called
727  * after all other trees are initialized.
728  * Or fs without skinny-metadata will be screwed up.
729  */
730 static int insert_temp_extent_item(int fd, struct extent_buffer *buf,
731                                    struct btrfs_mkfs_config *cfg,
732                                    int *slot, u32 *itemoff, u64 bytenr,
733                                    u64 ref_root)
734 {
735         struct extent_buffer *tmp;
736         struct btrfs_extent_item *ei;
737         struct btrfs_extent_inline_ref *iref;
738         struct btrfs_disk_key disk_key;
739         struct btrfs_disk_key tree_info_key;
740         struct btrfs_tree_block_info *info;
741         int itemsize;
742         int skinny_metadata = cfg->features &
743                               BTRFS_FEATURE_INCOMPAT_SKINNY_METADATA;
744         int ret;
745
746         if (skinny_metadata)
747                 itemsize = sizeof(*ei) + sizeof(*iref);
748         else
749                 itemsize = sizeof(*ei) + sizeof(*iref) +
750                            sizeof(struct btrfs_tree_block_info);
751
752         btrfs_set_header_nritems(buf, *slot + 1);
753         *(itemoff) -= itemsize;
754
755         if (skinny_metadata) {
756                 btrfs_set_disk_key_type(&disk_key, BTRFS_METADATA_ITEM_KEY);
757                 btrfs_set_disk_key_offset(&disk_key, 0);
758         } else {
759                 btrfs_set_disk_key_type(&disk_key, BTRFS_EXTENT_ITEM_KEY);
760                 btrfs_set_disk_key_offset(&disk_key, cfg->nodesize);
761         }
762         btrfs_set_disk_key_objectid(&disk_key, bytenr);
763
764         btrfs_set_item_key(buf, &disk_key, *slot);
765         btrfs_set_item_offset(buf, btrfs_item_nr(*slot), *itemoff);
766         btrfs_set_item_size(buf, btrfs_item_nr(*slot), itemsize);
767
768         ei = btrfs_item_ptr(buf, *slot, struct btrfs_extent_item);
769         btrfs_set_extent_refs(buf, ei, 1);
770         btrfs_set_extent_generation(buf, ei, 1);
771         btrfs_set_extent_flags(buf, ei, BTRFS_EXTENT_FLAG_TREE_BLOCK);
772
773         if (skinny_metadata) {
774                 iref = (struct btrfs_extent_inline_ref *)(ei + 1);
775         } else {
776                 info = (struct btrfs_tree_block_info *)(ei + 1);
777                 iref = (struct btrfs_extent_inline_ref *)(info + 1);
778         }
779         btrfs_set_extent_inline_ref_type(buf, iref,
780                                          BTRFS_TREE_BLOCK_REF_KEY);
781         btrfs_set_extent_inline_ref_offset(buf, iref, ref_root);
782
783         (*slot)++;
784         if (skinny_metadata)
785                 return 0;
786
787         /*
788          * Lastly, check the tree block key by read the tree block
789          * Since we do 1:1 mapping for convert case, we can directly
790          * read the bytenr from disk
791          */
792         tmp = malloc(sizeof(*tmp) + cfg->nodesize);
793         if (!tmp)
794                 return -ENOMEM;
795         ret = setup_temp_extent_buffer(tmp, cfg, bytenr, ref_root);
796         if (ret < 0)
797                 goto out;
798         ret = pread(fd, tmp->data, cfg->nodesize, bytenr);
799         if (ret < cfg->nodesize) {
800                 ret = (ret < 0 ? -errno : -EIO);
801                 goto out;
802         }
803         if (btrfs_header_nritems(tmp) == 0) {
804                 btrfs_set_disk_key_type(&tree_info_key, 0);
805                 btrfs_set_disk_key_objectid(&tree_info_key, 0);
806                 btrfs_set_disk_key_offset(&tree_info_key, 0);
807         } else {
808                 btrfs_item_key(tmp, &tree_info_key, 0);
809         }
810         btrfs_set_tree_block_key(buf, info, &tree_info_key);
811
812 out:
813         free(tmp);
814         return ret;
815 }
816
817 static void insert_temp_block_group(struct extent_buffer *buf,
818                                    struct btrfs_mkfs_config *cfg,
819                                    int *slot, u32 *itemoff,
820                                    u64 bytenr, u64 len, u64 used, u64 flag)
821 {
822         struct btrfs_block_group_item bgi;
823         struct btrfs_disk_key disk_key;
824
825         btrfs_set_header_nritems(buf, *slot + 1);
826         (*itemoff) -= sizeof(bgi);
827         btrfs_set_disk_key_type(&disk_key, BTRFS_BLOCK_GROUP_ITEM_KEY);
828         btrfs_set_disk_key_objectid(&disk_key, bytenr);
829         btrfs_set_disk_key_offset(&disk_key, len);
830         btrfs_set_item_key(buf, &disk_key, *slot);
831         btrfs_set_item_offset(buf, btrfs_item_nr(*slot), *itemoff);
832         btrfs_set_item_size(buf, btrfs_item_nr(*slot), sizeof(bgi));
833
834         btrfs_set_block_group_flags(&bgi, flag);
835         btrfs_set_block_group_used(&bgi, used);
836         btrfs_set_block_group_chunk_objectid(&bgi,
837                         BTRFS_FIRST_CHUNK_TREE_OBJECTID);
838         write_extent_buffer(buf, &bgi, btrfs_item_ptr_offset(buf, *slot),
839                             sizeof(bgi));
840         (*slot)++;
841 }
842
843 static int setup_temp_extent_tree(int fd, struct btrfs_mkfs_config *cfg,
844                                   u64 chunk_bytenr, u64 root_bytenr,
845                                   u64 extent_bytenr, u64 dev_bytenr,
846                                   u64 fs_bytenr, u64 csum_bytenr)
847 {
848         struct extent_buffer *buf = NULL;
849         u32 itemoff = __BTRFS_LEAF_DATA_SIZE(cfg->nodesize);
850         int slot = 0;
851         int ret;
852
853         /*
854          * We must ensure provided bytenr are in ascending order,
855          * or extent tree key order will be broken.
856          */
857         if (!(chunk_bytenr < root_bytenr && root_bytenr < extent_bytenr &&
858               extent_bytenr < dev_bytenr && dev_bytenr < fs_bytenr &&
859               fs_bytenr < csum_bytenr)) {
860                 error("bad tree bytenr order: "
861                                 "chunk < root %llu < %llu, "
862                                 "root < extent %llu < %llu, "
863                                 "extent < dev %llu < %llu, "
864                                 "dev < fs %llu < %llu, "
865                                 "fs < csum %llu < %llu",
866                                 (unsigned long long)chunk_bytenr,
867                                 (unsigned long long)root_bytenr,
868                                 (unsigned long long)root_bytenr,
869                                 (unsigned long long)extent_bytenr,
870                                 (unsigned long long)extent_bytenr,
871                                 (unsigned long long)dev_bytenr,
872                                 (unsigned long long)dev_bytenr,
873                                 (unsigned long long)fs_bytenr,
874                                 (unsigned long long)fs_bytenr,
875                                 (unsigned long long)csum_bytenr);
876                 return -EINVAL;
877         }
878         buf = malloc(sizeof(*buf) + cfg->nodesize);
879         if (!buf)
880                 return -ENOMEM;
881
882         ret = setup_temp_extent_buffer(buf, cfg, extent_bytenr,
883                                        BTRFS_EXTENT_TREE_OBJECTID);
884         if (ret < 0)
885                 goto out;
886
887         ret = insert_temp_extent_item(fd, buf, cfg, &slot, &itemoff,
888                         chunk_bytenr, BTRFS_CHUNK_TREE_OBJECTID);
889         if (ret < 0)
890                 goto out;
891
892         insert_temp_block_group(buf, cfg, &slot, &itemoff, chunk_bytenr,
893                         BTRFS_MKFS_SYSTEM_GROUP_SIZE, cfg->nodesize,
894                         BTRFS_BLOCK_GROUP_SYSTEM);
895
896         ret = insert_temp_extent_item(fd, buf, cfg, &slot, &itemoff,
897                         root_bytenr, BTRFS_ROOT_TREE_OBJECTID);
898         if (ret < 0)
899                 goto out;
900
901         /* 5 tree block used, root, extent, dev, fs and csum*/
902         insert_temp_block_group(buf, cfg, &slot, &itemoff, root_bytenr,
903                         BTRFS_CONVERT_META_GROUP_SIZE, cfg->nodesize * 5,
904                         BTRFS_BLOCK_GROUP_METADATA);
905
906         ret = insert_temp_extent_item(fd, buf, cfg, &slot, &itemoff,
907                         extent_bytenr, BTRFS_EXTENT_TREE_OBJECTID);
908         if (ret < 0)
909                 goto out;
910         ret = insert_temp_extent_item(fd, buf, cfg, &slot, &itemoff,
911                         dev_bytenr, BTRFS_DEV_TREE_OBJECTID);
912         if (ret < 0)
913                 goto out;
914         ret = insert_temp_extent_item(fd, buf, cfg, &slot, &itemoff,
915                         fs_bytenr, BTRFS_FS_TREE_OBJECTID);
916         if (ret < 0)
917                 goto out;
918         ret = insert_temp_extent_item(fd, buf, cfg, &slot, &itemoff,
919                         csum_bytenr, BTRFS_CSUM_TREE_OBJECTID);
920         if (ret < 0)
921                 goto out;
922
923         ret = write_temp_extent_buffer(fd, buf, extent_bytenr);
924 out:
925         free(buf);
926         return ret;
927 }
928
929 /*
930  * Improved version of make_btrfs().
931  *
932  * This one will
933  * 1) Do chunk allocation to avoid used data
934  *    And after this function, extent type matches chunk type
935  * 2) Better structured code
936  *    No super long hand written codes to initialized all tree blocks
937  *    Split into small blocks and reuse codes.
938  *    TODO: Reuse tree operation facilities by introducing new flags
939  */
940 static int make_convert_btrfs(int fd, struct btrfs_mkfs_config *cfg,
941                               struct btrfs_convert_context *cctx)
942 {
943         struct cache_tree *free = &cctx->free;
944         struct cache_tree *used = &cctx->used;
945         u64 sys_chunk_start;
946         u64 meta_chunk_start;
947         /* chunk tree bytenr, in system chunk */
948         u64 chunk_bytenr;
949         /* metadata trees bytenr, in metadata chunk */
950         u64 root_bytenr;
951         u64 extent_bytenr;
952         u64 dev_bytenr;
953         u64 fs_bytenr;
954         u64 csum_bytenr;
955         int ret;
956
957         /* Shouldn't happen */
958         BUG_ON(cache_tree_empty(used));
959
960         /*
961          * reserve space for temporary superblock first
962          * Here we allocate a little larger space, to keep later
963          * free space will be STRIPE_LEN aligned
964          */
965         ret = reserve_free_space(free, BTRFS_STRIPE_LEN,
966                                  &cfg->super_bytenr);
967         if (ret < 0)
968                 goto out;
969
970         /*
971          * Then reserve system chunk space
972          * TODO: Change system group size depending on cctx->total_bytes.
973          * If using current 4M, it can only handle less than one TB for
974          * worst case and then run out of sys space.
975          */
976         ret = reserve_free_space(free, BTRFS_MKFS_SYSTEM_GROUP_SIZE,
977                                  &sys_chunk_start);
978         if (ret < 0)
979                 goto out;
980         ret = reserve_free_space(free, BTRFS_CONVERT_META_GROUP_SIZE,
981                                  &meta_chunk_start);
982         if (ret < 0)
983                 goto out;
984
985         /*
986          * Allocated meta/sys chunks will be mapped 1:1 with device offset.
987          *
988          * Inside the allocated metadata chunk, the layout will be:
989          *  | offset            | contents      |
990          *  -------------------------------------
991          *  | +0                | tree root     |
992          *  | +nodesize         | extent root   |
993          *  | +nodesize * 2     | device root   |
994          *  | +nodesize * 3     | fs tree       |
995          *  | +nodesize * 4     | csum tree     |
996          *  -------------------------------------
997          * Inside the allocated system chunk, the layout will be:
998          *  | offset            | contents      |
999          *  -------------------------------------
1000          *  | +0                | chunk root    |
1001          *  -------------------------------------
1002          */
1003         chunk_bytenr = sys_chunk_start;
1004         root_bytenr = meta_chunk_start;
1005         extent_bytenr = meta_chunk_start + cfg->nodesize;
1006         dev_bytenr = meta_chunk_start + cfg->nodesize * 2;
1007         fs_bytenr = meta_chunk_start + cfg->nodesize * 3;
1008         csum_bytenr = meta_chunk_start + cfg->nodesize * 4;
1009
1010         ret = setup_temp_super(fd, cfg, root_bytenr, chunk_bytenr);
1011         if (ret < 0)
1012                 goto out;
1013
1014         ret = setup_temp_root_tree(fd, cfg, root_bytenr, extent_bytenr,
1015                                    dev_bytenr, fs_bytenr, csum_bytenr);
1016         if (ret < 0)
1017                 goto out;
1018         ret = setup_temp_chunk_tree(fd, cfg, sys_chunk_start, meta_chunk_start,
1019                                     chunk_bytenr);
1020         if (ret < 0)
1021                 goto out;
1022         ret = setup_temp_dev_tree(fd, cfg, sys_chunk_start, meta_chunk_start,
1023                                   dev_bytenr);
1024         if (ret < 0)
1025                 goto out;
1026         ret = setup_temp_fs_tree(fd, cfg, fs_bytenr);
1027         if (ret < 0)
1028                 goto out;
1029         ret = setup_temp_csum_tree(fd, cfg, csum_bytenr);
1030         if (ret < 0)
1031                 goto out;
1032         /*
1033          * Setup extent tree last, since it may need to read tree block key
1034          * for non-skinny metadata case.
1035          */
1036         ret = setup_temp_extent_tree(fd, cfg, chunk_bytenr, root_bytenr,
1037                                      extent_bytenr, dev_bytenr, fs_bytenr,
1038                                      csum_bytenr);
1039 out:
1040         return ret;
1041 }
1042
1043 /*
1044  * @fs_uuid - if NULL, generates a UUID, returns back the new filesystem UUID
1045  *
1046  * The superblock signature is not valid, denotes a partially created
1047  * filesystem, needs to be finalized.
1048  */
1049 int make_btrfs(int fd, struct btrfs_mkfs_config *cfg,
1050                 struct btrfs_convert_context *cctx)
1051 {
1052         struct btrfs_super_block super;
1053         struct extent_buffer *buf;
1054         struct btrfs_root_item root_item;
1055         struct btrfs_disk_key disk_key;
1056         struct btrfs_extent_item *extent_item;
1057         struct btrfs_inode_item *inode_item;
1058         struct btrfs_chunk *chunk;
1059         struct btrfs_dev_item *dev_item;
1060         struct btrfs_dev_extent *dev_extent;
1061         u8 chunk_tree_uuid[BTRFS_UUID_SIZE];
1062         u8 *ptr;
1063         int i;
1064         int ret;
1065         u32 itemoff;
1066         u32 nritems = 0;
1067         u64 first_free;
1068         u64 ref_root;
1069         u32 array_size;
1070         u32 item_size;
1071         int skinny_metadata = !!(cfg->features &
1072                                  BTRFS_FEATURE_INCOMPAT_SKINNY_METADATA);
1073         u64 num_bytes;
1074
1075         if (cctx)
1076                 return make_convert_btrfs(fd, cfg, cctx);
1077         buf = malloc(sizeof(*buf) + max(cfg->sectorsize, cfg->nodesize));
1078         if (!buf)
1079                 return -ENOMEM;
1080
1081         first_free = BTRFS_SUPER_INFO_OFFSET + cfg->sectorsize * 2 - 1;
1082         first_free &= ~((u64)cfg->sectorsize - 1);
1083
1084         memset(&super, 0, sizeof(super));
1085
1086         num_bytes = (cfg->num_bytes / cfg->sectorsize) * cfg->sectorsize;
1087         if (*cfg->fs_uuid) {
1088                 if (uuid_parse(cfg->fs_uuid, super.fsid) != 0) {
1089                         error("cannot not parse UUID: %s", cfg->fs_uuid);
1090                         ret = -EINVAL;
1091                         goto out;
1092                 }
1093                 if (!test_uuid_unique(cfg->fs_uuid)) {
1094                         error("non-unique UUID: %s", cfg->fs_uuid);
1095                         ret = -EBUSY;
1096                         goto out;
1097                 }
1098         } else {
1099                 uuid_generate(super.fsid);
1100                 if (cfg->fs_uuid)
1101                         uuid_unparse(super.fsid, cfg->fs_uuid);
1102         }
1103         uuid_generate(super.dev_item.uuid);
1104         uuid_generate(chunk_tree_uuid);
1105
1106         btrfs_set_super_bytenr(&super, cfg->blocks[0]);
1107         btrfs_set_super_num_devices(&super, 1);
1108         btrfs_set_super_magic(&super, BTRFS_MAGIC_PARTIAL);
1109         btrfs_set_super_generation(&super, 1);
1110         btrfs_set_super_root(&super, cfg->blocks[1]);
1111         btrfs_set_super_chunk_root(&super, cfg->blocks[3]);
1112         btrfs_set_super_total_bytes(&super, num_bytes);
1113         btrfs_set_super_bytes_used(&super, 6 * cfg->nodesize);
1114         btrfs_set_super_sectorsize(&super, cfg->sectorsize);
1115         btrfs_set_super_leafsize(&super, cfg->nodesize);
1116         btrfs_set_super_nodesize(&super, cfg->nodesize);
1117         btrfs_set_super_stripesize(&super, cfg->stripesize);
1118         btrfs_set_super_csum_type(&super, BTRFS_CSUM_TYPE_CRC32);
1119         btrfs_set_super_chunk_root_generation(&super, 1);
1120         btrfs_set_super_cache_generation(&super, -1);
1121         btrfs_set_super_incompat_flags(&super, cfg->features);
1122         if (cfg->label)
1123                 __strncpy_null(super.label, cfg->label, BTRFS_LABEL_SIZE - 1);
1124
1125         /* create the tree of root objects */
1126         memset(buf->data, 0, cfg->nodesize);
1127         buf->len = cfg->nodesize;
1128         btrfs_set_header_bytenr(buf, cfg->blocks[1]);
1129         btrfs_set_header_nritems(buf, 4);
1130         btrfs_set_header_generation(buf, 1);
1131         btrfs_set_header_backref_rev(buf, BTRFS_MIXED_BACKREF_REV);
1132         btrfs_set_header_owner(buf, BTRFS_ROOT_TREE_OBJECTID);
1133         write_extent_buffer(buf, super.fsid, btrfs_header_fsid(),
1134                             BTRFS_FSID_SIZE);
1135
1136         write_extent_buffer(buf, chunk_tree_uuid,
1137                             btrfs_header_chunk_tree_uuid(buf),
1138                             BTRFS_UUID_SIZE);
1139
1140         /* create the items for the root tree */
1141         memset(&root_item, 0, sizeof(root_item));
1142         inode_item = &root_item.inode;
1143         btrfs_set_stack_inode_generation(inode_item, 1);
1144         btrfs_set_stack_inode_size(inode_item, 3);
1145         btrfs_set_stack_inode_nlink(inode_item, 1);
1146         btrfs_set_stack_inode_nbytes(inode_item, cfg->nodesize);
1147         btrfs_set_stack_inode_mode(inode_item, S_IFDIR | 0755);
1148         btrfs_set_root_refs(&root_item, 1);
1149         btrfs_set_root_used(&root_item, cfg->nodesize);
1150         btrfs_set_root_generation(&root_item, 1);
1151
1152         memset(&disk_key, 0, sizeof(disk_key));
1153         btrfs_set_disk_key_type(&disk_key, BTRFS_ROOT_ITEM_KEY);
1154         btrfs_set_disk_key_offset(&disk_key, 0);
1155         nritems = 0;
1156
1157         itemoff = __BTRFS_LEAF_DATA_SIZE(cfg->nodesize) - sizeof(root_item);
1158         btrfs_set_root_bytenr(&root_item, cfg->blocks[2]);
1159         btrfs_set_disk_key_objectid(&disk_key, BTRFS_EXTENT_TREE_OBJECTID);
1160         btrfs_set_item_key(buf, &disk_key, nritems);
1161         btrfs_set_item_offset(buf, btrfs_item_nr(nritems), itemoff);
1162         btrfs_set_item_size(buf, btrfs_item_nr(nritems),
1163                             sizeof(root_item));
1164         write_extent_buffer(buf, &root_item, btrfs_item_ptr_offset(buf,
1165                             nritems), sizeof(root_item));
1166         nritems++;
1167
1168         itemoff = itemoff - sizeof(root_item);
1169         btrfs_set_root_bytenr(&root_item, cfg->blocks[4]);
1170         btrfs_set_disk_key_objectid(&disk_key, BTRFS_DEV_TREE_OBJECTID);
1171         btrfs_set_item_key(buf, &disk_key, nritems);
1172         btrfs_set_item_offset(buf, btrfs_item_nr(nritems), itemoff);
1173         btrfs_set_item_size(buf, btrfs_item_nr(nritems),
1174                             sizeof(root_item));
1175         write_extent_buffer(buf, &root_item,
1176                             btrfs_item_ptr_offset(buf, nritems),
1177                             sizeof(root_item));
1178         nritems++;
1179
1180         itemoff = itemoff - sizeof(root_item);
1181         btrfs_set_root_bytenr(&root_item, cfg->blocks[5]);
1182         btrfs_set_disk_key_objectid(&disk_key, BTRFS_FS_TREE_OBJECTID);
1183         btrfs_set_item_key(buf, &disk_key, nritems);
1184         btrfs_set_item_offset(buf, btrfs_item_nr(nritems), itemoff);
1185         btrfs_set_item_size(buf, btrfs_item_nr(nritems),
1186                             sizeof(root_item));
1187         write_extent_buffer(buf, &root_item,
1188                             btrfs_item_ptr_offset(buf, nritems),
1189                             sizeof(root_item));
1190         nritems++;
1191
1192         itemoff = itemoff - sizeof(root_item);
1193         btrfs_set_root_bytenr(&root_item, cfg->blocks[6]);
1194         btrfs_set_disk_key_objectid(&disk_key, BTRFS_CSUM_TREE_OBJECTID);
1195         btrfs_set_item_key(buf, &disk_key, nritems);
1196         btrfs_set_item_offset(buf, btrfs_item_nr(nritems), itemoff);
1197         btrfs_set_item_size(buf, btrfs_item_nr(nritems),
1198                             sizeof(root_item));
1199         write_extent_buffer(buf, &root_item,
1200                             btrfs_item_ptr_offset(buf, nritems),
1201                             sizeof(root_item));
1202         nritems++;
1203
1204
1205         csum_tree_block_size(buf, BTRFS_CRC32_SIZE, 0);
1206         ret = pwrite(fd, buf->data, cfg->nodesize, cfg->blocks[1]);
1207         if (ret != cfg->nodesize) {
1208                 ret = (ret < 0 ? -errno : -EIO);
1209                 goto out;
1210         }
1211
1212         /* create the items for the extent tree */
1213         memset(buf->data + sizeof(struct btrfs_header), 0,
1214                 cfg->nodesize - sizeof(struct btrfs_header));
1215         nritems = 0;
1216         itemoff = __BTRFS_LEAF_DATA_SIZE(cfg->nodesize);
1217         for (i = 1; i < 7; i++) {
1218                 item_size = sizeof(struct btrfs_extent_item);
1219                 if (!skinny_metadata)
1220                         item_size += sizeof(struct btrfs_tree_block_info);
1221
1222                 if (cfg->blocks[i] < first_free) {
1223                         error("block[%d] below first free: %llu < %llu",
1224                                         i, (unsigned long long)cfg->blocks[i],
1225                                         (unsigned long long)first_free);
1226                         ret = -EINVAL;
1227                         goto out;
1228                 }
1229                 if (cfg->blocks[i] < cfg->blocks[i - 1]) {
1230                         error("blocks %d and %d in reverse order: %llu < %llu",
1231                                 i, i - 1,
1232                                 (unsigned long long)cfg->blocks[i],
1233                                 (unsigned long long)cfg->blocks[i - 1]);
1234                         ret = -EINVAL;
1235                         goto out;
1236                 }
1237
1238                 /* create extent item */
1239                 itemoff -= item_size;
1240                 btrfs_set_disk_key_objectid(&disk_key, cfg->blocks[i]);
1241                 if (skinny_metadata) {
1242                         btrfs_set_disk_key_type(&disk_key,
1243                                                 BTRFS_METADATA_ITEM_KEY);
1244                         btrfs_set_disk_key_offset(&disk_key, 0);
1245                 } else {
1246                         btrfs_set_disk_key_type(&disk_key,
1247                                                 BTRFS_EXTENT_ITEM_KEY);
1248                         btrfs_set_disk_key_offset(&disk_key, cfg->nodesize);
1249                 }
1250                 btrfs_set_item_key(buf, &disk_key, nritems);
1251                 btrfs_set_item_offset(buf, btrfs_item_nr(nritems),
1252                                       itemoff);
1253                 btrfs_set_item_size(buf, btrfs_item_nr(nritems),
1254                                     item_size);
1255                 extent_item = btrfs_item_ptr(buf, nritems,
1256                                              struct btrfs_extent_item);
1257                 btrfs_set_extent_refs(buf, extent_item, 1);
1258                 btrfs_set_extent_generation(buf, extent_item, 1);
1259                 btrfs_set_extent_flags(buf, extent_item,
1260                                        BTRFS_EXTENT_FLAG_TREE_BLOCK);
1261                 nritems++;
1262
1263                 /* create extent ref */
1264                 ref_root = reference_root_table[i];
1265                 btrfs_set_disk_key_objectid(&disk_key, cfg->blocks[i]);
1266                 btrfs_set_disk_key_offset(&disk_key, ref_root);
1267                 btrfs_set_disk_key_type(&disk_key, BTRFS_TREE_BLOCK_REF_KEY);
1268                 btrfs_set_item_key(buf, &disk_key, nritems);
1269                 btrfs_set_item_offset(buf, btrfs_item_nr(nritems),
1270                                       itemoff);
1271                 btrfs_set_item_size(buf, btrfs_item_nr(nritems), 0);
1272                 nritems++;
1273         }
1274         btrfs_set_header_bytenr(buf, cfg->blocks[2]);
1275         btrfs_set_header_owner(buf, BTRFS_EXTENT_TREE_OBJECTID);
1276         btrfs_set_header_nritems(buf, nritems);
1277         csum_tree_block_size(buf, BTRFS_CRC32_SIZE, 0);
1278         ret = pwrite(fd, buf->data, cfg->nodesize, cfg->blocks[2]);
1279         if (ret != cfg->nodesize) {
1280                 ret = (ret < 0 ? -errno : -EIO);
1281                 goto out;
1282         }
1283
1284         /* create the chunk tree */
1285         memset(buf->data + sizeof(struct btrfs_header), 0,
1286                 cfg->nodesize - sizeof(struct btrfs_header));
1287         nritems = 0;
1288         item_size = sizeof(*dev_item);
1289         itemoff = __BTRFS_LEAF_DATA_SIZE(cfg->nodesize) - item_size;
1290
1291         /* first device 1 (there is no device 0) */
1292         btrfs_set_disk_key_objectid(&disk_key, BTRFS_DEV_ITEMS_OBJECTID);
1293         btrfs_set_disk_key_offset(&disk_key, 1);
1294         btrfs_set_disk_key_type(&disk_key, BTRFS_DEV_ITEM_KEY);
1295         btrfs_set_item_key(buf, &disk_key, nritems);
1296         btrfs_set_item_offset(buf, btrfs_item_nr(nritems), itemoff);
1297         btrfs_set_item_size(buf, btrfs_item_nr(nritems), item_size);
1298
1299         dev_item = btrfs_item_ptr(buf, nritems, struct btrfs_dev_item);
1300         btrfs_set_device_id(buf, dev_item, 1);
1301         btrfs_set_device_generation(buf, dev_item, 0);
1302         btrfs_set_device_total_bytes(buf, dev_item, num_bytes);
1303         btrfs_set_device_bytes_used(buf, dev_item,
1304                                     BTRFS_MKFS_SYSTEM_GROUP_SIZE);
1305         btrfs_set_device_io_align(buf, dev_item, cfg->sectorsize);
1306         btrfs_set_device_io_width(buf, dev_item, cfg->sectorsize);
1307         btrfs_set_device_sector_size(buf, dev_item, cfg->sectorsize);
1308         btrfs_set_device_type(buf, dev_item, 0);
1309
1310         write_extent_buffer(buf, super.dev_item.uuid,
1311                             (unsigned long)btrfs_device_uuid(dev_item),
1312                             BTRFS_UUID_SIZE);
1313         write_extent_buffer(buf, super.fsid,
1314                             (unsigned long)btrfs_device_fsid(dev_item),
1315                             BTRFS_UUID_SIZE);
1316         read_extent_buffer(buf, &super.dev_item, (unsigned long)dev_item,
1317                            sizeof(*dev_item));
1318
1319         nritems++;
1320         item_size = btrfs_chunk_item_size(1);
1321         itemoff = itemoff - item_size;
1322
1323         /* then we have chunk 0 */
1324         btrfs_set_disk_key_objectid(&disk_key, BTRFS_FIRST_CHUNK_TREE_OBJECTID);
1325         btrfs_set_disk_key_offset(&disk_key, 0);
1326         btrfs_set_disk_key_type(&disk_key, BTRFS_CHUNK_ITEM_KEY);
1327         btrfs_set_item_key(buf, &disk_key, nritems);
1328         btrfs_set_item_offset(buf, btrfs_item_nr(nritems), itemoff);
1329         btrfs_set_item_size(buf, btrfs_item_nr(nritems), item_size);
1330
1331         chunk = btrfs_item_ptr(buf, nritems, struct btrfs_chunk);
1332         btrfs_set_chunk_length(buf, chunk, BTRFS_MKFS_SYSTEM_GROUP_SIZE);
1333         btrfs_set_chunk_owner(buf, chunk, BTRFS_EXTENT_TREE_OBJECTID);
1334         btrfs_set_chunk_stripe_len(buf, chunk, 64 * 1024);
1335         btrfs_set_chunk_type(buf, chunk, BTRFS_BLOCK_GROUP_SYSTEM);
1336         btrfs_set_chunk_io_align(buf, chunk, cfg->sectorsize);
1337         btrfs_set_chunk_io_width(buf, chunk, cfg->sectorsize);
1338         btrfs_set_chunk_sector_size(buf, chunk, cfg->sectorsize);
1339         btrfs_set_chunk_num_stripes(buf, chunk, 1);
1340         btrfs_set_stripe_devid_nr(buf, chunk, 0, 1);
1341         btrfs_set_stripe_offset_nr(buf, chunk, 0, 0);
1342         nritems++;
1343
1344         write_extent_buffer(buf, super.dev_item.uuid,
1345                             (unsigned long)btrfs_stripe_dev_uuid(&chunk->stripe),
1346                             BTRFS_UUID_SIZE);
1347
1348         /* copy the key for the chunk to the system array */
1349         ptr = super.sys_chunk_array;
1350         array_size = sizeof(disk_key);
1351
1352         memcpy(ptr, &disk_key, sizeof(disk_key));
1353         ptr += sizeof(disk_key);
1354
1355         /* copy the chunk to the system array */
1356         read_extent_buffer(buf, ptr, (unsigned long)chunk, item_size);
1357         array_size += item_size;
1358         ptr += item_size;
1359         btrfs_set_super_sys_array_size(&super, array_size);
1360
1361         btrfs_set_header_bytenr(buf, cfg->blocks[3]);
1362         btrfs_set_header_owner(buf, BTRFS_CHUNK_TREE_OBJECTID);
1363         btrfs_set_header_nritems(buf, nritems);
1364         csum_tree_block_size(buf, BTRFS_CRC32_SIZE, 0);
1365         ret = pwrite(fd, buf->data, cfg->nodesize, cfg->blocks[3]);
1366         if (ret != cfg->nodesize) {
1367                 ret = (ret < 0 ? -errno : -EIO);
1368                 goto out;
1369         }
1370
1371         /* create the device tree */
1372         memset(buf->data + sizeof(struct btrfs_header), 0,
1373                 cfg->nodesize - sizeof(struct btrfs_header));
1374         nritems = 0;
1375         itemoff = __BTRFS_LEAF_DATA_SIZE(cfg->nodesize) -
1376                 sizeof(struct btrfs_dev_extent);
1377
1378         btrfs_set_disk_key_objectid(&disk_key, 1);
1379         btrfs_set_disk_key_offset(&disk_key, 0);
1380         btrfs_set_disk_key_type(&disk_key, BTRFS_DEV_EXTENT_KEY);
1381         btrfs_set_item_key(buf, &disk_key, nritems);
1382         btrfs_set_item_offset(buf, btrfs_item_nr(nritems), itemoff);
1383         btrfs_set_item_size(buf, btrfs_item_nr(nritems),
1384                             sizeof(struct btrfs_dev_extent));
1385         dev_extent = btrfs_item_ptr(buf, nritems, struct btrfs_dev_extent);
1386         btrfs_set_dev_extent_chunk_tree(buf, dev_extent,
1387                                         BTRFS_CHUNK_TREE_OBJECTID);
1388         btrfs_set_dev_extent_chunk_objectid(buf, dev_extent,
1389                                         BTRFS_FIRST_CHUNK_TREE_OBJECTID);
1390         btrfs_set_dev_extent_chunk_offset(buf, dev_extent, 0);
1391
1392         write_extent_buffer(buf, chunk_tree_uuid,
1393                     (unsigned long)btrfs_dev_extent_chunk_tree_uuid(dev_extent),
1394                     BTRFS_UUID_SIZE);
1395
1396         btrfs_set_dev_extent_length(buf, dev_extent,
1397                                     BTRFS_MKFS_SYSTEM_GROUP_SIZE);
1398         nritems++;
1399
1400         btrfs_set_header_bytenr(buf, cfg->blocks[4]);
1401         btrfs_set_header_owner(buf, BTRFS_DEV_TREE_OBJECTID);
1402         btrfs_set_header_nritems(buf, nritems);
1403         csum_tree_block_size(buf, BTRFS_CRC32_SIZE, 0);
1404         ret = pwrite(fd, buf->data, cfg->nodesize, cfg->blocks[4]);
1405         if (ret != cfg->nodesize) {
1406                 ret = (ret < 0 ? -errno : -EIO);
1407                 goto out;
1408         }
1409
1410         /* create the FS root */
1411         memset(buf->data + sizeof(struct btrfs_header), 0,
1412                 cfg->nodesize - sizeof(struct btrfs_header));
1413         btrfs_set_header_bytenr(buf, cfg->blocks[5]);
1414         btrfs_set_header_owner(buf, BTRFS_FS_TREE_OBJECTID);
1415         btrfs_set_header_nritems(buf, 0);
1416         csum_tree_block_size(buf, BTRFS_CRC32_SIZE, 0);
1417         ret = pwrite(fd, buf->data, cfg->nodesize, cfg->blocks[5]);
1418         if (ret != cfg->nodesize) {
1419                 ret = (ret < 0 ? -errno : -EIO);
1420                 goto out;
1421         }
1422         /* finally create the csum root */
1423         memset(buf->data + sizeof(struct btrfs_header), 0,
1424                 cfg->nodesize - sizeof(struct btrfs_header));
1425         btrfs_set_header_bytenr(buf, cfg->blocks[6]);
1426         btrfs_set_header_owner(buf, BTRFS_CSUM_TREE_OBJECTID);
1427         btrfs_set_header_nritems(buf, 0);
1428         csum_tree_block_size(buf, BTRFS_CRC32_SIZE, 0);
1429         ret = pwrite(fd, buf->data, cfg->nodesize, cfg->blocks[6]);
1430         if (ret != cfg->nodesize) {
1431                 ret = (ret < 0 ? -errno : -EIO);
1432                 goto out;
1433         }
1434
1435         /* and write out the super block */
1436         memset(buf->data, 0, BTRFS_SUPER_INFO_SIZE);
1437         memcpy(buf->data, &super, sizeof(super));
1438         buf->len = BTRFS_SUPER_INFO_SIZE;
1439         csum_tree_block_size(buf, BTRFS_CRC32_SIZE, 0);
1440         ret = pwrite(fd, buf->data, BTRFS_SUPER_INFO_SIZE, cfg->blocks[0]);
1441         if (ret != BTRFS_SUPER_INFO_SIZE) {
1442                 ret = (ret < 0 ? -errno : -EIO);
1443                 goto out;
1444         }
1445
1446         ret = 0;
1447
1448 out:
1449         free(buf);
1450         return ret;
1451 }
1452
1453 static const struct btrfs_fs_feature {
1454         const char *name;
1455         u64 flag;
1456         const char *desc;
1457 } mkfs_features[] = {
1458         { "mixed-bg", BTRFS_FEATURE_INCOMPAT_MIXED_GROUPS,
1459                 "mixed data and metadata block groups" },
1460         { "extref", BTRFS_FEATURE_INCOMPAT_EXTENDED_IREF,
1461                 "increased hardlink limit per file to 65536" },
1462         { "raid56", BTRFS_FEATURE_INCOMPAT_RAID56,
1463                 "raid56 extended format" },
1464         { "skinny-metadata", BTRFS_FEATURE_INCOMPAT_SKINNY_METADATA,
1465                 "reduced-size metadata extent refs" },
1466         { "no-holes", BTRFS_FEATURE_INCOMPAT_NO_HOLES,
1467                 "no explicit hole extents for files" },
1468         /* Keep this one last */
1469         { "list-all", BTRFS_FEATURE_LIST_ALL, NULL }
1470 };
1471
1472 static int parse_one_fs_feature(const char *name, u64 *flags)
1473 {
1474         int i;
1475         int found = 0;
1476
1477         for (i = 0; i < ARRAY_SIZE(mkfs_features); i++) {
1478                 if (name[0] == '^' &&
1479                         !strcmp(mkfs_features[i].name, name + 1)) {
1480                         *flags &= ~ mkfs_features[i].flag;
1481                         found = 1;
1482                 } else if (!strcmp(mkfs_features[i].name, name)) {
1483                         *flags |= mkfs_features[i].flag;
1484                         found = 1;
1485                 }
1486         }
1487
1488         return !found;
1489 }
1490
1491 void btrfs_parse_features_to_string(char *buf, u64 flags)
1492 {
1493         int i;
1494
1495         buf[0] = 0;
1496
1497         for (i = 0; i < ARRAY_SIZE(mkfs_features); i++) {
1498                 if (flags & mkfs_features[i].flag) {
1499                         if (*buf)
1500                                 strcat(buf, ", ");
1501                         strcat(buf, mkfs_features[i].name);
1502                 }
1503         }
1504 }
1505
1506 void btrfs_process_fs_features(u64 flags)
1507 {
1508         int i;
1509
1510         for (i = 0; i < ARRAY_SIZE(mkfs_features); i++) {
1511                 if (flags & mkfs_features[i].flag) {
1512                         printf("Turning ON incompat feature '%s': %s\n",
1513                                 mkfs_features[i].name,
1514                                 mkfs_features[i].desc);
1515                 }
1516         }
1517 }
1518
1519 void btrfs_list_all_fs_features(u64 mask_disallowed)
1520 {
1521         int i;
1522
1523         fprintf(stderr, "Filesystem features available:\n");
1524         for (i = 0; i < ARRAY_SIZE(mkfs_features) - 1; i++) {
1525                 char *is_default = "";
1526
1527                 if (mkfs_features[i].flag & mask_disallowed)
1528                         continue;
1529                 if (mkfs_features[i].flag & BTRFS_MKFS_DEFAULT_FEATURES)
1530                         is_default = ", default";
1531                 fprintf(stderr, "%-20s- %s (0x%llx%s)\n",
1532                                 mkfs_features[i].name,
1533                                 mkfs_features[i].desc,
1534                                 mkfs_features[i].flag,
1535                                 is_default);
1536         }
1537 }
1538
1539 /*
1540  * Return NULL if all features were parsed fine, otherwise return the name of
1541  * the first unparsed.
1542  */
1543 char* btrfs_parse_fs_features(char *namelist, u64 *flags)
1544 {
1545         char *this_char;
1546         char *save_ptr = NULL; /* Satisfy static checkers */
1547
1548         for (this_char = strtok_r(namelist, ",", &save_ptr);
1549              this_char != NULL;
1550              this_char = strtok_r(NULL, ",", &save_ptr)) {
1551                 if (parse_one_fs_feature(this_char, flags))
1552                         return this_char;
1553         }
1554
1555         return NULL;
1556 }
1557
1558 u64 btrfs_device_size(int fd, struct stat *st)
1559 {
1560         u64 size;
1561         if (S_ISREG(st->st_mode)) {
1562                 return st->st_size;
1563         }
1564         if (!S_ISBLK(st->st_mode)) {
1565                 return 0;
1566         }
1567         if (ioctl(fd, BLKGETSIZE64, &size) >= 0) {
1568                 return size;
1569         }
1570         return 0;
1571 }
1572
1573 static int zero_blocks(int fd, off_t start, size_t len)
1574 {
1575         char *buf = malloc(len);
1576         int ret = 0;
1577         ssize_t written;
1578
1579         if (!buf)
1580                 return -ENOMEM;
1581         memset(buf, 0, len);
1582         written = pwrite(fd, buf, len, start);
1583         if (written != len)
1584                 ret = -EIO;
1585         free(buf);
1586         return ret;
1587 }
1588
1589 #define ZERO_DEV_BYTES (2 * 1024 * 1024)
1590
1591 /* don't write outside the device by clamping the region to the device size */
1592 static int zero_dev_clamped(int fd, off_t start, ssize_t len, u64 dev_size)
1593 {
1594         off_t end = max(start, start + len);
1595
1596 #ifdef __sparc__
1597         /* and don't overwrite the disk labels on sparc */
1598         start = max(start, 1024);
1599         end = max(end, 1024);
1600 #endif
1601
1602         start = min_t(u64, start, dev_size);
1603         end = min_t(u64, end, dev_size);
1604
1605         return zero_blocks(fd, start, end - start);
1606 }
1607
1608 int btrfs_add_to_fsid(struct btrfs_trans_handle *trans,
1609                       struct btrfs_root *root, int fd, char *path,
1610                       u64 device_total_bytes, u32 io_width, u32 io_align,
1611                       u32 sectorsize)
1612 {
1613         struct btrfs_super_block *disk_super;
1614         struct btrfs_super_block *super = root->fs_info->super_copy;
1615         struct btrfs_device *device;
1616         struct btrfs_dev_item *dev_item;
1617         char *buf = NULL;
1618         u64 fs_total_bytes;
1619         u64 num_devs;
1620         int ret;
1621
1622         device_total_bytes = (device_total_bytes / sectorsize) * sectorsize;
1623
1624         device = kzalloc(sizeof(*device), GFP_NOFS);
1625         if (!device)
1626                 goto err_nomem;
1627         buf = kzalloc(sectorsize, GFP_NOFS);
1628         if (!buf)
1629                 goto err_nomem;
1630         BUG_ON(sizeof(*disk_super) > sectorsize);
1631
1632         disk_super = (struct btrfs_super_block *)buf;
1633         dev_item = &disk_super->dev_item;
1634
1635         uuid_generate(device->uuid);
1636         device->devid = 0;
1637         device->type = 0;
1638         device->io_width = io_width;
1639         device->io_align = io_align;
1640         device->sector_size = sectorsize;
1641         device->fd = fd;
1642         device->writeable = 1;
1643         device->total_bytes = device_total_bytes;
1644         device->bytes_used = 0;
1645         device->total_ios = 0;
1646         device->dev_root = root->fs_info->dev_root;
1647         device->name = strdup(path);
1648         if (!device->name)
1649                 goto err_nomem;
1650
1651         INIT_LIST_HEAD(&device->dev_list);
1652         ret = btrfs_add_device(trans, root, device);
1653         BUG_ON(ret);
1654
1655         fs_total_bytes = btrfs_super_total_bytes(super) + device_total_bytes;
1656         btrfs_set_super_total_bytes(super, fs_total_bytes);
1657
1658         num_devs = btrfs_super_num_devices(super) + 1;
1659         btrfs_set_super_num_devices(super, num_devs);
1660
1661         memcpy(disk_super, super, sizeof(*disk_super));
1662
1663         btrfs_set_super_bytenr(disk_super, BTRFS_SUPER_INFO_OFFSET);
1664         btrfs_set_stack_device_id(dev_item, device->devid);
1665         btrfs_set_stack_device_type(dev_item, device->type);
1666         btrfs_set_stack_device_io_align(dev_item, device->io_align);
1667         btrfs_set_stack_device_io_width(dev_item, device->io_width);
1668         btrfs_set_stack_device_sector_size(dev_item, device->sector_size);
1669         btrfs_set_stack_device_total_bytes(dev_item, device->total_bytes);
1670         btrfs_set_stack_device_bytes_used(dev_item, device->bytes_used);
1671         memcpy(&dev_item->uuid, device->uuid, BTRFS_UUID_SIZE);
1672
1673         ret = pwrite(fd, buf, sectorsize, BTRFS_SUPER_INFO_OFFSET);
1674         BUG_ON(ret != sectorsize);
1675
1676         kfree(buf);
1677         list_add(&device->dev_list, &root->fs_info->fs_devices->devices);
1678         device->fs_devices = root->fs_info->fs_devices;
1679         return 0;
1680
1681 err_nomem:
1682         kfree(device);
1683         kfree(buf);
1684         return -ENOMEM;
1685 }
1686
1687 static int btrfs_wipe_existing_sb(int fd)
1688 {
1689         const char *off = NULL;
1690         size_t len = 0;
1691         loff_t offset;
1692         char buf[BUFSIZ];
1693         int ret = 0;
1694         blkid_probe pr = NULL;
1695
1696         pr = blkid_new_probe();
1697         if (!pr)
1698                 return -1;
1699
1700         if (blkid_probe_set_device(pr, fd, 0, 0)) {
1701                 ret = -1;
1702                 goto out;
1703         }
1704
1705         ret = blkid_probe_lookup_value(pr, "SBMAGIC_OFFSET", &off, NULL);
1706         if (!ret)
1707                 ret = blkid_probe_lookup_value(pr, "SBMAGIC", NULL, &len);
1708
1709         if (ret || len == 0 || off == NULL) {
1710                 /*
1711                  * If lookup fails, the probe did not find any values, eg. for
1712                  * a file image or a loop device. Soft error.
1713                  */
1714                 ret = 1;
1715                 goto out;
1716         }
1717
1718         offset = strtoll(off, NULL, 10);
1719         if (len > sizeof(buf))
1720                 len = sizeof(buf);
1721
1722         memset(buf, 0, len);
1723         ret = pwrite(fd, buf, len, offset);
1724         if (ret < 0) {
1725                 error("cannot wipe existing superblock: %s", strerror(errno));
1726                 ret = -1;
1727         } else if (ret != len) {
1728                 error("cannot wipe existing superblock: wrote %d of %zd", ret, len);
1729                 ret = -1;
1730         }
1731         fsync(fd);
1732
1733 out:
1734         blkid_free_probe(pr);
1735         return ret;
1736 }
1737
1738 int btrfs_prepare_device(int fd, const char *file, u64 *block_count_ret,
1739                 u64 max_block_count, unsigned opflags)
1740 {
1741         u64 block_count;
1742         struct stat st;
1743         int i, ret;
1744
1745         ret = fstat(fd, &st);
1746         if (ret < 0) {
1747                 error("unable to stat %s: %s", file, strerror(errno));
1748                 return 1;
1749         }
1750
1751         block_count = btrfs_device_size(fd, &st);
1752         if (block_count == 0) {
1753                 error("unable to determine size of %s", file);
1754                 return 1;
1755         }
1756         if (max_block_count)
1757                 block_count = min(block_count, max_block_count);
1758
1759         if (opflags & PREP_DEVICE_DISCARD) {
1760                 /*
1761                  * We intentionally ignore errors from the discard ioctl.  It
1762                  * is not necessary for the mkfs functionality but just an
1763                  * optimization.
1764                  */
1765                 if (discard_range(fd, 0, 0) == 0) {
1766                         if (opflags & PREP_DEVICE_VERBOSE)
1767                                 printf("Performing full device TRIM (%s) ...\n",
1768                                                 pretty_size(block_count));
1769                         discard_blocks(fd, 0, block_count);
1770                 }
1771         }
1772
1773         ret = zero_dev_clamped(fd, 0, ZERO_DEV_BYTES, block_count);
1774         for (i = 0 ; !ret && i < BTRFS_SUPER_MIRROR_MAX; i++)
1775                 ret = zero_dev_clamped(fd, btrfs_sb_offset(i),
1776                                        BTRFS_SUPER_INFO_SIZE, block_count);
1777         if (!ret && (opflags & PREP_DEVICE_ZERO_END))
1778                 ret = zero_dev_clamped(fd, block_count - ZERO_DEV_BYTES,
1779                                        ZERO_DEV_BYTES, block_count);
1780
1781         if (ret < 0) {
1782                 error("failed to zero device '%s': %s", file, strerror(-ret));
1783                 return 1;
1784         }
1785
1786         ret = btrfs_wipe_existing_sb(fd);
1787         if (ret < 0) {
1788                 error("cannot wipe superblocks on %s", file);
1789                 return 1;
1790         }
1791
1792         *block_count_ret = block_count;
1793         return 0;
1794 }
1795
1796 int btrfs_make_root_dir(struct btrfs_trans_handle *trans,
1797                         struct btrfs_root *root, u64 objectid)
1798 {
1799         int ret;
1800         struct btrfs_inode_item inode_item;
1801         time_t now = time(NULL);
1802
1803         memset(&inode_item, 0, sizeof(inode_item));
1804         btrfs_set_stack_inode_generation(&inode_item, trans->transid);
1805         btrfs_set_stack_inode_size(&inode_item, 0);
1806         btrfs_set_stack_inode_nlink(&inode_item, 1);
1807         btrfs_set_stack_inode_nbytes(&inode_item, root->nodesize);
1808         btrfs_set_stack_inode_mode(&inode_item, S_IFDIR | 0755);
1809         btrfs_set_stack_timespec_sec(&inode_item.atime, now);
1810         btrfs_set_stack_timespec_nsec(&inode_item.atime, 0);
1811         btrfs_set_stack_timespec_sec(&inode_item.ctime, now);
1812         btrfs_set_stack_timespec_nsec(&inode_item.ctime, 0);
1813         btrfs_set_stack_timespec_sec(&inode_item.mtime, now);
1814         btrfs_set_stack_timespec_nsec(&inode_item.mtime, 0);
1815         btrfs_set_stack_timespec_sec(&inode_item.otime, 0);
1816         btrfs_set_stack_timespec_nsec(&inode_item.otime, 0);
1817
1818         if (root->fs_info->tree_root == root)
1819                 btrfs_set_super_root_dir(root->fs_info->super_copy, objectid);
1820
1821         ret = btrfs_insert_inode(trans, root, objectid, &inode_item);
1822         if (ret)
1823                 goto error;
1824
1825         ret = btrfs_insert_inode_ref(trans, root, "..", 2, objectid, objectid, 0);
1826         if (ret)
1827                 goto error;
1828
1829         btrfs_set_root_dirid(&root->root_item, objectid);
1830         ret = 0;
1831 error:
1832         return ret;
1833 }
1834
1835 /*
1836  * checks if a path is a block device node
1837  * Returns negative errno on failure, otherwise
1838  * returns 1 for blockdev, 0 for not-blockdev
1839  */
1840 int is_block_device(const char *path)
1841 {
1842         struct stat statbuf;
1843
1844         if (stat(path, &statbuf) < 0)
1845                 return -errno;
1846
1847         return !!S_ISBLK(statbuf.st_mode);
1848 }
1849
1850 /*
1851  * check if given path is a mount point
1852  * return 1 if yes. 0 if no. -1 for error
1853  */
1854 int is_mount_point(const char *path)
1855 {
1856         FILE *f;
1857         struct mntent *mnt;
1858         int ret = 0;
1859
1860         f = setmntent("/proc/self/mounts", "r");
1861         if (f == NULL)
1862                 return -1;
1863
1864         while ((mnt = getmntent(f)) != NULL) {
1865                 if (strcmp(mnt->mnt_dir, path))
1866                         continue;
1867                 ret = 1;
1868                 break;
1869         }
1870         endmntent(f);
1871         return ret;
1872 }
1873
1874 static int is_reg_file(const char *path)
1875 {
1876         struct stat statbuf;
1877
1878         if (stat(path, &statbuf) < 0)
1879                 return -errno;
1880         return S_ISREG(statbuf.st_mode);
1881 }
1882
1883 /*
1884  * This function checks if the given input parameter is
1885  * an uuid or a path
1886  * return <0 : some error in the given input
1887  * return BTRFS_ARG_UNKNOWN:    unknown input
1888  * return BTRFS_ARG_UUID:       given input is uuid
1889  * return BTRFS_ARG_MNTPOINT:   given input is path
1890  * return BTRFS_ARG_REG:        given input is regular file
1891  * return BTRFS_ARG_BLKDEV:     given input is block device
1892  */
1893 int check_arg_type(const char *input)
1894 {
1895         uuid_t uuid;
1896         char path[PATH_MAX];
1897
1898         if (!input)
1899                 return -EINVAL;
1900
1901         if (realpath(input, path)) {
1902                 if (is_block_device(path) == 1)
1903                         return BTRFS_ARG_BLKDEV;
1904
1905                 if (is_mount_point(path) == 1)
1906                         return BTRFS_ARG_MNTPOINT;
1907
1908                 if (is_reg_file(path))
1909                         return BTRFS_ARG_REG;
1910
1911                 return BTRFS_ARG_UNKNOWN;
1912         }
1913
1914         if (strlen(input) == (BTRFS_UUID_UNPARSED_SIZE - 1) &&
1915                 !uuid_parse(input, uuid))
1916                 return BTRFS_ARG_UUID;
1917
1918         return BTRFS_ARG_UNKNOWN;
1919 }
1920
1921 /*
1922  * Find the mount point for a mounted device.
1923  * On success, returns 0 with mountpoint in *mp.
1924  * On failure, returns -errno (not mounted yields -EINVAL)
1925  * Is noisy on failures, expects to be given a mounted device.
1926  */
1927 int get_btrfs_mount(const char *dev, char *mp, size_t mp_size)
1928 {
1929         int ret;
1930         int fd = -1;
1931
1932         ret = is_block_device(dev);
1933         if (ret <= 0) {
1934                 if (!ret) {
1935                         error("not a block device: %s", dev);
1936                         ret = -EINVAL;
1937                 } else {
1938                         error("cannot check %s: %s", dev, strerror(-ret));
1939                 }
1940                 goto out;
1941         }
1942
1943         fd = open(dev, O_RDONLY);
1944         if (fd < 0) {
1945                 ret = -errno;
1946                 error("cannot open %s: %s", dev, strerror(errno));
1947                 goto out;
1948         }
1949
1950         ret = check_mounted_where(fd, dev, mp, mp_size, NULL);
1951         if (!ret) {
1952                 ret = -EINVAL;
1953         } else { /* mounted, all good */
1954                 ret = 0;
1955         }
1956 out:
1957         if (fd != -1)
1958                 close(fd);
1959         return ret;
1960 }
1961
1962 /*
1963  * Given a pathname, return a filehandle to:
1964  *      the original pathname or,
1965  *      if the pathname is a mounted btrfs device, to its mountpoint.
1966  *
1967  * On error, return -1, errno should be set.
1968  */
1969 int open_path_or_dev_mnt(const char *path, DIR **dirstream, int verbose)
1970 {
1971         char mp[PATH_MAX];
1972         int ret;
1973
1974         if (is_block_device(path)) {
1975                 ret = get_btrfs_mount(path, mp, sizeof(mp));
1976                 if (ret < 0) {
1977                         /* not a mounted btrfs dev */
1978                         error_on(verbose, "'%s' is not a mounted btrfs device",
1979                                  path);
1980                         errno = EINVAL;
1981                         return -1;
1982                 }
1983                 ret = open_file_or_dir(mp, dirstream);
1984                 error_on(verbose && ret < 0, "can't access '%s': %s",
1985                          path, strerror(errno));
1986         } else {
1987                 ret = btrfs_open_dir(path, dirstream, 1);
1988         }
1989
1990         return ret;
1991 }
1992
1993 /*
1994  * Do the following checks before calling open_file_or_dir():
1995  * 1: path is in a btrfs filesystem
1996  * 2: path is a directory
1997  */
1998 int btrfs_open_dir(const char *path, DIR **dirstream, int verbose)
1999 {
2000         struct statfs stfs;
2001         struct stat st;
2002         int ret;
2003
2004         if (statfs(path, &stfs) != 0) {
2005                 error_on(verbose, "cannot access '%s': %s", path,
2006                                 strerror(errno));
2007                 return -1;
2008         }
2009
2010         if (stfs.f_type != BTRFS_SUPER_MAGIC) {
2011                 error_on(verbose, "not a btrfs filesystem: %s", path);
2012                 return -2;
2013         }
2014
2015         if (stat(path, &st) != 0) {
2016                 error_on(verbose, "cannot access '%s': %s", path,
2017                                 strerror(errno));
2018                 return -1;
2019         }
2020
2021         if (!S_ISDIR(st.st_mode)) {
2022                 error_on(verbose, "not a directory: %s", path);
2023                 return -3;
2024         }
2025
2026         ret = open_file_or_dir(path, dirstream);
2027         if (ret < 0) {
2028                 error_on(verbose, "cannot access '%s': %s", path,
2029                                 strerror(errno));
2030         }
2031
2032         return ret;
2033 }
2034
2035 /* checks if a device is a loop device */
2036 static int is_loop_device (const char* device) {
2037         struct stat statbuf;
2038
2039         if(stat(device, &statbuf) < 0)
2040                 return -errno;
2041
2042         return (S_ISBLK(statbuf.st_mode) &&
2043                 MAJOR(statbuf.st_rdev) == LOOP_MAJOR);
2044 }
2045
2046 /*
2047  * Takes a loop device path (e.g. /dev/loop0) and returns
2048  * the associated file (e.g. /images/my_btrfs.img) using
2049  * loopdev API
2050  */
2051 static int resolve_loop_device_with_loopdev(const char* loop_dev, char* loop_file)
2052 {
2053         int fd;
2054         int ret;
2055         struct loop_info64 lo64;
2056
2057         fd = open(loop_dev, O_RDONLY | O_NONBLOCK);
2058         if (fd < 0)
2059                 return -errno;
2060         ret = ioctl(fd, LOOP_GET_STATUS64, &lo64);
2061         if (ret < 0) {
2062                 ret = -errno;
2063                 goto out;
2064         }
2065
2066         memcpy(loop_file, lo64.lo_file_name, sizeof(lo64.lo_file_name));
2067         loop_file[sizeof(lo64.lo_file_name)] = 0;
2068
2069 out:
2070         close(fd);
2071
2072         return ret;
2073 }
2074
2075 /* Takes a loop device path (e.g. /dev/loop0) and returns
2076  * the associated file (e.g. /images/my_btrfs.img) */
2077 static int resolve_loop_device(const char* loop_dev, char* loop_file,
2078                 int max_len)
2079 {
2080         int ret;
2081         FILE *f;
2082         char fmt[20];
2083         char p[PATH_MAX];
2084         char real_loop_dev[PATH_MAX];
2085
2086         if (!realpath(loop_dev, real_loop_dev))
2087                 return -errno;
2088         snprintf(p, PATH_MAX, "/sys/block/%s/loop/backing_file", strrchr(real_loop_dev, '/'));
2089         if (!(f = fopen(p, "r"))) {
2090                 if (errno == ENOENT)
2091                         /*
2092                          * It's possibly a partitioned loop device, which is
2093                          * resolvable with loopdev API.
2094                          */
2095                         return resolve_loop_device_with_loopdev(loop_dev, loop_file);
2096                 return -errno;
2097         }
2098
2099         snprintf(fmt, 20, "%%%i[^\n]", max_len-1);
2100         ret = fscanf(f, fmt, loop_file);
2101         fclose(f);
2102         if (ret == EOF)
2103                 return -errno;
2104
2105         return 0;
2106 }
2107
2108 /*
2109  * Checks whether a and b are identical or device
2110  * files associated with the same block device
2111  */
2112 static int is_same_blk_file(const char* a, const char* b)
2113 {
2114         struct stat st_buf_a, st_buf_b;
2115         char real_a[PATH_MAX];
2116         char real_b[PATH_MAX];
2117
2118         if (!realpath(a, real_a))
2119                 strncpy_null(real_a, a);
2120
2121         if (!realpath(b, real_b))
2122                 strncpy_null(real_b, b);
2123
2124         /* Identical path? */
2125         if (strcmp(real_a, real_b) == 0)
2126                 return 1;
2127
2128         if (stat(a, &st_buf_a) < 0 || stat(b, &st_buf_b) < 0) {
2129                 if (errno == ENOENT)
2130                         return 0;
2131                 return -errno;
2132         }
2133
2134         /* Same blockdevice? */
2135         if (S_ISBLK(st_buf_a.st_mode) && S_ISBLK(st_buf_b.st_mode) &&
2136             st_buf_a.st_rdev == st_buf_b.st_rdev) {
2137                 return 1;
2138         }
2139
2140         /* Hardlink? */
2141         if (st_buf_a.st_dev == st_buf_b.st_dev &&
2142             st_buf_a.st_ino == st_buf_b.st_ino) {
2143                 return 1;
2144         }
2145
2146         return 0;
2147 }
2148
2149 /* checks if a and b are identical or device
2150  * files associated with the same block device or
2151  * if one file is a loop device that uses the other
2152  * file.
2153  */
2154 static int is_same_loop_file(const char* a, const char* b)
2155 {
2156         char res_a[PATH_MAX];
2157         char res_b[PATH_MAX];
2158         const char* final_a = NULL;
2159         const char* final_b = NULL;
2160         int ret;
2161
2162         /* Resolve a if it is a loop device */
2163         if((ret = is_loop_device(a)) < 0) {
2164                 if (ret == -ENOENT)
2165                         return 0;
2166                 return ret;
2167         } else if (ret) {
2168                 ret = resolve_loop_device(a, res_a, sizeof(res_a));
2169                 if (ret < 0) {
2170                         if (errno != EPERM)
2171                                 return ret;
2172                 } else {
2173                         final_a = res_a;
2174                 }
2175         } else {
2176                 final_a = a;
2177         }
2178
2179         /* Resolve b if it is a loop device */
2180         if ((ret = is_loop_device(b)) < 0) {
2181                 if (ret == -ENOENT)
2182                         return 0;
2183                 return ret;
2184         } else if (ret) {
2185                 ret = resolve_loop_device(b, res_b, sizeof(res_b));
2186                 if (ret < 0) {
2187                         if (errno != EPERM)
2188                                 return ret;
2189                 } else {
2190                         final_b = res_b;
2191                 }
2192         } else {
2193                 final_b = b;
2194         }
2195
2196         return is_same_blk_file(final_a, final_b);
2197 }
2198
2199 /* Checks if a file exists and is a block or regular file*/
2200 static int is_existing_blk_or_reg_file(const char* filename)
2201 {
2202         struct stat st_buf;
2203
2204         if(stat(filename, &st_buf) < 0) {
2205                 if(errno == ENOENT)
2206                         return 0;
2207                 else
2208                         return -errno;
2209         }
2210
2211         return (S_ISBLK(st_buf.st_mode) || S_ISREG(st_buf.st_mode));
2212 }
2213
2214 /* Checks if a file is used (directly or indirectly via a loop device)
2215  * by a device in fs_devices
2216  */
2217 static int blk_file_in_dev_list(struct btrfs_fs_devices* fs_devices,
2218                 const char* file)
2219 {
2220         int ret;
2221         struct list_head *head;
2222         struct list_head *cur;
2223         struct btrfs_device *device;
2224
2225         head = &fs_devices->devices;
2226         list_for_each(cur, head) {
2227                 device = list_entry(cur, struct btrfs_device, dev_list);
2228
2229                 if((ret = is_same_loop_file(device->name, file)))
2230                         return ret;
2231         }
2232
2233         return 0;
2234 }
2235
2236 /*
2237  * Resolve a pathname to a device mapper node to /dev/mapper/<name>
2238  * Returns NULL on invalid input or malloc failure; Other failures
2239  * will be handled by the caller using the input pathame.
2240  */
2241 char *canonicalize_dm_name(const char *ptname)
2242 {
2243         FILE    *f;
2244         size_t  sz;
2245         char    path[PATH_MAX], name[PATH_MAX], *res = NULL;
2246
2247         if (!ptname || !*ptname)
2248                 return NULL;
2249
2250         snprintf(path, sizeof(path), "/sys/block/%s/dm/name", ptname);
2251         if (!(f = fopen(path, "r")))
2252                 return NULL;
2253
2254         /* read <name>\n from sysfs */
2255         if (fgets(name, sizeof(name), f) && (sz = strlen(name)) > 1) {
2256                 name[sz - 1] = '\0';
2257                 snprintf(path, sizeof(path), "/dev/mapper/%s", name);
2258
2259                 if (access(path, F_OK) == 0)
2260                         res = strdup(path);
2261         }
2262         fclose(f);
2263         return res;
2264 }
2265
2266 /*
2267  * Resolve a pathname to a canonical device node, e.g. /dev/sda1 or
2268  * to a device mapper pathname.
2269  * Returns NULL on invalid input or malloc failure; Other failures
2270  * will be handled by the caller using the input pathame.
2271  */
2272 char *canonicalize_path(const char *path)
2273 {
2274         char *canonical, *p;
2275
2276         if (!path || !*path)
2277                 return NULL;
2278
2279         canonical = realpath(path, NULL);
2280         if (!canonical)
2281                 return strdup(path);
2282         p = strrchr(canonical, '/');
2283         if (p && strncmp(p, "/dm-", 4) == 0 && isdigit(*(p + 4))) {
2284                 char *dm = canonicalize_dm_name(p + 1);
2285
2286                 if (dm) {
2287                         free(canonical);
2288                         return dm;
2289                 }
2290         }
2291         return canonical;
2292 }
2293
2294 /*
2295  * returns 1 if the device was mounted, < 0 on error or 0 if everything
2296  * is safe to continue.
2297  */
2298 int check_mounted(const char* file)
2299 {
2300         int fd;
2301         int ret;
2302
2303         fd = open(file, O_RDONLY);
2304         if (fd < 0) {
2305                 error("mount check: cannot open %s: %s", file,
2306                                 strerror(errno));
2307                 return -errno;
2308         }
2309
2310         ret =  check_mounted_where(fd, file, NULL, 0, NULL);
2311         close(fd);
2312
2313         return ret;
2314 }
2315
2316 int check_mounted_where(int fd, const char *file, char *where, int size,
2317                         struct btrfs_fs_devices **fs_dev_ret)
2318 {
2319         int ret;
2320         u64 total_devs = 1;
2321         int is_btrfs;
2322         struct btrfs_fs_devices *fs_devices_mnt = NULL;
2323         FILE *f;
2324         struct mntent *mnt;
2325
2326         /* scan the initial device */
2327         ret = btrfs_scan_one_device(fd, file, &fs_devices_mnt,
2328                     &total_devs, BTRFS_SUPER_INFO_OFFSET, SBREAD_DEFAULT);
2329         is_btrfs = (ret >= 0);
2330
2331         /* scan other devices */
2332         if (is_btrfs && total_devs > 1) {
2333                 ret = btrfs_scan_lblkid();
2334                 if (ret)
2335                         return ret;
2336         }
2337
2338         /* iterate over the list of currently mounted filesystems */
2339         if ((f = setmntent ("/proc/self/mounts", "r")) == NULL)
2340                 return -errno;
2341
2342         while ((mnt = getmntent (f)) != NULL) {
2343                 if(is_btrfs) {
2344                         if(strcmp(mnt->mnt_type, "btrfs") != 0)
2345                                 continue;
2346
2347                         ret = blk_file_in_dev_list(fs_devices_mnt, mnt->mnt_fsname);
2348                 } else {
2349                         /* ignore entries in the mount table that are not
2350                            associated with a file*/
2351                         if((ret = is_existing_blk_or_reg_file(mnt->mnt_fsname)) < 0)
2352                                 goto out_mntloop_err;
2353                         else if(!ret)
2354                                 continue;
2355
2356                         ret = is_same_loop_file(file, mnt->mnt_fsname);
2357                 }
2358
2359                 if(ret < 0)
2360                         goto out_mntloop_err;
2361                 else if(ret)
2362                         break;
2363         }
2364
2365         /* Did we find an entry in mnt table? */
2366         if (mnt && size && where) {
2367                 strncpy(where, mnt->mnt_dir, size);
2368                 where[size-1] = 0;
2369         }
2370         if (fs_dev_ret)
2371                 *fs_dev_ret = fs_devices_mnt;
2372
2373         ret = (mnt != NULL);
2374
2375 out_mntloop_err:
2376         endmntent (f);
2377
2378         return ret;
2379 }
2380
2381 struct pending_dir {
2382         struct list_head list;
2383         char name[PATH_MAX];
2384 };
2385
2386 int btrfs_register_one_device(const char *fname)
2387 {
2388         struct btrfs_ioctl_vol_args args;
2389         int fd;
2390         int ret;
2391
2392         fd = open("/dev/btrfs-control", O_RDWR);
2393         if (fd < 0) {
2394                 warning(
2395         "failed to open /dev/btrfs-control, skipping device registration: %s",
2396                         strerror(errno));
2397                 return -errno;
2398         }
2399         memset(&args, 0, sizeof(args));
2400         strncpy_null(args.name, fname);
2401         ret = ioctl(fd, BTRFS_IOC_SCAN_DEV, &args);
2402         if (ret < 0) {
2403                 error("device scan failed on '%s': %s", fname,
2404                                 strerror(errno));
2405                 ret = -errno;
2406         }
2407         close(fd);
2408         return ret;
2409 }
2410
2411 /*
2412  * Register all devices in the fs_uuid list created in the user
2413  * space. Ensure btrfs_scan_lblkid() is called before this func.
2414  */
2415 int btrfs_register_all_devices(void)
2416 {
2417         int err = 0;
2418         int ret = 0;
2419         struct btrfs_fs_devices *fs_devices;
2420         struct btrfs_device *device;
2421         struct list_head *all_uuids;
2422
2423         all_uuids = btrfs_scanned_uuids();
2424
2425         list_for_each_entry(fs_devices, all_uuids, list) {
2426                 list_for_each_entry(device, &fs_devices->devices, dev_list) {
2427                         if (*device->name)
2428                                 err = btrfs_register_one_device(device->name);
2429
2430                         if (err)
2431                                 ret++;
2432                 }
2433         }
2434
2435         return ret;
2436 }
2437
2438 int btrfs_device_already_in_root(struct btrfs_root *root, int fd,
2439                                  int super_offset)
2440 {
2441         struct btrfs_super_block *disk_super;
2442         char *buf;
2443         int ret = 0;
2444
2445         buf = malloc(BTRFS_SUPER_INFO_SIZE);
2446         if (!buf) {
2447                 ret = -ENOMEM;
2448                 goto out;
2449         }
2450         ret = pread(fd, buf, BTRFS_SUPER_INFO_SIZE, super_offset);
2451         if (ret != BTRFS_SUPER_INFO_SIZE)
2452                 goto brelse;
2453
2454         ret = 0;
2455         disk_super = (struct btrfs_super_block *)buf;
2456         /*
2457          * Accept devices from the same filesystem, allow partially created
2458          * structures.
2459          */
2460         if (btrfs_super_magic(disk_super) != BTRFS_MAGIC &&
2461                         btrfs_super_magic(disk_super) != BTRFS_MAGIC_PARTIAL)
2462                 goto brelse;
2463
2464         if (!memcmp(disk_super->fsid, root->fs_info->super_copy->fsid,
2465                     BTRFS_FSID_SIZE))
2466                 ret = 1;
2467 brelse:
2468         free(buf);
2469 out:
2470         return ret;
2471 }
2472
2473 /*
2474  * Note: this function uses a static per-thread buffer. Do not call this
2475  * function more than 10 times within one argument list!
2476  */
2477 const char *pretty_size_mode(u64 size, unsigned mode)
2478 {
2479         static __thread int ps_index = 0;
2480         static __thread char ps_array[10][32];
2481         char *ret;
2482
2483         ret = ps_array[ps_index];
2484         ps_index++;
2485         ps_index %= 10;
2486         (void)pretty_size_snprintf(size, ret, 32, mode);
2487
2488         return ret;
2489 }
2490
2491 static const char* unit_suffix_binary[] =
2492         { "B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB"};
2493 static const char* unit_suffix_decimal[] =
2494         { "B", "kB", "MB", "GB", "TB", "PB", "EB"};
2495
2496 int pretty_size_snprintf(u64 size, char *str, size_t str_size, unsigned unit_mode)
2497 {
2498         int num_divs;
2499         float fraction;
2500         u64 base = 0;
2501         int mult = 0;
2502         const char** suffix = NULL;
2503         u64 last_size;
2504
2505         if (str_size == 0)
2506                 return 0;
2507
2508         if ((unit_mode & ~UNITS_MODE_MASK) == UNITS_RAW) {
2509                 snprintf(str, str_size, "%llu", size);
2510                 return 0;
2511         }
2512
2513         if ((unit_mode & ~UNITS_MODE_MASK) == UNITS_BINARY) {
2514                 base = 1024;
2515                 mult = 1024;
2516                 suffix = unit_suffix_binary;
2517         } else if ((unit_mode & ~UNITS_MODE_MASK) == UNITS_DECIMAL) {
2518                 base = 1000;
2519                 mult = 1000;
2520                 suffix = unit_suffix_decimal;
2521         }
2522
2523         /* Unknown mode */
2524         if (!base) {
2525                 fprintf(stderr, "INTERNAL ERROR: unknown unit base, mode %d\n",
2526                                 unit_mode);
2527                 assert(0);
2528                 return -1;
2529         }
2530
2531         num_divs = 0;
2532         last_size = size;
2533         switch (unit_mode & UNITS_MODE_MASK) {
2534         case UNITS_TBYTES: base *= mult; num_divs++;
2535         case UNITS_GBYTES: base *= mult; num_divs++;
2536         case UNITS_MBYTES: base *= mult; num_divs++;
2537         case UNITS_KBYTES: num_divs++;
2538                            break;
2539         case UNITS_BYTES:
2540                            base = 1;
2541                            num_divs = 0;
2542                            break;
2543         default:
2544                 while (size >= mult) {
2545                         last_size = size;
2546                         size /= mult;
2547                         num_divs++;
2548                 }
2549                 /*
2550                  * If the value is smaller than base, we didn't do any
2551                  * division, in that case, base should be 1, not original
2552                  * base, or the unit will be wrong
2553                  */
2554                 if (num_divs == 0)
2555                         base = 1;
2556         }
2557
2558         if (num_divs >= ARRAY_SIZE(unit_suffix_binary)) {
2559                 str[0] = '\0';
2560                 printf("INTERNAL ERROR: unsupported unit suffix, index %d\n",
2561                                 num_divs);
2562                 assert(0);
2563                 return -1;
2564         }
2565         fraction = (float)last_size / base;
2566
2567         return snprintf(str, str_size, "%.2f%s", fraction, suffix[num_divs]);
2568 }
2569
2570 /*
2571  * __strncpy_null - strncpy with null termination
2572  * @dest:       the target array
2573  * @src:        the source string
2574  * @n:          maximum bytes to copy (size of *dest)
2575  *
2576  * Like strncpy, but ensures destination is null-terminated.
2577  *
2578  * Copies the string pointed to by src, including the terminating null
2579  * byte ('\0'), to the buffer pointed to by dest, up to a maximum
2580  * of n bytes.  Then ensure that dest is null-terminated.
2581  */
2582 char *__strncpy_null(char *dest, const char *src, size_t n)
2583 {
2584         strncpy(dest, src, n);
2585         if (n > 0)
2586                 dest[n - 1] = '\0';
2587         return dest;
2588 }
2589
2590 /*
2591  * Checks to make sure that the label matches our requirements.
2592  * Returns:
2593        0    if everything is safe and usable
2594       -1    if the label is too long
2595  */
2596 static int check_label(const char *input)
2597 {
2598        int len = strlen(input);
2599
2600        if (len > BTRFS_LABEL_SIZE - 1) {
2601                 error("label %s is too long (max %d)", input,
2602                                 BTRFS_LABEL_SIZE - 1);
2603                return -1;
2604        }
2605
2606        return 0;
2607 }
2608
2609 static int set_label_unmounted(const char *dev, const char *label)
2610 {
2611         struct btrfs_trans_handle *trans;
2612         struct btrfs_root *root;
2613         int ret;
2614
2615         ret = check_mounted(dev);
2616         if (ret < 0) {
2617                error("checking mount status of %s failed: %d", dev, ret);
2618                return -1;
2619         }
2620         if (ret > 0) {
2621                 error("device %s is mounted, use mount point", dev);
2622                 return -1;
2623         }
2624
2625         /* Open the super_block at the default location
2626          * and as read-write.
2627          */
2628         root = open_ctree(dev, 0, OPEN_CTREE_WRITES);
2629         if (!root) /* errors are printed by open_ctree() */
2630                 return -1;
2631
2632         trans = btrfs_start_transaction(root, 1);
2633         __strncpy_null(root->fs_info->super_copy->label, label, BTRFS_LABEL_SIZE - 1);
2634
2635         btrfs_commit_transaction(trans, root);
2636
2637         /* Now we close it since we are done. */
2638         close_ctree(root);
2639         return 0;
2640 }
2641
2642 static int set_label_mounted(const char *mount_path, const char *labelp)
2643 {
2644         int fd;
2645         char label[BTRFS_LABEL_SIZE];
2646
2647         fd = open(mount_path, O_RDONLY | O_NOATIME);
2648         if (fd < 0) {
2649                 error("unable to access %s: %s", mount_path, strerror(errno));
2650                 return -1;
2651         }
2652
2653         memset(label, 0, sizeof(label));
2654         __strncpy_null(label, labelp, BTRFS_LABEL_SIZE - 1);
2655         if (ioctl(fd, BTRFS_IOC_SET_FSLABEL, label) < 0) {
2656                 error("unable to set label of %s: %s", mount_path,
2657                                 strerror(errno));
2658                 close(fd);
2659                 return -1;
2660         }
2661
2662         close(fd);
2663         return 0;
2664 }
2665
2666 int get_label_unmounted(const char *dev, char *label)
2667 {
2668         struct btrfs_root *root;
2669         int ret;
2670
2671         ret = check_mounted(dev);
2672         if (ret < 0) {
2673                error("checking mount status of %s failed: %d", dev, ret);
2674                return -1;
2675         }
2676
2677         /* Open the super_block at the default location
2678          * and as read-only.
2679          */
2680         root = open_ctree(dev, 0, 0);
2681         if(!root)
2682                 return -1;
2683
2684         __strncpy_null(label, root->fs_info->super_copy->label,
2685                         BTRFS_LABEL_SIZE - 1);
2686
2687         /* Now we close it since we are done. */
2688         close_ctree(root);
2689         return 0;
2690 }
2691
2692 /*
2693  * If a partition is mounted, try to get the filesystem label via its
2694  * mounted path rather than device.  Return the corresponding error
2695  * the user specified the device path.
2696  */
2697 int get_label_mounted(const char *mount_path, char *labelp)
2698 {
2699         char label[BTRFS_LABEL_SIZE];
2700         int fd;
2701         int ret;
2702
2703         fd = open(mount_path, O_RDONLY | O_NOATIME);
2704         if (fd < 0) {
2705                 error("unable to access %s: %s", mount_path, strerror(errno));
2706                 return -1;
2707         }
2708
2709         memset(label, '\0', sizeof(label));
2710         ret = ioctl(fd, BTRFS_IOC_GET_FSLABEL, label);
2711         if (ret < 0) {
2712                 if (errno != ENOTTY)
2713                         error("unable to get label of %s: %s", mount_path,
2714                                         strerror(errno));
2715                 ret = -errno;
2716                 close(fd);
2717                 return ret;
2718         }
2719
2720         __strncpy_null(labelp, label, BTRFS_LABEL_SIZE - 1);
2721         close(fd);
2722         return 0;
2723 }
2724
2725 int get_label(const char *btrfs_dev, char *label)
2726 {
2727         int ret;
2728
2729         ret = is_existing_blk_or_reg_file(btrfs_dev);
2730         if (!ret)
2731                 ret = get_label_mounted(btrfs_dev, label);
2732         else if (ret > 0)
2733                 ret = get_label_unmounted(btrfs_dev, label);
2734
2735         return ret;
2736 }
2737
2738 int set_label(const char *btrfs_dev, const char *label)
2739 {
2740         int ret;
2741
2742         if (check_label(label))
2743                 return -1;
2744
2745         ret = is_existing_blk_or_reg_file(btrfs_dev);
2746         if (!ret)
2747                 ret = set_label_mounted(btrfs_dev, label);
2748         else if (ret > 0)
2749                 ret = set_label_unmounted(btrfs_dev, label);
2750
2751         return ret;
2752 }
2753
2754 /*
2755  * A not-so-good version fls64. No fascinating optimization since
2756  * no one except parse_size use it
2757  */
2758 static int fls64(u64 x)
2759 {
2760         int i;
2761
2762         for (i = 0; i <64; i++)
2763                 if (x << i & (1ULL << 63))
2764                         return 64 - i;
2765         return 64 - i;
2766 }
2767
2768 u64 parse_size(char *s)
2769 {
2770         char c;
2771         char *endptr;
2772         u64 mult = 1;
2773         u64 ret;
2774
2775         if (!s) {
2776                 error("size value is empty");
2777                 exit(1);
2778         }
2779         if (s[0] == '-') {
2780                 error("size value '%s' is less equal than 0", s);
2781                 exit(1);
2782         }
2783         ret = strtoull(s, &endptr, 10);
2784         if (endptr == s) {
2785                 error("size value '%s' is invalid", s);
2786                 exit(1);
2787         }
2788         if (endptr[0] && endptr[1]) {
2789                 error("illegal suffix contains character '%c' in wrong position",
2790                         endptr[1]);
2791                 exit(1);
2792         }
2793         /*
2794          * strtoll returns LLONG_MAX when overflow, if this happens,
2795          * need to call strtoull to get the real size
2796          */
2797         if (errno == ERANGE && ret == ULLONG_MAX) {
2798                 error("size value '%s' is too large for u64", s);
2799                 exit(1);
2800         }
2801         if (endptr[0]) {
2802                 c = tolower(endptr[0]);
2803                 switch (c) {
2804                 case 'e':
2805                         mult *= 1024;
2806                         /* fallthrough */
2807                 case 'p':
2808                         mult *= 1024;
2809                         /* fallthrough */
2810                 case 't':
2811                         mult *= 1024;
2812                         /* fallthrough */
2813                 case 'g':
2814                         mult *= 1024;
2815                         /* fallthrough */
2816                 case 'm':
2817                         mult *= 1024;
2818                         /* fallthrough */
2819                 case 'k':
2820                         mult *= 1024;
2821                         /* fallthrough */
2822                 case 'b':
2823                         break;
2824                 default:
2825                         error("unknown size descriptor '%c'", c);
2826                         exit(1);
2827                 }
2828         }
2829         /* Check whether ret * mult overflow */
2830         if (fls64(ret) + fls64(mult) - 1 > 64) {
2831                 error("size value '%s' is too large for u64", s);
2832                 exit(1);
2833         }
2834         ret *= mult;
2835         return ret;
2836 }
2837
2838 u64 parse_qgroupid(const char *p)
2839 {
2840         char *s = strchr(p, '/');
2841         const char *ptr_src_end = p + strlen(p);
2842         char *ptr_parse_end = NULL;
2843         u64 level;
2844         u64 id;
2845         int fd;
2846         int ret = 0;
2847
2848         if (p[0] == '/')
2849                 goto path;
2850
2851         /* Numeric format like '0/257' is the primary case */
2852         if (!s) {
2853                 id = strtoull(p, &ptr_parse_end, 10);
2854                 if (ptr_parse_end != ptr_src_end)
2855                         goto path;
2856                 return id;
2857         }
2858         level = strtoull(p, &ptr_parse_end, 10);
2859         if (ptr_parse_end != s)
2860                 goto path;
2861
2862         id = strtoull(s + 1, &ptr_parse_end, 10);
2863         if (ptr_parse_end != ptr_src_end)
2864                 goto  path;
2865
2866         return (level << BTRFS_QGROUP_LEVEL_SHIFT) | id;
2867
2868 path:
2869         /* Path format like subv at 'my_subvol' is the fallback case */
2870         ret = test_issubvolume(p);
2871         if (ret < 0 || !ret)
2872                 goto err;
2873         fd = open(p, O_RDONLY);
2874         if (fd < 0)
2875                 goto err;
2876         ret = lookup_ino_rootid(fd, &id);
2877         if (ret)
2878                 error("failed to lookup root id: %s", strerror(-ret));
2879         close(fd);
2880         if (ret < 0)
2881                 goto err;
2882         return id;
2883
2884 err:
2885         error("invalid qgroupid or subvolume path: %s", p);
2886         exit(-1);
2887 }
2888
2889 int open_file_or_dir3(const char *fname, DIR **dirstream, int open_flags)
2890 {
2891         int ret;
2892         struct stat st;
2893         int fd;
2894
2895         ret = stat(fname, &st);
2896         if (ret < 0) {
2897                 return -1;
2898         }
2899         if (S_ISDIR(st.st_mode)) {
2900                 *dirstream = opendir(fname);
2901                 if (!*dirstream)
2902                         return -1;
2903                 fd = dirfd(*dirstream);
2904         } else if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) {
2905                 fd = open(fname, open_flags);
2906         } else {
2907                 /*
2908                  * we set this on purpose, in case the caller output
2909                  * strerror(errno) as success
2910                  */
2911                 errno = EINVAL;
2912                 return -1;
2913         }
2914         if (fd < 0) {
2915                 fd = -1;
2916                 if (*dirstream) {
2917                         closedir(*dirstream);
2918                         *dirstream = NULL;
2919                 }
2920         }
2921         return fd;
2922 }
2923
2924 int open_file_or_dir(const char *fname, DIR **dirstream)
2925 {
2926         return open_file_or_dir3(fname, dirstream, O_RDWR);
2927 }
2928
2929 void close_file_or_dir(int fd, DIR *dirstream)
2930 {
2931         if (dirstream)
2932                 closedir(dirstream);
2933         else if (fd >= 0)
2934                 close(fd);
2935 }
2936
2937 int get_device_info(int fd, u64 devid,
2938                 struct btrfs_ioctl_dev_info_args *di_args)
2939 {
2940         int ret;
2941
2942         di_args->devid = devid;
2943         memset(&di_args->uuid, '\0', sizeof(di_args->uuid));
2944
2945         ret = ioctl(fd, BTRFS_IOC_DEV_INFO, di_args);
2946         return ret < 0 ? -errno : 0;
2947 }
2948
2949 static u64 find_max_device_id(struct btrfs_ioctl_search_args *search_args,
2950                               int nr_items)
2951 {
2952         struct btrfs_dev_item *dev_item;
2953         char *buf = search_args->buf;
2954
2955         buf += (nr_items - 1) * (sizeof(struct btrfs_ioctl_search_header)
2956                                        + sizeof(struct btrfs_dev_item));
2957         buf += sizeof(struct btrfs_ioctl_search_header);
2958
2959         dev_item = (struct btrfs_dev_item *)buf;
2960
2961         return btrfs_stack_device_id(dev_item);
2962 }
2963
2964 static int search_chunk_tree_for_fs_info(int fd,
2965                                 struct btrfs_ioctl_fs_info_args *fi_args)
2966 {
2967         int ret;
2968         int max_items;
2969         u64 start_devid = 1;
2970         struct btrfs_ioctl_search_args search_args;
2971         struct btrfs_ioctl_search_key *search_key = &search_args.key;
2972
2973         fi_args->num_devices = 0;
2974
2975         max_items = BTRFS_SEARCH_ARGS_BUFSIZE
2976                / (sizeof(struct btrfs_ioctl_search_header)
2977                                + sizeof(struct btrfs_dev_item));
2978
2979         search_key->tree_id = BTRFS_CHUNK_TREE_OBJECTID;
2980         search_key->min_objectid = BTRFS_DEV_ITEMS_OBJECTID;
2981         search_key->max_objectid = BTRFS_DEV_ITEMS_OBJECTID;
2982         search_key->min_type = BTRFS_DEV_ITEM_KEY;
2983         search_key->max_type = BTRFS_DEV_ITEM_KEY;
2984         search_key->min_transid = 0;
2985         search_key->max_transid = (u64)-1;
2986         search_key->nr_items = max_items;
2987         search_key->max_offset = (u64)-1;
2988
2989 again:
2990         search_key->min_offset = start_devid;
2991
2992         ret = ioctl(fd, BTRFS_IOC_TREE_SEARCH, &search_args);
2993         if (ret < 0)
2994                 return -errno;
2995
2996         fi_args->num_devices += (u64)search_key->nr_items;
2997
2998         if (search_key->nr_items == max_items) {
2999                 start_devid = find_max_device_id(&search_args,
3000                                         search_key->nr_items) + 1;
3001                 goto again;
3002         }
3003
3004         /* get the lastest max_id to stay consistent with the num_devices */
3005         if (search_key->nr_items == 0)
3006                 /*
3007                  * last tree_search returns an empty buf, use the devid of
3008                  * the last dev_item of the previous tree_search
3009                  */
3010                 fi_args->max_id = start_devid - 1;
3011         else
3012                 fi_args->max_id = find_max_device_id(&search_args,
3013                                                 search_key->nr_items);
3014
3015         return 0;
3016 }
3017
3018 /*
3019  * For a given path, fill in the ioctl fs_ and info_ args.
3020  * If the path is a btrfs mountpoint, fill info for all devices.
3021  * If the path is a btrfs device, fill in only that device.
3022  *
3023  * The path provided must be either on a mounted btrfs fs,
3024  * or be a mounted btrfs device.
3025  *
3026  * Returns 0 on success, or a negative errno.
3027  */
3028 int get_fs_info(char *path, struct btrfs_ioctl_fs_info_args *fi_args,
3029                 struct btrfs_ioctl_dev_info_args **di_ret)
3030 {
3031         int fd = -1;
3032         int ret = 0;
3033         int ndevs = 0;
3034         int i = 0;
3035         int replacing = 0;
3036         struct btrfs_fs_devices *fs_devices_mnt = NULL;
3037         struct btrfs_ioctl_dev_info_args *di_args;
3038         struct btrfs_ioctl_dev_info_args tmp;
3039         char mp[PATH_MAX];
3040         DIR *dirstream = NULL;
3041
3042         memset(fi_args, 0, sizeof(*fi_args));
3043
3044         if (is_block_device(path) == 1) {
3045                 struct btrfs_super_block *disk_super;
3046                 char buf[BTRFS_SUPER_INFO_SIZE];
3047                 u64 devid;
3048
3049                 /* Ensure it's mounted, then set path to the mountpoint */
3050                 fd = open(path, O_RDONLY);
3051                 if (fd < 0) {
3052                         ret = -errno;
3053                         error("cannot open %s: %s", path, strerror(errno));
3054                         goto out;
3055                 }
3056                 ret = check_mounted_where(fd, path, mp, sizeof(mp),
3057                                           &fs_devices_mnt);
3058                 if (!ret) {
3059                         ret = -EINVAL;
3060                         goto out;
3061                 }
3062                 if (ret < 0)
3063                         goto out;
3064                 path = mp;
3065                 /* Only fill in this one device */
3066                 fi_args->num_devices = 1;
3067
3068                 disk_super = (struct btrfs_super_block *)buf;
3069                 ret = btrfs_read_dev_super(fd, disk_super,
3070                                            BTRFS_SUPER_INFO_OFFSET, 0);
3071                 if (ret < 0) {
3072                         ret = -EIO;
3073                         goto out;
3074                 }
3075                 devid = btrfs_stack_device_id(&disk_super->dev_item);
3076
3077                 fi_args->max_id = devid;
3078                 i = devid;
3079
3080                 memcpy(fi_args->fsid, fs_devices_mnt->fsid, BTRFS_FSID_SIZE);
3081                 close(fd);
3082         }
3083
3084         /* at this point path must not be for a block device */
3085         fd = open_file_or_dir(path, &dirstream);
3086         if (fd < 0) {
3087                 ret = -errno;
3088                 goto out;
3089         }
3090
3091         /* fill in fi_args if not just a single device */
3092         if (fi_args->num_devices != 1) {
3093                 ret = ioctl(fd, BTRFS_IOC_FS_INFO, fi_args);
3094                 if (ret < 0) {
3095                         ret = -errno;
3096                         goto out;
3097                 }
3098
3099                 /*
3100                  * The fs_args->num_devices does not include seed devices
3101                  */
3102                 ret = search_chunk_tree_for_fs_info(fd, fi_args);
3103                 if (ret)
3104                         goto out;
3105
3106                 /*
3107                  * search_chunk_tree_for_fs_info() will lacks the devid 0
3108                  * so manual probe for it here.
3109                  */
3110                 ret = get_device_info(fd, 0, &tmp);
3111                 if (!ret) {
3112                         fi_args->num_devices++;
3113                         ndevs++;
3114                         replacing = 1;
3115                         if (i == 0)
3116                                 i++;
3117                 }
3118         }
3119
3120         if (!fi_args->num_devices)
3121                 goto out;
3122
3123         di_args = *di_ret = malloc((fi_args->num_devices) * sizeof(*di_args));
3124         if (!di_args) {
3125                 ret = -errno;
3126                 goto out;
3127         }
3128
3129         if (replacing)
3130                 memcpy(di_args, &tmp, sizeof(tmp));
3131         for (; i <= fi_args->max_id; ++i) {
3132                 ret = get_device_info(fd, i, &di_args[ndevs]);
3133                 if (ret == -ENODEV)
3134                         continue;
3135                 if (ret)
3136                         goto out;
3137                 ndevs++;
3138         }
3139
3140         /*
3141         * only when the only dev we wanted to find is not there then
3142         * let any error be returned
3143         */
3144         if (fi_args->num_devices != 1) {
3145                 BUG_ON(ndevs == 0);
3146                 ret = 0;
3147         }
3148
3149 out:
3150         close_file_or_dir(fd, dirstream);
3151         return ret;
3152 }
3153
3154 #define isoctal(c)      (((c) & ~7) == '0')
3155
3156 static inline void translate(char *f, char *t)
3157 {
3158         while (*f != '\0') {
3159                 if (*f == '\\' &&
3160                     isoctal(f[1]) && isoctal(f[2]) && isoctal(f[3])) {
3161                         *t++ = 64*(f[1] & 7) + 8*(f[2] & 7) + (f[3] & 7);
3162                         f += 4;
3163                 } else
3164                         *t++ = *f++;
3165         }
3166         *t = '\0';
3167         return;
3168 }
3169
3170 /*
3171  * Checks if the swap device.
3172  * Returns 1 if swap device, < 0 on error or 0 if not swap device.
3173  */
3174 static int is_swap_device(const char *file)
3175 {
3176         FILE    *f;
3177         struct stat     st_buf;
3178         dev_t   dev;
3179         ino_t   ino = 0;
3180         char    tmp[PATH_MAX];
3181         char    buf[PATH_MAX];
3182         char    *cp;
3183         int     ret = 0;
3184
3185         if (stat(file, &st_buf) < 0)
3186                 return -errno;
3187         if (S_ISBLK(st_buf.st_mode))
3188                 dev = st_buf.st_rdev;
3189         else if (S_ISREG(st_buf.st_mode)) {
3190                 dev = st_buf.st_dev;
3191                 ino = st_buf.st_ino;
3192         } else
3193                 return 0;
3194
3195         if ((f = fopen("/proc/swaps", "r")) == NULL)
3196                 return 0;
3197
3198         /* skip the first line */
3199         if (fgets(tmp, sizeof(tmp), f) == NULL)
3200                 goto out;
3201
3202         while (fgets(tmp, sizeof(tmp), f) != NULL) {
3203                 if ((cp = strchr(tmp, ' ')) != NULL)
3204                         *cp = '\0';
3205                 if ((cp = strchr(tmp, '\t')) != NULL)
3206                         *cp = '\0';
3207                 translate(tmp, buf);
3208                 if (stat(buf, &st_buf) != 0)
3209                         continue;
3210                 if (S_ISBLK(st_buf.st_mode)) {
3211                         if (dev == st_buf.st_rdev) {
3212                                 ret = 1;
3213                                 break;
3214                         }
3215                 } else if (S_ISREG(st_buf.st_mode)) {
3216                         if (dev == st_buf.st_dev && ino == st_buf.st_ino) {
3217                                 ret = 1;
3218                                 break;
3219                         }
3220                 }
3221         }
3222
3223 out:
3224         fclose(f);
3225
3226         return ret;
3227 }
3228
3229 /*
3230  * Check for existing filesystem or partition table on device.
3231  * Returns:
3232  *       1 for existing fs or partition
3233  *       0 for nothing found
3234  *      -1 for internal error
3235  */
3236 static int check_overwrite(const char *device)
3237 {
3238         const char      *type;
3239         blkid_probe     pr = NULL;
3240         int             ret;
3241         blkid_loff_t    size;
3242
3243         if (!device || !*device)
3244                 return 0;
3245
3246         ret = -1; /* will reset on success of all setup calls */
3247
3248         pr = blkid_new_probe_from_filename(device);
3249         if (!pr)
3250                 goto out;
3251
3252         size = blkid_probe_get_size(pr);
3253         if (size < 0)
3254                 goto out;
3255
3256         /* nothing to overwrite on a 0-length device */
3257         if (size == 0) {
3258                 ret = 0;
3259                 goto out;
3260         }
3261
3262         ret = blkid_probe_enable_partitions(pr, 1);
3263         if (ret < 0)
3264                 goto out;
3265
3266         ret = blkid_do_fullprobe(pr);
3267         if (ret < 0)
3268                 goto out;
3269
3270         /*
3271          * Blkid returns 1 for nothing found and 0 when it finds a signature,
3272          * but we want the exact opposite, so reverse the return value here.
3273          *
3274          * In addition print some useful diagnostics about what actually is
3275          * on the device.
3276          */
3277         if (ret) {
3278                 ret = 0;
3279                 goto out;
3280         }
3281
3282         if (!blkid_probe_lookup_value(pr, "TYPE", &type, NULL)) {
3283                 fprintf(stderr,
3284                         "%s appears to contain an existing "
3285                         "filesystem (%s).\n", device, type);
3286         } else if (!blkid_probe_lookup_value(pr, "PTTYPE", &type, NULL)) {
3287                 fprintf(stderr,
3288                         "%s appears to contain a partition "
3289                         "table (%s).\n", device, type);
3290         } else {
3291                 fprintf(stderr,
3292                         "%s appears to contain something weird "
3293                         "according to blkid\n", device);
3294         }
3295         ret = 1;
3296
3297 out:
3298         if (pr)
3299                 blkid_free_probe(pr);
3300         if (ret == -1)
3301                 fprintf(stderr,
3302                         "probe of %s failed, cannot detect "
3303                           "existing filesystem.\n", device);
3304         return ret;
3305 }
3306
3307 static int group_profile_devs_min(u64 flag)
3308 {
3309         switch (flag & BTRFS_BLOCK_GROUP_PROFILE_MASK) {
3310         case 0: /* single */
3311         case BTRFS_BLOCK_GROUP_DUP:
3312                 return 1;
3313         case BTRFS_BLOCK_GROUP_RAID0:
3314         case BTRFS_BLOCK_GROUP_RAID1:
3315         case BTRFS_BLOCK_GROUP_RAID5:
3316                 return 2;
3317         case BTRFS_BLOCK_GROUP_RAID6:
3318                 return 3;
3319         case BTRFS_BLOCK_GROUP_RAID10:
3320                 return 4;
3321         default:
3322                 return -1;
3323         }
3324 }
3325
3326 int test_num_disk_vs_raid(u64 metadata_profile, u64 data_profile,
3327         u64 dev_cnt, int mixed, int ssd)
3328 {
3329         u64 allowed = 0;
3330         u64 profile = metadata_profile | data_profile;
3331
3332         switch (dev_cnt) {
3333         default:
3334         case 4:
3335                 allowed |= BTRFS_BLOCK_GROUP_RAID10;
3336         case 3:
3337                 allowed |= BTRFS_BLOCK_GROUP_RAID6;
3338         case 2:
3339                 allowed |= BTRFS_BLOCK_GROUP_RAID0 | BTRFS_BLOCK_GROUP_RAID1 |
3340                         BTRFS_BLOCK_GROUP_RAID5;
3341         case 1:
3342                 allowed |= BTRFS_BLOCK_GROUP_DUP;
3343         }
3344
3345         if (dev_cnt > 1 && profile & BTRFS_BLOCK_GROUP_DUP) {
3346                 warning("DUP is not recommended on filesystem with multiple devices");
3347         }
3348         if (metadata_profile & ~allowed) {
3349                 fprintf(stderr,
3350                         "ERROR: unable to create FS with metadata profile %s "
3351                         "(have %llu devices but %d devices are required)\n",
3352                         btrfs_group_profile_str(metadata_profile), dev_cnt,
3353                         group_profile_devs_min(metadata_profile));
3354                 return 1;
3355         }
3356         if (data_profile & ~allowed) {
3357                 fprintf(stderr,
3358                         "ERROR: unable to create FS with data profile %s "
3359                         "(have %llu devices but %d devices are required)\n",
3360                         btrfs_group_profile_str(data_profile), dev_cnt,
3361                         group_profile_devs_min(data_profile));
3362                 return 1;
3363         }
3364
3365         if (dev_cnt == 3 && profile & BTRFS_BLOCK_GROUP_RAID6) {
3366                 warning("RAID6 is not recommended on filesystem with 3 devices only");
3367         }
3368         if (dev_cnt == 2 && profile & BTRFS_BLOCK_GROUP_RAID5) {
3369                 warning("RAID5 is not recommended on filesystem with 2 devices only");
3370         }
3371         warning_on(!mixed && (data_profile & BTRFS_BLOCK_GROUP_DUP) && ssd,
3372                    "DUP may not actually lead to 2 copies on the device, see manual page");
3373
3374         return 0;
3375 }
3376
3377 int group_profile_max_safe_loss(u64 flags)
3378 {
3379         switch (flags & BTRFS_BLOCK_GROUP_PROFILE_MASK) {
3380         case 0: /* single */
3381         case BTRFS_BLOCK_GROUP_DUP:
3382         case BTRFS_BLOCK_GROUP_RAID0:
3383                 return 0;
3384         case BTRFS_BLOCK_GROUP_RAID1:
3385         case BTRFS_BLOCK_GROUP_RAID5:
3386         case BTRFS_BLOCK_GROUP_RAID10:
3387                 return 1;
3388         case BTRFS_BLOCK_GROUP_RAID6:
3389                 return 2;
3390         default:
3391                 return -1;
3392         }
3393 }
3394
3395 /*
3396  * Check if a device is suitable for btrfs
3397  * returns:
3398  *  1: something is wrong, an error is printed
3399  *  0: all is fine
3400  */
3401 int test_dev_for_mkfs(const char *file, int force_overwrite)
3402 {
3403         int ret, fd;
3404         struct stat st;
3405
3406         ret = is_swap_device(file);
3407         if (ret < 0) {
3408                 error("checking status of %s: %s", file, strerror(-ret));
3409                 return 1;
3410         }
3411         if (ret == 1) {
3412                 error("%s is a swap device", file);
3413                 return 1;
3414         }
3415         if (!force_overwrite) {
3416                 if (check_overwrite(file)) {
3417                         error("use the -f option to force overwrite of %s",
3418                                         file);
3419                         return 1;
3420                 }
3421         }
3422         ret = check_mounted(file);
3423         if (ret < 0) {
3424                 error("cannot check mount status of %s: %s", file,
3425                                 strerror(-ret));
3426                 return 1;
3427         }
3428         if (ret == 1) {
3429                 error("%s is mounted", file);
3430                 return 1;
3431         }
3432         /* check if the device is busy */
3433         fd = open(file, O_RDWR|O_EXCL);
3434         if (fd < 0) {
3435                 error("unable to open %s: %s", file, strerror(errno));
3436                 return 1;
3437         }
3438         if (fstat(fd, &st)) {
3439                 error("unable to stat %s: %s", file, strerror(errno));
3440                 close(fd);
3441                 return 1;
3442         }
3443         if (!S_ISBLK(st.st_mode)) {
3444                 error("%s is not a block device", file);
3445                 close(fd);
3446                 return 1;
3447         }
3448         close(fd);
3449         return 0;
3450 }
3451
3452 int btrfs_scan_lblkid(void)
3453 {
3454         int fd = -1;
3455         int ret;
3456         u64 num_devices;
3457         struct btrfs_fs_devices *tmp_devices;
3458         blkid_dev_iterate iter = NULL;
3459         blkid_dev dev = NULL;
3460         blkid_cache cache = NULL;
3461         char path[PATH_MAX];
3462
3463         if (btrfs_scan_done)
3464                 return 0;
3465
3466         if (blkid_get_cache(&cache, NULL) < 0) {
3467                 error("blkid cache get failed");
3468                 return 1;
3469         }
3470         blkid_probe_all(cache);
3471         iter = blkid_dev_iterate_begin(cache);
3472         blkid_dev_set_search(iter, "TYPE", "btrfs");
3473         while (blkid_dev_next(iter, &dev) == 0) {
3474                 dev = blkid_verify(cache, dev);
3475                 if (!dev)
3476                         continue;
3477                 /* if we are here its definitely a btrfs disk*/
3478                 strncpy_null(path, blkid_dev_devname(dev));
3479
3480                 fd = open(path, O_RDONLY);
3481                 if (fd < 0) {
3482                         error("cannot open %s: %s", path, strerror(errno));
3483                         continue;
3484                 }
3485                 ret = btrfs_scan_one_device(fd, path, &tmp_devices,
3486                                 &num_devices, BTRFS_SUPER_INFO_OFFSET,
3487                                 SBREAD_DEFAULT);
3488                 if (ret) {
3489                         error("cannot scan %s: %s", path, strerror(-ret));
3490                         close (fd);
3491                         continue;
3492                 }
3493
3494                 close(fd);
3495         }
3496         blkid_dev_iterate_end(iter);
3497         blkid_put_cache(cache);
3498
3499         btrfs_scan_done = 1;
3500
3501         return 0;
3502 }
3503
3504 int is_vol_small(const char *file)
3505 {
3506         int fd = -1;
3507         int e;
3508         struct stat st;
3509         u64 size;
3510
3511         fd = open(file, O_RDONLY);
3512         if (fd < 0)
3513                 return -errno;
3514         if (fstat(fd, &st) < 0) {
3515                 e = -errno;
3516                 close(fd);
3517                 return e;
3518         }
3519         size = btrfs_device_size(fd, &st);
3520         if (size == 0) {
3521                 close(fd);
3522                 return -1;
3523         }
3524         if (size < BTRFS_MKFS_SMALL_VOLUME_SIZE) {
3525                 close(fd);
3526                 return 1;
3527         } else {
3528                 close(fd);
3529                 return 0;
3530         }
3531 }
3532
3533 /*
3534  * This reads a line from the stdin and only returns non-zero if the
3535  * first whitespace delimited token is a case insensitive match with yes
3536  * or y.
3537  */
3538 int ask_user(const char *question)
3539 {
3540         char buf[30] = {0,};
3541         char *saveptr = NULL;
3542         char *answer;
3543
3544         printf("%s [y/N]: ", question);
3545
3546         return fgets(buf, sizeof(buf) - 1, stdin) &&
3547                (answer = strtok_r(buf, " \t\n\r", &saveptr)) &&
3548                (!strcasecmp(answer, "yes") || !strcasecmp(answer, "y"));
3549 }
3550
3551 /*
3552  * For a given:
3553  * - file or directory return the containing tree root id
3554  * - subvolume return its own tree id
3555  * - BTRFS_EMPTY_SUBVOL_DIR_OBJECTID (directory with ino == 2) the result is
3556  *   undefined and function returns -1
3557  */
3558 int lookup_ino_rootid(int fd, u64 *rootid)
3559 {
3560         struct btrfs_ioctl_ino_lookup_args args;
3561         int ret;
3562
3563         memset(&args, 0, sizeof(args));
3564         args.treeid = 0;
3565         args.objectid = BTRFS_FIRST_FREE_OBJECTID;
3566
3567         ret = ioctl(fd, BTRFS_IOC_INO_LOOKUP, &args);
3568         if (ret < 0)
3569                 return -errno;
3570
3571         *rootid = args.treeid;
3572
3573         return 0;
3574 }
3575
3576 /*
3577  * return 0 if a btrfs mount point is found
3578  * return 1 if a mount point is found but not btrfs
3579  * return <0 if something goes wrong
3580  */
3581 int find_mount_root(const char *path, char **mount_root)
3582 {
3583         FILE *mnttab;
3584         int fd;
3585         struct mntent *ent;
3586         int len;
3587         int ret;
3588         int not_btrfs = 1;
3589         int longest_matchlen = 0;
3590         char *longest_match = NULL;
3591
3592         fd = open(path, O_RDONLY | O_NOATIME);
3593         if (fd < 0)
3594                 return -errno;
3595         close(fd);
3596
3597         mnttab = setmntent("/proc/self/mounts", "r");
3598         if (!mnttab)
3599                 return -errno;
3600
3601         while ((ent = getmntent(mnttab))) {
3602                 len = strlen(ent->mnt_dir);
3603                 if (strncmp(ent->mnt_dir, path, len) == 0) {
3604                         /* match found and use the latest match */
3605                         if (longest_matchlen <= len) {
3606                                 free(longest_match);
3607                                 longest_matchlen = len;
3608                                 longest_match = strdup(ent->mnt_dir);
3609                                 not_btrfs = strcmp(ent->mnt_type, "btrfs");
3610                         }
3611                 }
3612         }
3613         endmntent(mnttab);
3614
3615         if (!longest_match)
3616                 return -ENOENT;
3617         if (not_btrfs) {
3618                 free(longest_match);
3619                 return 1;
3620         }
3621
3622         ret = 0;
3623         *mount_root = realpath(longest_match, NULL);
3624         if (!*mount_root)
3625                 ret = -errno;
3626
3627         free(longest_match);
3628         return ret;
3629 }
3630
3631 int test_minimum_size(const char *file, u32 nodesize)
3632 {
3633         int fd;
3634         struct stat statbuf;
3635
3636         fd = open(file, O_RDONLY);
3637         if (fd < 0)
3638                 return -errno;
3639         if (stat(file, &statbuf) < 0) {
3640                 close(fd);
3641                 return -errno;
3642         }
3643         if (btrfs_device_size(fd, &statbuf) < btrfs_min_dev_size(nodesize)) {
3644                 close(fd);
3645                 return 1;
3646         }
3647         close(fd);
3648         return 0;
3649 }
3650
3651
3652 /*
3653  * Test if path is a directory
3654  * Returns:
3655  *   0 - path exists but it is not a directory
3656  *   1 - path exists and it is a directory
3657  * < 0 - error
3658  */
3659 int test_isdir(const char *path)
3660 {
3661         struct stat st;
3662         int ret;
3663
3664         ret = stat(path, &st);
3665         if (ret < 0)
3666                 return -errno;
3667
3668         return !!S_ISDIR(st.st_mode);
3669 }
3670
3671 void units_set_mode(unsigned *units, unsigned mode)
3672 {
3673         unsigned base = *units & UNITS_MODE_MASK;
3674
3675         *units = base | mode;
3676 }
3677
3678 void units_set_base(unsigned *units, unsigned base)
3679 {
3680         unsigned mode = *units & ~UNITS_MODE_MASK;
3681
3682         *units = base | mode;
3683 }
3684
3685 int find_next_key(struct btrfs_path *path, struct btrfs_key *key)
3686 {
3687         int level;
3688
3689         for (level = 0; level < BTRFS_MAX_LEVEL; level++) {
3690                 if (!path->nodes[level])
3691                         break;
3692                 if (path->slots[level] + 1 >=
3693                     btrfs_header_nritems(path->nodes[level]))
3694                         continue;
3695                 if (level == 0)
3696                         btrfs_item_key_to_cpu(path->nodes[level], key,
3697                                               path->slots[level] + 1);
3698                 else
3699                         btrfs_node_key_to_cpu(path->nodes[level], key,
3700                                               path->slots[level] + 1);
3701                 return 0;
3702         }
3703         return 1;
3704 }
3705
3706 const char* btrfs_group_type_str(u64 flag)
3707 {
3708         u64 mask = BTRFS_BLOCK_GROUP_TYPE_MASK |
3709                 BTRFS_SPACE_INFO_GLOBAL_RSV;
3710
3711         switch (flag & mask) {
3712         case BTRFS_BLOCK_GROUP_DATA:
3713                 return "Data";
3714         case BTRFS_BLOCK_GROUP_SYSTEM:
3715                 return "System";
3716         case BTRFS_BLOCK_GROUP_METADATA:
3717                 return "Metadata";
3718         case BTRFS_BLOCK_GROUP_DATA|BTRFS_BLOCK_GROUP_METADATA:
3719                 return "Data+Metadata";
3720         case BTRFS_SPACE_INFO_GLOBAL_RSV:
3721                 return "GlobalReserve";
3722         default:
3723                 return "unknown";
3724         }
3725 }
3726
3727 const char* btrfs_group_profile_str(u64 flag)
3728 {
3729         switch (flag & BTRFS_BLOCK_GROUP_PROFILE_MASK) {
3730         case 0:
3731                 return "single";
3732         case BTRFS_BLOCK_GROUP_RAID0:
3733                 return "RAID0";
3734         case BTRFS_BLOCK_GROUP_RAID1:
3735                 return "RAID1";
3736         case BTRFS_BLOCK_GROUP_RAID5:
3737                 return "RAID5";
3738         case BTRFS_BLOCK_GROUP_RAID6:
3739                 return "RAID6";
3740         case BTRFS_BLOCK_GROUP_DUP:
3741                 return "DUP";
3742         case BTRFS_BLOCK_GROUP_RAID10:
3743                 return "RAID10";
3744         default:
3745                 return "unknown";
3746         }
3747 }
3748
3749 u64 disk_size(const char *path)
3750 {
3751         struct statfs sfs;
3752
3753         if (statfs(path, &sfs) < 0)
3754                 return 0;
3755         else
3756                 return sfs.f_bsize * sfs.f_blocks;
3757 }
3758
3759 u64 get_partition_size(const char *dev)
3760 {
3761         u64 result;
3762         int fd = open(dev, O_RDONLY);
3763
3764         if (fd < 0)
3765                 return 0;
3766         if (ioctl(fd, BLKGETSIZE64, &result) < 0) {
3767                 close(fd);
3768                 return 0;
3769         }
3770         close(fd);
3771
3772         return result;
3773 }
3774
3775 int btrfs_tree_search2_ioctl_supported(int fd)
3776 {
3777         struct btrfs_ioctl_search_args_v2 *args2;
3778         struct btrfs_ioctl_search_key *sk;
3779         int args2_size = 1024;
3780         char args2_buf[args2_size];
3781         int ret;
3782         static int v2_supported = -1;
3783
3784         if (v2_supported != -1)
3785                 return v2_supported;
3786
3787         args2 = (struct btrfs_ioctl_search_args_v2 *)args2_buf;
3788         sk = &(args2->key);
3789
3790         /*
3791          * Search for the extent tree item in the root tree.
3792          */
3793         sk->tree_id = BTRFS_ROOT_TREE_OBJECTID;
3794         sk->min_objectid = BTRFS_EXTENT_TREE_OBJECTID;
3795         sk->max_objectid = BTRFS_EXTENT_TREE_OBJECTID;
3796         sk->min_type = BTRFS_ROOT_ITEM_KEY;
3797         sk->max_type = BTRFS_ROOT_ITEM_KEY;
3798         sk->min_offset = 0;
3799         sk->max_offset = (u64)-1;
3800         sk->min_transid = 0;
3801         sk->max_transid = (u64)-1;
3802         sk->nr_items = 1;
3803         args2->buf_size = args2_size - sizeof(struct btrfs_ioctl_search_args_v2);
3804         ret = ioctl(fd, BTRFS_IOC_TREE_SEARCH_V2, args2);
3805         if (ret == -EOPNOTSUPP)
3806                 v2_supported = 0;
3807         else if (ret == 0)
3808                 v2_supported = 1;
3809         else
3810                 return ret;
3811
3812         return v2_supported;
3813 }
3814
3815 int btrfs_check_nodesize(u32 nodesize, u32 sectorsize, u64 features)
3816 {
3817         if (nodesize < sectorsize) {
3818                 error("illegal nodesize %u (smaller than %u)",
3819                                 nodesize, sectorsize);
3820                 return -1;
3821         } else if (nodesize > BTRFS_MAX_METADATA_BLOCKSIZE) {
3822                 error("illegal nodesize %u (larger than %u)",
3823                         nodesize, BTRFS_MAX_METADATA_BLOCKSIZE);
3824                 return -1;
3825         } else if (nodesize & (sectorsize - 1)) {
3826                 error("illegal nodesize %u (not aligned to %u)",
3827                         nodesize, sectorsize);
3828                 return -1;
3829         } else if (features & BTRFS_FEATURE_INCOMPAT_MIXED_GROUPS &&
3830                    nodesize != sectorsize) {
3831                 error("illegal nodesize %u (not equal to %u for mixed block group)",
3832                         nodesize, sectorsize);
3833                 return -1;
3834         }
3835         return 0;
3836 }
3837
3838 /*
3839  * Copy a path argument from SRC to DEST and check the SRC length if it's at
3840  * most PATH_MAX and fits into DEST. DESTLEN is supposed to be exact size of
3841  * the buffer.
3842  * The destination buffer is zero terminated.
3843  * Return < 0 for error, 0 otherwise.
3844  */
3845 int arg_copy_path(char *dest, const char *src, int destlen)
3846 {
3847         size_t len = strlen(src);
3848
3849         if (len >= PATH_MAX || len >= destlen)
3850                 return -ENAMETOOLONG;
3851
3852         __strncpy_null(dest, src, destlen);
3853
3854         return 0;
3855 }
3856
3857 unsigned int get_unit_mode_from_arg(int *argc, char *argv[], int df_mode)
3858 {
3859         unsigned int unit_mode = UNITS_DEFAULT;
3860         int arg_i;
3861         int arg_end;
3862
3863         for (arg_i = 0; arg_i < *argc; arg_i++) {
3864                 if (!strcmp(argv[arg_i], "--"))
3865                         break;
3866
3867                 if (!strcmp(argv[arg_i], "--raw")) {
3868                         unit_mode = UNITS_RAW;
3869                         argv[arg_i] = NULL;
3870                         continue;
3871                 }
3872                 if (!strcmp(argv[arg_i], "--human-readable")) {
3873                         unit_mode = UNITS_HUMAN_BINARY;
3874                         argv[arg_i] = NULL;
3875                         continue;
3876                 }
3877
3878                 if (!strcmp(argv[arg_i], "--iec")) {
3879                         units_set_mode(&unit_mode, UNITS_BINARY);
3880                         argv[arg_i] = NULL;
3881                         continue;
3882                 }
3883                 if (!strcmp(argv[arg_i], "--si")) {
3884                         units_set_mode(&unit_mode, UNITS_DECIMAL);
3885                         argv[arg_i] = NULL;
3886                         continue;
3887                 }
3888
3889                 if (!strcmp(argv[arg_i], "--kbytes")) {
3890                         units_set_base(&unit_mode, UNITS_KBYTES);
3891                         argv[arg_i] = NULL;
3892                         continue;
3893                 }
3894                 if (!strcmp(argv[arg_i], "--mbytes")) {
3895                         units_set_base(&unit_mode, UNITS_MBYTES);
3896                         argv[arg_i] = NULL;
3897                         continue;
3898                 }
3899                 if (!strcmp(argv[arg_i], "--gbytes")) {
3900                         units_set_base(&unit_mode, UNITS_GBYTES);
3901                         argv[arg_i] = NULL;
3902                         continue;
3903                 }
3904                 if (!strcmp(argv[arg_i], "--tbytes")) {
3905                         units_set_base(&unit_mode, UNITS_TBYTES);
3906                         argv[arg_i] = NULL;
3907                         continue;
3908                 }
3909
3910                 if (!df_mode)
3911                         continue;
3912
3913                 if (!strcmp(argv[arg_i], "-b")) {
3914                         unit_mode = UNITS_RAW;
3915                         argv[arg_i] = NULL;
3916                         continue;
3917                 }
3918                 if (!strcmp(argv[arg_i], "-h")) {
3919                         unit_mode = UNITS_HUMAN_BINARY;
3920                         argv[arg_i] = NULL;
3921                         continue;
3922                 }
3923                 if (!strcmp(argv[arg_i], "-H")) {
3924                         unit_mode = UNITS_HUMAN_DECIMAL;
3925                         argv[arg_i] = NULL;
3926                         continue;
3927                 }
3928                 if (!strcmp(argv[arg_i], "-k")) {
3929                         units_set_base(&unit_mode, UNITS_KBYTES);
3930                         argv[arg_i] = NULL;
3931                         continue;
3932                 }
3933                 if (!strcmp(argv[arg_i], "-m")) {
3934                         units_set_base(&unit_mode, UNITS_MBYTES);
3935                         argv[arg_i] = NULL;
3936                         continue;
3937                 }
3938                 if (!strcmp(argv[arg_i], "-g")) {
3939                         units_set_base(&unit_mode, UNITS_GBYTES);
3940                         argv[arg_i] = NULL;
3941                         continue;
3942                 }
3943                 if (!strcmp(argv[arg_i], "-t")) {
3944                         units_set_base(&unit_mode, UNITS_TBYTES);
3945                         argv[arg_i] = NULL;
3946                         continue;
3947                 }
3948         }
3949
3950         for (arg_i = 0, arg_end = 0; arg_i < *argc; arg_i++) {
3951                 if (!argv[arg_i])
3952                         continue;
3953                 argv[arg_end] = argv[arg_i];
3954                 arg_end++;
3955         }
3956
3957         *argc = arg_end;
3958
3959         return unit_mode;
3960 }
3961
3962 int string_is_numerical(const char *str)
3963 {
3964         if (!(*str >= '0' && *str <= '9'))
3965                 return 0;
3966         while (*str >= '0' && *str <= '9')
3967                 str++;
3968         if (*str != '\0')
3969                 return 0;
3970         return 1;
3971 }
3972
3973 /*
3974  * Preprocess @argv with getopt_long to reorder options and consume the "--"
3975  * option separator.
3976  * Unknown short and long options are reported, optionally the @usage is printed
3977  * before exit.
3978  */
3979 void clean_args_no_options(int argc, char *argv[], const char * const *usagestr)
3980 {
3981         static const struct option long_options[] = {
3982                 {NULL, 0, NULL, 0}
3983         };
3984
3985         while (1) {
3986                 int c = getopt_long(argc, argv, "", long_options, NULL);
3987
3988                 if (c < 0)
3989                         break;
3990
3991                 switch (c) {
3992                 default:
3993                         if (usagestr)
3994                                 usage(usagestr);
3995                 }
3996         }
3997 }
3998
3999 /*
4000  * Same as clean_args_no_options but pass through arguments that could look
4001  * like short options. Eg. reisze which takes a negative resize argument like
4002  * '-123M' .
4003  *
4004  * This accepts only two forms:
4005  * - "-- option1 option2 ..."
4006  * - "option1 option2 ..."
4007  */
4008 void clean_args_no_options_relaxed(int argc, char *argv[], const char * const *usagestr)
4009 {
4010         if (argc <= 1)
4011                 return;
4012
4013         if (strcmp(argv[1], "--") == 0)
4014                 optind = 2;
4015 }
4016
4017 /* Subvolume helper functions */
4018 /*
4019  * test if name is a correct subvolume name
4020  * this function return
4021  * 0-> name is not a correct subvolume name
4022  * 1-> name is a correct subvolume name
4023  */
4024 int test_issubvolname(const char *name)
4025 {
4026         return name[0] != '\0' && !strchr(name, '/') &&
4027                 strcmp(name, ".") && strcmp(name, "..");
4028 }
4029
4030 /*
4031  * Test if path is a subvolume
4032  * Returns:
4033  *   0 - path exists but it is not a subvolume
4034  *   1 - path exists and it is  a subvolume
4035  * < 0 - error
4036  */
4037 int test_issubvolume(const char *path)
4038 {
4039         struct stat     st;
4040         struct statfs stfs;
4041         int             res;
4042
4043         res = stat(path, &st);
4044         if (res < 0)
4045                 return -errno;
4046
4047         if (st.st_ino != BTRFS_FIRST_FREE_OBJECTID || !S_ISDIR(st.st_mode))
4048                 return 0;
4049
4050         res = statfs(path, &stfs);
4051         if (res < 0)
4052                 return -errno;
4053
4054         return (int)stfs.f_type == BTRFS_SUPER_MAGIC;
4055 }
4056
4057 const char *subvol_strip_mountpoint(const char *mnt, const char *full_path)
4058 {
4059         int len = strlen(mnt);
4060         if (!len)
4061                 return full_path;
4062
4063         if (mnt[len - 1] != '/')
4064                 len += 1;
4065
4066         return full_path + len;
4067 }
4068
4069 /*
4070  * Returns
4071  * <0: Std error
4072  * 0: All fine
4073  * 1: Error; and error info printed to the terminal. Fixme.
4074  * 2: If the fullpath is root tree instead of subvol tree
4075  */
4076 int get_subvol_info(const char *fullpath, struct root_info *get_ri)
4077 {
4078         u64 sv_id;
4079         int ret = 1;
4080         int fd = -1;
4081         int mntfd = -1;
4082         char *mnt = NULL;
4083         const char *svpath = NULL;
4084         DIR *dirstream1 = NULL;
4085         DIR *dirstream2 = NULL;
4086
4087         ret = test_issubvolume(fullpath);
4088         if (ret < 0)
4089                 return ret;
4090         if (!ret) {
4091                 error("not a subvolume: %s", fullpath);
4092                 return 1;
4093         }
4094
4095         ret = find_mount_root(fullpath, &mnt);
4096         if (ret < 0)
4097                 return ret;
4098         if (ret > 0) {
4099                 error("%s doesn't belong to btrfs mount point", fullpath);
4100                 return 1;
4101         }
4102         ret = 1;
4103         svpath = subvol_strip_mountpoint(mnt, fullpath);
4104
4105         fd = btrfs_open_dir(fullpath, &dirstream1, 1);
4106         if (fd < 0)
4107                 goto out;
4108
4109         ret = btrfs_list_get_path_rootid(fd, &sv_id);
4110         if (ret) {
4111                 error("can't get rootid for '%s'", fullpath);
4112                 goto out;
4113         }
4114
4115         mntfd = btrfs_open_dir(mnt, &dirstream2, 1);
4116         if (mntfd < 0)
4117                 goto out;
4118
4119         if (sv_id == BTRFS_FS_TREE_OBJECTID) {
4120                 ret = 2;
4121                 /*
4122                  * So that caller may decide if thats an error or just fine.
4123                  */
4124                 goto out;
4125         }
4126
4127         memset(get_ri, 0, sizeof(*get_ri));
4128         get_ri->root_id = sv_id;
4129
4130         ret = btrfs_get_subvol(mntfd, get_ri);
4131         if (ret)
4132                 error("can't find '%s': %d", svpath, ret);
4133
4134 out:
4135         close_file_or_dir(mntfd, dirstream2);
4136         close_file_or_dir(fd, dirstream1);
4137         free(mnt);
4138
4139         return ret;
4140 }
4141
4142 void init_rand_seed(u64 seed)
4143 {
4144         int i;
4145
4146         /* only use the last 48 bits */
4147         for (i = 0; i < 3; i++) {
4148                 rand_seed[i] = (unsigned short)(seed ^ (unsigned short)(-1));
4149                 seed >>= 16;
4150         }
4151         rand_seed_initlized = 1;
4152 }
4153
4154 static void __init_seed(void)
4155 {
4156         struct timeval tv;
4157         int ret;
4158         int fd;
4159
4160         if(rand_seed_initlized)
4161                 return;
4162         /* Use urandom as primary seed source. */
4163         fd = open("/dev/urandom", O_RDONLY);
4164         if (fd >= 0) {
4165                 ret = read(fd, rand_seed, sizeof(rand_seed));
4166                 close(fd);
4167                 if (ret < sizeof(rand_seed))
4168                         goto fallback;
4169         } else {
4170 fallback:
4171                 /* Use time and pid as fallback seed */
4172                 warning("failed to read /dev/urandom, use time and pid as random seed");
4173                 gettimeofday(&tv, 0);
4174                 rand_seed[0] = getpid() ^ (tv.tv_sec & 0xFFFF);
4175                 rand_seed[1] = getppid() ^ (tv.tv_usec & 0xFFFF);
4176                 rand_seed[2] = (tv.tv_sec ^ tv.tv_usec) >> 16;
4177         }
4178         rand_seed_initlized = 1;
4179 }
4180
4181 u32 rand_u32(void)
4182 {
4183         __init_seed();
4184         /*
4185          * Don't use nrand48, its range is [0,2^31) The highest bit will alwasy
4186          * be 0.  Use jrand48 to include the highest bit.
4187          */
4188         return (u32)jrand48(rand_seed);
4189 }
4190
4191 unsigned int rand_range(unsigned int upper)
4192 {
4193         __init_seed();
4194         /*
4195          * Use the full 48bits to mod, which would be more uniformly
4196          * distributed
4197          */
4198         return (unsigned int)(jrand48(rand_seed) % upper);
4199 }