/* * 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; }