btrfs-progs: tests: Add testcase for rootdir inline extent size
[platform/upstream/btrfs-progs.git] / convert / main.c
index 7ec6202..b3ea31d 100644 (file)
@@ -768,7 +768,7 @@ static int create_image(struct btrfs_root *root,
        if (ret < 0)
                goto out;
        ret = btrfs_add_link(trans, root, ino, BTRFS_FIRST_FREE_OBJECTID, name,
-                            strlen(name), BTRFS_FT_REG_FILE, NULL, 1);
+                            strlen(name), BTRFS_FT_REG_FILE, NULL, 1, 0);
        if (ret < 0)
                goto out;
 
@@ -838,129 +838,6 @@ out:
        return ret;
 }
 
-static struct btrfs_root* link_subvol(struct btrfs_root *root,
-               const char *base, u64 root_objectid)
-{
-       struct btrfs_trans_handle *trans;
-       struct btrfs_fs_info *fs_info = root->fs_info;
-       struct btrfs_root *tree_root = fs_info->tree_root;
-       struct btrfs_root *new_root = NULL;
-       struct btrfs_path path;
-       struct btrfs_inode_item *inode_item;
-       struct extent_buffer *leaf;
-       struct btrfs_key key;
-       u64 dirid = btrfs_root_dirid(&root->root_item);
-       u64 index = 2;
-       char buf[BTRFS_NAME_LEN + 1]; /* for snprintf null */
-       int len;
-       int i;
-       int ret;
-
-       len = strlen(base);
-       if (len == 0 || len > BTRFS_NAME_LEN)
-               return NULL;
-
-       btrfs_init_path(&path);
-       key.objectid = dirid;
-       key.type = BTRFS_DIR_INDEX_KEY;
-       key.offset = (u64)-1;
-
-       ret = btrfs_search_slot(NULL, root, &key, &path, 0, 0);
-       if (ret <= 0) {
-               error("search for DIR_INDEX dirid %llu failed: %d",
-                               (unsigned long long)dirid, ret);
-               goto fail;
-       }
-
-       if (path.slots[0] > 0) {
-               path.slots[0]--;
-               btrfs_item_key_to_cpu(path.nodes[0], &key, path.slots[0]);
-               if (key.objectid == dirid && key.type == BTRFS_DIR_INDEX_KEY)
-                       index = key.offset + 1;
-       }
-       btrfs_release_path(&path);
-
-       trans = btrfs_start_transaction(root, 1);
-       if (IS_ERR(trans)) {
-               error("unable to start transaction");
-               goto fail;
-       }
-
-       key.objectid = dirid;
-       key.offset = 0;
-       key.type =  BTRFS_INODE_ITEM_KEY;
-
-       ret = btrfs_lookup_inode(trans, root, &path, &key, 1);
-       if (ret) {
-               error("search for INODE_ITEM %llu failed: %d",
-                               (unsigned long long)dirid, ret);
-               goto fail;
-       }
-       leaf = path.nodes[0];
-       inode_item = btrfs_item_ptr(leaf, path.slots[0],
-                                   struct btrfs_inode_item);
-
-       key.objectid = root_objectid;
-       key.offset = (u64)-1;
-       key.type = BTRFS_ROOT_ITEM_KEY;
-
-       memcpy(buf, base, len);
-       for (i = 0; i < 1024; i++) {
-               ret = btrfs_insert_dir_item(trans, root, buf, len,
-                                           dirid, &key, BTRFS_FT_DIR, index);
-               if (ret != -EEXIST)
-                       break;
-               len = snprintf(buf, ARRAY_SIZE(buf), "%s%d", base, i);
-               if (len < 1 || len > BTRFS_NAME_LEN) {
-                       ret = -EINVAL;
-                       break;
-               }
-       }
-       if (ret)
-               goto fail;
-
-       btrfs_set_inode_size(leaf, inode_item, len * 2 +
-                            btrfs_inode_size(leaf, inode_item));
-       btrfs_mark_buffer_dirty(leaf);
-       btrfs_release_path(&path);
-
-       /* add the backref first */
-       ret = btrfs_add_root_ref(trans, tree_root, root_objectid,
-                                BTRFS_ROOT_BACKREF_KEY,
-                                root->root_key.objectid,
-                                dirid, index, buf, len);
-       if (ret) {
-               error("unable to add root backref for %llu: %d",
-                               root->root_key.objectid, ret);
-               goto fail;
-       }
-
-       /* now add the forward ref */
-       ret = btrfs_add_root_ref(trans, tree_root, root->root_key.objectid,
-                                BTRFS_ROOT_REF_KEY, root_objectid,
-                                dirid, index, buf, len);
-       if (ret) {
-               error("unable to add root ref for %llu: %d",
-                               root->root_key.objectid, ret);
-               goto fail;
-       }
-
-       ret = btrfs_commit_transaction(trans, root);
-       if (ret) {
-               error("transaction commit failed: %d", ret);
-               goto fail;
-       }
-
-       new_root = btrfs_read_fs_root(fs_info, &key);
-       if (IS_ERR(new_root)) {
-               error("unable to fs read root: %lu", PTR_ERR(new_root));
-               new_root = NULL;
-       }
-fail:
-       btrfs_init_path(&path);
-       return new_root;
-}
-
 static int create_subvol(struct btrfs_trans_handle *trans,
                         struct btrfs_root *root, u64 root_objectid)
 {
@@ -1039,9 +916,7 @@ static int make_convert_data_block_groups(struct btrfs_trans_handle *trans,
                        if (ret < 0)
                                break;
                        ret = btrfs_make_block_group(trans, fs_info, 0,
-                                       BTRFS_BLOCK_GROUP_DATA,
-                                       BTRFS_FIRST_CHUNK_TREE_OBJECTID,
-                                       cur, len);
+                                       BTRFS_BLOCK_GROUP_DATA, cur, len);
                        if (ret < 0)
                                break;
                        cur += len;
@@ -1238,7 +1113,7 @@ static int do_convert(const char *devname, u32 convert_flags, u32 nodesize,
                goto fail;
        fd = open(devname, O_RDWR);
        if (fd < 0) {
-               error("unable to open %s: %s", devname, strerror(errno));
+               error("unable to open %s: %m", devname);
                goto fail;
        }
        btrfs_parse_features_to_string(features_buf, features);
@@ -1319,7 +1194,8 @@ static int do_convert(const char *devname, u32 convert_flags, u32 nodesize,
                task_deinit(ctx.info);
        }
 
-       image_root = link_subvol(root, subvol_name, CONV_IMAGE_SUBVOL_OBJECTID);
+       image_root = btrfs_mksubvol(root, subvol_name,
+                                   CONV_IMAGE_SUBVOL_OBJECTID, true);
        if (!image_root) {
                error("unable to link subvolume %s", subvol_name);
                goto fail;
@@ -1565,6 +1441,8 @@ next:
                }
        }
        btrfs_release_path(&path);
+       if (ret)
+               return ret;
        /*
         * For HOLES mode (without NO_HOLES), we must ensure file extents
         * cover the whole range of the image
@@ -1646,12 +1524,18 @@ static int do_rollback(const char *devname)
        }
        fd = open(devname, O_RDWR);
        if (fd < 0) {
-               error("unable to open %s: %s", devname, strerror(errno));
+               error("unable to open %s: %m", devname);
                ret = -EIO;
                goto free_mem;
        }
        fsize = lseek(fd, 0, SEEK_END);
-       root = open_ctree_fd(fd, devname, 0, OPEN_CTREE_WRITES);
+
+       /*
+        * For rollback, we don't really need to write anything so open it
+        * read-only.  The write part will happen after we close the
+        * filesystem.
+        */
+       root = open_ctree_fd(fd, devname, 0, 0);
        if (!root) {
                error("unable to open ctree");
                ret = -EIO;