int btrfs_make_root_dir(struct btrfs_trans_handle *trans, struct btrfs_root *root, u64 objectid) { int ret; struct btrfs_inode_item inode_item; memset(&inode_item, 0, sizeof(inode_item)); btrfs_set_stack_inode_generation(&inode_item, trans->transid); btrfs_set_stack_inode_size(&inode_item, 0); btrfs_set_stack_inode_nlink(&inode_item, 1); btrfs_set_stack_inode_nbytes(&inode_item, root->leafsize); btrfs_set_stack_inode_mode(&inode_item, S_IFDIR | 0555); if (root->fs_info->tree_root == root) btrfs_set_super_root_dir(&root->fs_info->super_copy, objectid); ret = btrfs_insert_inode(trans, root, objectid, &inode_item); if (ret) goto error; ret = btrfs_insert_inode_ref(trans, root, "..", 2, objectid, objectid, 0); if (ret) goto error; btrfs_set_root_dirid(&root->root_item, objectid); ret = 0; error: return ret; }
/* * Unlike kernel btrfs_new_inode(), we only create the INODE_ITEM, without * its backref. * The backref is added by btrfs_add_link(). */ int btrfs_new_inode(struct btrfs_trans_handle *trans, struct btrfs_root *root, u64 ino, u32 mode) { struct btrfs_inode_item inode_item = {0}; int ret = 0; fill_inode_item(trans, &inode_item, mode, 0); ret = btrfs_insert_inode(trans, root, ino, &inode_item); return ret; }
static int add_inode_items(struct btrfs_trans_handle *trans, struct btrfs_root *root, struct stat *st, char *name, u64 self_objectid, ino_t parent_inum, int dir_index_cnt, struct btrfs_inode_item *inode_ret) { int ret; struct btrfs_key inode_key; struct btrfs_inode_item btrfs_inode; u64 objectid; u64 inode_size = 0; int name_len; name_len = strlen(name); fill_inode_item(trans, root, &btrfs_inode, st); objectid = self_objectid; if (S_ISDIR(st->st_mode)) { inode_size = calculate_dir_inode_size(name); btrfs_set_stack_inode_size(&btrfs_inode, inode_size); } inode_key.objectid = objectid; inode_key.offset = 0; btrfs_set_key_type(&inode_key, BTRFS_INODE_ITEM_KEY); ret = btrfs_insert_inode(trans, root, objectid, &btrfs_inode); if (ret) goto fail; ret = btrfs_insert_inode_ref(trans, root, name, name_len, objectid, parent_inum, dir_index_cnt); if (ret) goto fail; *inode_ret = btrfs_inode; fail: return ret; }