162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2011 Fujitsu. All rights reserved. 462306a36Sopenharmony_ci * Written by Miao Xie <miaox@cn.fujitsu.com> 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include <linux/slab.h> 862306a36Sopenharmony_ci#include <linux/iversion.h> 962306a36Sopenharmony_ci#include "ctree.h" 1062306a36Sopenharmony_ci#include "fs.h" 1162306a36Sopenharmony_ci#include "messages.h" 1262306a36Sopenharmony_ci#include "misc.h" 1362306a36Sopenharmony_ci#include "delayed-inode.h" 1462306a36Sopenharmony_ci#include "disk-io.h" 1562306a36Sopenharmony_ci#include "transaction.h" 1662306a36Sopenharmony_ci#include "qgroup.h" 1762306a36Sopenharmony_ci#include "locking.h" 1862306a36Sopenharmony_ci#include "inode-item.h" 1962306a36Sopenharmony_ci#include "space-info.h" 2062306a36Sopenharmony_ci#include "accessors.h" 2162306a36Sopenharmony_ci#include "file-item.h" 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#define BTRFS_DELAYED_WRITEBACK 512 2462306a36Sopenharmony_ci#define BTRFS_DELAYED_BACKGROUND 128 2562306a36Sopenharmony_ci#define BTRFS_DELAYED_BATCH 16 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_cistatic struct kmem_cache *delayed_node_cache; 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ciint __init btrfs_delayed_inode_init(void) 3062306a36Sopenharmony_ci{ 3162306a36Sopenharmony_ci delayed_node_cache = kmem_cache_create("btrfs_delayed_node", 3262306a36Sopenharmony_ci sizeof(struct btrfs_delayed_node), 3362306a36Sopenharmony_ci 0, 3462306a36Sopenharmony_ci SLAB_MEM_SPREAD, 3562306a36Sopenharmony_ci NULL); 3662306a36Sopenharmony_ci if (!delayed_node_cache) 3762306a36Sopenharmony_ci return -ENOMEM; 3862306a36Sopenharmony_ci return 0; 3962306a36Sopenharmony_ci} 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_civoid __cold btrfs_delayed_inode_exit(void) 4262306a36Sopenharmony_ci{ 4362306a36Sopenharmony_ci kmem_cache_destroy(delayed_node_cache); 4462306a36Sopenharmony_ci} 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_cistatic inline void btrfs_init_delayed_node( 4762306a36Sopenharmony_ci struct btrfs_delayed_node *delayed_node, 4862306a36Sopenharmony_ci struct btrfs_root *root, u64 inode_id) 4962306a36Sopenharmony_ci{ 5062306a36Sopenharmony_ci delayed_node->root = root; 5162306a36Sopenharmony_ci delayed_node->inode_id = inode_id; 5262306a36Sopenharmony_ci refcount_set(&delayed_node->refs, 0); 5362306a36Sopenharmony_ci delayed_node->ins_root = RB_ROOT_CACHED; 5462306a36Sopenharmony_ci delayed_node->del_root = RB_ROOT_CACHED; 5562306a36Sopenharmony_ci mutex_init(&delayed_node->mutex); 5662306a36Sopenharmony_ci INIT_LIST_HEAD(&delayed_node->n_list); 5762306a36Sopenharmony_ci INIT_LIST_HEAD(&delayed_node->p_list); 5862306a36Sopenharmony_ci} 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_cistatic struct btrfs_delayed_node *btrfs_get_delayed_node( 6162306a36Sopenharmony_ci struct btrfs_inode *btrfs_inode) 6262306a36Sopenharmony_ci{ 6362306a36Sopenharmony_ci struct btrfs_root *root = btrfs_inode->root; 6462306a36Sopenharmony_ci u64 ino = btrfs_ino(btrfs_inode); 6562306a36Sopenharmony_ci struct btrfs_delayed_node *node; 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci node = READ_ONCE(btrfs_inode->delayed_node); 6862306a36Sopenharmony_ci if (node) { 6962306a36Sopenharmony_ci refcount_inc(&node->refs); 7062306a36Sopenharmony_ci return node; 7162306a36Sopenharmony_ci } 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci spin_lock(&root->inode_lock); 7462306a36Sopenharmony_ci node = radix_tree_lookup(&root->delayed_nodes_tree, ino); 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci if (node) { 7762306a36Sopenharmony_ci if (btrfs_inode->delayed_node) { 7862306a36Sopenharmony_ci refcount_inc(&node->refs); /* can be accessed */ 7962306a36Sopenharmony_ci BUG_ON(btrfs_inode->delayed_node != node); 8062306a36Sopenharmony_ci spin_unlock(&root->inode_lock); 8162306a36Sopenharmony_ci return node; 8262306a36Sopenharmony_ci } 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci /* 8562306a36Sopenharmony_ci * It's possible that we're racing into the middle of removing 8662306a36Sopenharmony_ci * this node from the radix tree. In this case, the refcount 8762306a36Sopenharmony_ci * was zero and it should never go back to one. Just return 8862306a36Sopenharmony_ci * NULL like it was never in the radix at all; our release 8962306a36Sopenharmony_ci * function is in the process of removing it. 9062306a36Sopenharmony_ci * 9162306a36Sopenharmony_ci * Some implementations of refcount_inc refuse to bump the 9262306a36Sopenharmony_ci * refcount once it has hit zero. If we don't do this dance 9362306a36Sopenharmony_ci * here, refcount_inc() may decide to just WARN_ONCE() instead 9462306a36Sopenharmony_ci * of actually bumping the refcount. 9562306a36Sopenharmony_ci * 9662306a36Sopenharmony_ci * If this node is properly in the radix, we want to bump the 9762306a36Sopenharmony_ci * refcount twice, once for the inode and once for this get 9862306a36Sopenharmony_ci * operation. 9962306a36Sopenharmony_ci */ 10062306a36Sopenharmony_ci if (refcount_inc_not_zero(&node->refs)) { 10162306a36Sopenharmony_ci refcount_inc(&node->refs); 10262306a36Sopenharmony_ci btrfs_inode->delayed_node = node; 10362306a36Sopenharmony_ci } else { 10462306a36Sopenharmony_ci node = NULL; 10562306a36Sopenharmony_ci } 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci spin_unlock(&root->inode_lock); 10862306a36Sopenharmony_ci return node; 10962306a36Sopenharmony_ci } 11062306a36Sopenharmony_ci spin_unlock(&root->inode_lock); 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci return NULL; 11362306a36Sopenharmony_ci} 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci/* Will return either the node or PTR_ERR(-ENOMEM) */ 11662306a36Sopenharmony_cistatic struct btrfs_delayed_node *btrfs_get_or_create_delayed_node( 11762306a36Sopenharmony_ci struct btrfs_inode *btrfs_inode) 11862306a36Sopenharmony_ci{ 11962306a36Sopenharmony_ci struct btrfs_delayed_node *node; 12062306a36Sopenharmony_ci struct btrfs_root *root = btrfs_inode->root; 12162306a36Sopenharmony_ci u64 ino = btrfs_ino(btrfs_inode); 12262306a36Sopenharmony_ci int ret; 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ciagain: 12562306a36Sopenharmony_ci node = btrfs_get_delayed_node(btrfs_inode); 12662306a36Sopenharmony_ci if (node) 12762306a36Sopenharmony_ci return node; 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci node = kmem_cache_zalloc(delayed_node_cache, GFP_NOFS); 13062306a36Sopenharmony_ci if (!node) 13162306a36Sopenharmony_ci return ERR_PTR(-ENOMEM); 13262306a36Sopenharmony_ci btrfs_init_delayed_node(node, root, ino); 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ci /* cached in the btrfs inode and can be accessed */ 13562306a36Sopenharmony_ci refcount_set(&node->refs, 2); 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci ret = radix_tree_preload(GFP_NOFS); 13862306a36Sopenharmony_ci if (ret) { 13962306a36Sopenharmony_ci kmem_cache_free(delayed_node_cache, node); 14062306a36Sopenharmony_ci return ERR_PTR(ret); 14162306a36Sopenharmony_ci } 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci spin_lock(&root->inode_lock); 14462306a36Sopenharmony_ci ret = radix_tree_insert(&root->delayed_nodes_tree, ino, node); 14562306a36Sopenharmony_ci if (ret == -EEXIST) { 14662306a36Sopenharmony_ci spin_unlock(&root->inode_lock); 14762306a36Sopenharmony_ci kmem_cache_free(delayed_node_cache, node); 14862306a36Sopenharmony_ci radix_tree_preload_end(); 14962306a36Sopenharmony_ci goto again; 15062306a36Sopenharmony_ci } 15162306a36Sopenharmony_ci btrfs_inode->delayed_node = node; 15262306a36Sopenharmony_ci spin_unlock(&root->inode_lock); 15362306a36Sopenharmony_ci radix_tree_preload_end(); 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_ci return node; 15662306a36Sopenharmony_ci} 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_ci/* 15962306a36Sopenharmony_ci * Call it when holding delayed_node->mutex 16062306a36Sopenharmony_ci * 16162306a36Sopenharmony_ci * If mod = 1, add this node into the prepared list. 16262306a36Sopenharmony_ci */ 16362306a36Sopenharmony_cistatic void btrfs_queue_delayed_node(struct btrfs_delayed_root *root, 16462306a36Sopenharmony_ci struct btrfs_delayed_node *node, 16562306a36Sopenharmony_ci int mod) 16662306a36Sopenharmony_ci{ 16762306a36Sopenharmony_ci spin_lock(&root->lock); 16862306a36Sopenharmony_ci if (test_bit(BTRFS_DELAYED_NODE_IN_LIST, &node->flags)) { 16962306a36Sopenharmony_ci if (!list_empty(&node->p_list)) 17062306a36Sopenharmony_ci list_move_tail(&node->p_list, &root->prepare_list); 17162306a36Sopenharmony_ci else if (mod) 17262306a36Sopenharmony_ci list_add_tail(&node->p_list, &root->prepare_list); 17362306a36Sopenharmony_ci } else { 17462306a36Sopenharmony_ci list_add_tail(&node->n_list, &root->node_list); 17562306a36Sopenharmony_ci list_add_tail(&node->p_list, &root->prepare_list); 17662306a36Sopenharmony_ci refcount_inc(&node->refs); /* inserted into list */ 17762306a36Sopenharmony_ci root->nodes++; 17862306a36Sopenharmony_ci set_bit(BTRFS_DELAYED_NODE_IN_LIST, &node->flags); 17962306a36Sopenharmony_ci } 18062306a36Sopenharmony_ci spin_unlock(&root->lock); 18162306a36Sopenharmony_ci} 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_ci/* Call it when holding delayed_node->mutex */ 18462306a36Sopenharmony_cistatic void btrfs_dequeue_delayed_node(struct btrfs_delayed_root *root, 18562306a36Sopenharmony_ci struct btrfs_delayed_node *node) 18662306a36Sopenharmony_ci{ 18762306a36Sopenharmony_ci spin_lock(&root->lock); 18862306a36Sopenharmony_ci if (test_bit(BTRFS_DELAYED_NODE_IN_LIST, &node->flags)) { 18962306a36Sopenharmony_ci root->nodes--; 19062306a36Sopenharmony_ci refcount_dec(&node->refs); /* not in the list */ 19162306a36Sopenharmony_ci list_del_init(&node->n_list); 19262306a36Sopenharmony_ci if (!list_empty(&node->p_list)) 19362306a36Sopenharmony_ci list_del_init(&node->p_list); 19462306a36Sopenharmony_ci clear_bit(BTRFS_DELAYED_NODE_IN_LIST, &node->flags); 19562306a36Sopenharmony_ci } 19662306a36Sopenharmony_ci spin_unlock(&root->lock); 19762306a36Sopenharmony_ci} 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_cistatic struct btrfs_delayed_node *btrfs_first_delayed_node( 20062306a36Sopenharmony_ci struct btrfs_delayed_root *delayed_root) 20162306a36Sopenharmony_ci{ 20262306a36Sopenharmony_ci struct list_head *p; 20362306a36Sopenharmony_ci struct btrfs_delayed_node *node = NULL; 20462306a36Sopenharmony_ci 20562306a36Sopenharmony_ci spin_lock(&delayed_root->lock); 20662306a36Sopenharmony_ci if (list_empty(&delayed_root->node_list)) 20762306a36Sopenharmony_ci goto out; 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci p = delayed_root->node_list.next; 21062306a36Sopenharmony_ci node = list_entry(p, struct btrfs_delayed_node, n_list); 21162306a36Sopenharmony_ci refcount_inc(&node->refs); 21262306a36Sopenharmony_ciout: 21362306a36Sopenharmony_ci spin_unlock(&delayed_root->lock); 21462306a36Sopenharmony_ci 21562306a36Sopenharmony_ci return node; 21662306a36Sopenharmony_ci} 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_cistatic struct btrfs_delayed_node *btrfs_next_delayed_node( 21962306a36Sopenharmony_ci struct btrfs_delayed_node *node) 22062306a36Sopenharmony_ci{ 22162306a36Sopenharmony_ci struct btrfs_delayed_root *delayed_root; 22262306a36Sopenharmony_ci struct list_head *p; 22362306a36Sopenharmony_ci struct btrfs_delayed_node *next = NULL; 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_ci delayed_root = node->root->fs_info->delayed_root; 22662306a36Sopenharmony_ci spin_lock(&delayed_root->lock); 22762306a36Sopenharmony_ci if (!test_bit(BTRFS_DELAYED_NODE_IN_LIST, &node->flags)) { 22862306a36Sopenharmony_ci /* not in the list */ 22962306a36Sopenharmony_ci if (list_empty(&delayed_root->node_list)) 23062306a36Sopenharmony_ci goto out; 23162306a36Sopenharmony_ci p = delayed_root->node_list.next; 23262306a36Sopenharmony_ci } else if (list_is_last(&node->n_list, &delayed_root->node_list)) 23362306a36Sopenharmony_ci goto out; 23462306a36Sopenharmony_ci else 23562306a36Sopenharmony_ci p = node->n_list.next; 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_ci next = list_entry(p, struct btrfs_delayed_node, n_list); 23862306a36Sopenharmony_ci refcount_inc(&next->refs); 23962306a36Sopenharmony_ciout: 24062306a36Sopenharmony_ci spin_unlock(&delayed_root->lock); 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_ci return next; 24362306a36Sopenharmony_ci} 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_cistatic void __btrfs_release_delayed_node( 24662306a36Sopenharmony_ci struct btrfs_delayed_node *delayed_node, 24762306a36Sopenharmony_ci int mod) 24862306a36Sopenharmony_ci{ 24962306a36Sopenharmony_ci struct btrfs_delayed_root *delayed_root; 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_ci if (!delayed_node) 25262306a36Sopenharmony_ci return; 25362306a36Sopenharmony_ci 25462306a36Sopenharmony_ci delayed_root = delayed_node->root->fs_info->delayed_root; 25562306a36Sopenharmony_ci 25662306a36Sopenharmony_ci mutex_lock(&delayed_node->mutex); 25762306a36Sopenharmony_ci if (delayed_node->count) 25862306a36Sopenharmony_ci btrfs_queue_delayed_node(delayed_root, delayed_node, mod); 25962306a36Sopenharmony_ci else 26062306a36Sopenharmony_ci btrfs_dequeue_delayed_node(delayed_root, delayed_node); 26162306a36Sopenharmony_ci mutex_unlock(&delayed_node->mutex); 26262306a36Sopenharmony_ci 26362306a36Sopenharmony_ci if (refcount_dec_and_test(&delayed_node->refs)) { 26462306a36Sopenharmony_ci struct btrfs_root *root = delayed_node->root; 26562306a36Sopenharmony_ci 26662306a36Sopenharmony_ci spin_lock(&root->inode_lock); 26762306a36Sopenharmony_ci /* 26862306a36Sopenharmony_ci * Once our refcount goes to zero, nobody is allowed to bump it 26962306a36Sopenharmony_ci * back up. We can delete it now. 27062306a36Sopenharmony_ci */ 27162306a36Sopenharmony_ci ASSERT(refcount_read(&delayed_node->refs) == 0); 27262306a36Sopenharmony_ci radix_tree_delete(&root->delayed_nodes_tree, 27362306a36Sopenharmony_ci delayed_node->inode_id); 27462306a36Sopenharmony_ci spin_unlock(&root->inode_lock); 27562306a36Sopenharmony_ci kmem_cache_free(delayed_node_cache, delayed_node); 27662306a36Sopenharmony_ci } 27762306a36Sopenharmony_ci} 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_cistatic inline void btrfs_release_delayed_node(struct btrfs_delayed_node *node) 28062306a36Sopenharmony_ci{ 28162306a36Sopenharmony_ci __btrfs_release_delayed_node(node, 0); 28262306a36Sopenharmony_ci} 28362306a36Sopenharmony_ci 28462306a36Sopenharmony_cistatic struct btrfs_delayed_node *btrfs_first_prepared_delayed_node( 28562306a36Sopenharmony_ci struct btrfs_delayed_root *delayed_root) 28662306a36Sopenharmony_ci{ 28762306a36Sopenharmony_ci struct list_head *p; 28862306a36Sopenharmony_ci struct btrfs_delayed_node *node = NULL; 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_ci spin_lock(&delayed_root->lock); 29162306a36Sopenharmony_ci if (list_empty(&delayed_root->prepare_list)) 29262306a36Sopenharmony_ci goto out; 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_ci p = delayed_root->prepare_list.next; 29562306a36Sopenharmony_ci list_del_init(p); 29662306a36Sopenharmony_ci node = list_entry(p, struct btrfs_delayed_node, p_list); 29762306a36Sopenharmony_ci refcount_inc(&node->refs); 29862306a36Sopenharmony_ciout: 29962306a36Sopenharmony_ci spin_unlock(&delayed_root->lock); 30062306a36Sopenharmony_ci 30162306a36Sopenharmony_ci return node; 30262306a36Sopenharmony_ci} 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_cistatic inline void btrfs_release_prepared_delayed_node( 30562306a36Sopenharmony_ci struct btrfs_delayed_node *node) 30662306a36Sopenharmony_ci{ 30762306a36Sopenharmony_ci __btrfs_release_delayed_node(node, 1); 30862306a36Sopenharmony_ci} 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_cistatic struct btrfs_delayed_item *btrfs_alloc_delayed_item(u16 data_len, 31162306a36Sopenharmony_ci struct btrfs_delayed_node *node, 31262306a36Sopenharmony_ci enum btrfs_delayed_item_type type) 31362306a36Sopenharmony_ci{ 31462306a36Sopenharmony_ci struct btrfs_delayed_item *item; 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_ci item = kmalloc(struct_size(item, data, data_len), GFP_NOFS); 31762306a36Sopenharmony_ci if (item) { 31862306a36Sopenharmony_ci item->data_len = data_len; 31962306a36Sopenharmony_ci item->type = type; 32062306a36Sopenharmony_ci item->bytes_reserved = 0; 32162306a36Sopenharmony_ci item->delayed_node = node; 32262306a36Sopenharmony_ci RB_CLEAR_NODE(&item->rb_node); 32362306a36Sopenharmony_ci INIT_LIST_HEAD(&item->log_list); 32462306a36Sopenharmony_ci item->logged = false; 32562306a36Sopenharmony_ci refcount_set(&item->refs, 1); 32662306a36Sopenharmony_ci } 32762306a36Sopenharmony_ci return item; 32862306a36Sopenharmony_ci} 32962306a36Sopenharmony_ci 33062306a36Sopenharmony_ci/* 33162306a36Sopenharmony_ci * __btrfs_lookup_delayed_item - look up the delayed item by key 33262306a36Sopenharmony_ci * @delayed_node: pointer to the delayed node 33362306a36Sopenharmony_ci * @index: the dir index value to lookup (offset of a dir index key) 33462306a36Sopenharmony_ci * 33562306a36Sopenharmony_ci * Note: if we don't find the right item, we will return the prev item and 33662306a36Sopenharmony_ci * the next item. 33762306a36Sopenharmony_ci */ 33862306a36Sopenharmony_cistatic struct btrfs_delayed_item *__btrfs_lookup_delayed_item( 33962306a36Sopenharmony_ci struct rb_root *root, 34062306a36Sopenharmony_ci u64 index) 34162306a36Sopenharmony_ci{ 34262306a36Sopenharmony_ci struct rb_node *node = root->rb_node; 34362306a36Sopenharmony_ci struct btrfs_delayed_item *delayed_item = NULL; 34462306a36Sopenharmony_ci 34562306a36Sopenharmony_ci while (node) { 34662306a36Sopenharmony_ci delayed_item = rb_entry(node, struct btrfs_delayed_item, 34762306a36Sopenharmony_ci rb_node); 34862306a36Sopenharmony_ci if (delayed_item->index < index) 34962306a36Sopenharmony_ci node = node->rb_right; 35062306a36Sopenharmony_ci else if (delayed_item->index > index) 35162306a36Sopenharmony_ci node = node->rb_left; 35262306a36Sopenharmony_ci else 35362306a36Sopenharmony_ci return delayed_item; 35462306a36Sopenharmony_ci } 35562306a36Sopenharmony_ci 35662306a36Sopenharmony_ci return NULL; 35762306a36Sopenharmony_ci} 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_cistatic int __btrfs_add_delayed_item(struct btrfs_delayed_node *delayed_node, 36062306a36Sopenharmony_ci struct btrfs_delayed_item *ins) 36162306a36Sopenharmony_ci{ 36262306a36Sopenharmony_ci struct rb_node **p, *node; 36362306a36Sopenharmony_ci struct rb_node *parent_node = NULL; 36462306a36Sopenharmony_ci struct rb_root_cached *root; 36562306a36Sopenharmony_ci struct btrfs_delayed_item *item; 36662306a36Sopenharmony_ci bool leftmost = true; 36762306a36Sopenharmony_ci 36862306a36Sopenharmony_ci if (ins->type == BTRFS_DELAYED_INSERTION_ITEM) 36962306a36Sopenharmony_ci root = &delayed_node->ins_root; 37062306a36Sopenharmony_ci else 37162306a36Sopenharmony_ci root = &delayed_node->del_root; 37262306a36Sopenharmony_ci 37362306a36Sopenharmony_ci p = &root->rb_root.rb_node; 37462306a36Sopenharmony_ci node = &ins->rb_node; 37562306a36Sopenharmony_ci 37662306a36Sopenharmony_ci while (*p) { 37762306a36Sopenharmony_ci parent_node = *p; 37862306a36Sopenharmony_ci item = rb_entry(parent_node, struct btrfs_delayed_item, 37962306a36Sopenharmony_ci rb_node); 38062306a36Sopenharmony_ci 38162306a36Sopenharmony_ci if (item->index < ins->index) { 38262306a36Sopenharmony_ci p = &(*p)->rb_right; 38362306a36Sopenharmony_ci leftmost = false; 38462306a36Sopenharmony_ci } else if (item->index > ins->index) { 38562306a36Sopenharmony_ci p = &(*p)->rb_left; 38662306a36Sopenharmony_ci } else { 38762306a36Sopenharmony_ci return -EEXIST; 38862306a36Sopenharmony_ci } 38962306a36Sopenharmony_ci } 39062306a36Sopenharmony_ci 39162306a36Sopenharmony_ci rb_link_node(node, parent_node, p); 39262306a36Sopenharmony_ci rb_insert_color_cached(node, root, leftmost); 39362306a36Sopenharmony_ci 39462306a36Sopenharmony_ci if (ins->type == BTRFS_DELAYED_INSERTION_ITEM && 39562306a36Sopenharmony_ci ins->index >= delayed_node->index_cnt) 39662306a36Sopenharmony_ci delayed_node->index_cnt = ins->index + 1; 39762306a36Sopenharmony_ci 39862306a36Sopenharmony_ci delayed_node->count++; 39962306a36Sopenharmony_ci atomic_inc(&delayed_node->root->fs_info->delayed_root->items); 40062306a36Sopenharmony_ci return 0; 40162306a36Sopenharmony_ci} 40262306a36Sopenharmony_ci 40362306a36Sopenharmony_cistatic void finish_one_item(struct btrfs_delayed_root *delayed_root) 40462306a36Sopenharmony_ci{ 40562306a36Sopenharmony_ci int seq = atomic_inc_return(&delayed_root->items_seq); 40662306a36Sopenharmony_ci 40762306a36Sopenharmony_ci /* atomic_dec_return implies a barrier */ 40862306a36Sopenharmony_ci if ((atomic_dec_return(&delayed_root->items) < 40962306a36Sopenharmony_ci BTRFS_DELAYED_BACKGROUND || seq % BTRFS_DELAYED_BATCH == 0)) 41062306a36Sopenharmony_ci cond_wake_up_nomb(&delayed_root->wait); 41162306a36Sopenharmony_ci} 41262306a36Sopenharmony_ci 41362306a36Sopenharmony_cistatic void __btrfs_remove_delayed_item(struct btrfs_delayed_item *delayed_item) 41462306a36Sopenharmony_ci{ 41562306a36Sopenharmony_ci struct btrfs_delayed_node *delayed_node = delayed_item->delayed_node; 41662306a36Sopenharmony_ci struct rb_root_cached *root; 41762306a36Sopenharmony_ci struct btrfs_delayed_root *delayed_root; 41862306a36Sopenharmony_ci 41962306a36Sopenharmony_ci /* Not inserted, ignore it. */ 42062306a36Sopenharmony_ci if (RB_EMPTY_NODE(&delayed_item->rb_node)) 42162306a36Sopenharmony_ci return; 42262306a36Sopenharmony_ci 42362306a36Sopenharmony_ci /* If it's in a rbtree, then we need to have delayed node locked. */ 42462306a36Sopenharmony_ci lockdep_assert_held(&delayed_node->mutex); 42562306a36Sopenharmony_ci 42662306a36Sopenharmony_ci delayed_root = delayed_node->root->fs_info->delayed_root; 42762306a36Sopenharmony_ci 42862306a36Sopenharmony_ci BUG_ON(!delayed_root); 42962306a36Sopenharmony_ci 43062306a36Sopenharmony_ci if (delayed_item->type == BTRFS_DELAYED_INSERTION_ITEM) 43162306a36Sopenharmony_ci root = &delayed_node->ins_root; 43262306a36Sopenharmony_ci else 43362306a36Sopenharmony_ci root = &delayed_node->del_root; 43462306a36Sopenharmony_ci 43562306a36Sopenharmony_ci rb_erase_cached(&delayed_item->rb_node, root); 43662306a36Sopenharmony_ci RB_CLEAR_NODE(&delayed_item->rb_node); 43762306a36Sopenharmony_ci delayed_node->count--; 43862306a36Sopenharmony_ci 43962306a36Sopenharmony_ci finish_one_item(delayed_root); 44062306a36Sopenharmony_ci} 44162306a36Sopenharmony_ci 44262306a36Sopenharmony_cistatic void btrfs_release_delayed_item(struct btrfs_delayed_item *item) 44362306a36Sopenharmony_ci{ 44462306a36Sopenharmony_ci if (item) { 44562306a36Sopenharmony_ci __btrfs_remove_delayed_item(item); 44662306a36Sopenharmony_ci if (refcount_dec_and_test(&item->refs)) 44762306a36Sopenharmony_ci kfree(item); 44862306a36Sopenharmony_ci } 44962306a36Sopenharmony_ci} 45062306a36Sopenharmony_ci 45162306a36Sopenharmony_cistatic struct btrfs_delayed_item *__btrfs_first_delayed_insertion_item( 45262306a36Sopenharmony_ci struct btrfs_delayed_node *delayed_node) 45362306a36Sopenharmony_ci{ 45462306a36Sopenharmony_ci struct rb_node *p; 45562306a36Sopenharmony_ci struct btrfs_delayed_item *item = NULL; 45662306a36Sopenharmony_ci 45762306a36Sopenharmony_ci p = rb_first_cached(&delayed_node->ins_root); 45862306a36Sopenharmony_ci if (p) 45962306a36Sopenharmony_ci item = rb_entry(p, struct btrfs_delayed_item, rb_node); 46062306a36Sopenharmony_ci 46162306a36Sopenharmony_ci return item; 46262306a36Sopenharmony_ci} 46362306a36Sopenharmony_ci 46462306a36Sopenharmony_cistatic struct btrfs_delayed_item *__btrfs_first_delayed_deletion_item( 46562306a36Sopenharmony_ci struct btrfs_delayed_node *delayed_node) 46662306a36Sopenharmony_ci{ 46762306a36Sopenharmony_ci struct rb_node *p; 46862306a36Sopenharmony_ci struct btrfs_delayed_item *item = NULL; 46962306a36Sopenharmony_ci 47062306a36Sopenharmony_ci p = rb_first_cached(&delayed_node->del_root); 47162306a36Sopenharmony_ci if (p) 47262306a36Sopenharmony_ci item = rb_entry(p, struct btrfs_delayed_item, rb_node); 47362306a36Sopenharmony_ci 47462306a36Sopenharmony_ci return item; 47562306a36Sopenharmony_ci} 47662306a36Sopenharmony_ci 47762306a36Sopenharmony_cistatic struct btrfs_delayed_item *__btrfs_next_delayed_item( 47862306a36Sopenharmony_ci struct btrfs_delayed_item *item) 47962306a36Sopenharmony_ci{ 48062306a36Sopenharmony_ci struct rb_node *p; 48162306a36Sopenharmony_ci struct btrfs_delayed_item *next = NULL; 48262306a36Sopenharmony_ci 48362306a36Sopenharmony_ci p = rb_next(&item->rb_node); 48462306a36Sopenharmony_ci if (p) 48562306a36Sopenharmony_ci next = rb_entry(p, struct btrfs_delayed_item, rb_node); 48662306a36Sopenharmony_ci 48762306a36Sopenharmony_ci return next; 48862306a36Sopenharmony_ci} 48962306a36Sopenharmony_ci 49062306a36Sopenharmony_cistatic int btrfs_delayed_item_reserve_metadata(struct btrfs_trans_handle *trans, 49162306a36Sopenharmony_ci struct btrfs_delayed_item *item) 49262306a36Sopenharmony_ci{ 49362306a36Sopenharmony_ci struct btrfs_block_rsv *src_rsv; 49462306a36Sopenharmony_ci struct btrfs_block_rsv *dst_rsv; 49562306a36Sopenharmony_ci struct btrfs_fs_info *fs_info = trans->fs_info; 49662306a36Sopenharmony_ci u64 num_bytes; 49762306a36Sopenharmony_ci int ret; 49862306a36Sopenharmony_ci 49962306a36Sopenharmony_ci if (!trans->bytes_reserved) 50062306a36Sopenharmony_ci return 0; 50162306a36Sopenharmony_ci 50262306a36Sopenharmony_ci src_rsv = trans->block_rsv; 50362306a36Sopenharmony_ci dst_rsv = &fs_info->delayed_block_rsv; 50462306a36Sopenharmony_ci 50562306a36Sopenharmony_ci num_bytes = btrfs_calc_insert_metadata_size(fs_info, 1); 50662306a36Sopenharmony_ci 50762306a36Sopenharmony_ci /* 50862306a36Sopenharmony_ci * Here we migrate space rsv from transaction rsv, since have already 50962306a36Sopenharmony_ci * reserved space when starting a transaction. So no need to reserve 51062306a36Sopenharmony_ci * qgroup space here. 51162306a36Sopenharmony_ci */ 51262306a36Sopenharmony_ci ret = btrfs_block_rsv_migrate(src_rsv, dst_rsv, num_bytes, true); 51362306a36Sopenharmony_ci if (!ret) { 51462306a36Sopenharmony_ci trace_btrfs_space_reservation(fs_info, "delayed_item", 51562306a36Sopenharmony_ci item->delayed_node->inode_id, 51662306a36Sopenharmony_ci num_bytes, 1); 51762306a36Sopenharmony_ci /* 51862306a36Sopenharmony_ci * For insertions we track reserved metadata space by accounting 51962306a36Sopenharmony_ci * for the number of leaves that will be used, based on the delayed 52062306a36Sopenharmony_ci * node's index_items_size field. 52162306a36Sopenharmony_ci */ 52262306a36Sopenharmony_ci if (item->type == BTRFS_DELAYED_DELETION_ITEM) 52362306a36Sopenharmony_ci item->bytes_reserved = num_bytes; 52462306a36Sopenharmony_ci } 52562306a36Sopenharmony_ci 52662306a36Sopenharmony_ci return ret; 52762306a36Sopenharmony_ci} 52862306a36Sopenharmony_ci 52962306a36Sopenharmony_cistatic void btrfs_delayed_item_release_metadata(struct btrfs_root *root, 53062306a36Sopenharmony_ci struct btrfs_delayed_item *item) 53162306a36Sopenharmony_ci{ 53262306a36Sopenharmony_ci struct btrfs_block_rsv *rsv; 53362306a36Sopenharmony_ci struct btrfs_fs_info *fs_info = root->fs_info; 53462306a36Sopenharmony_ci 53562306a36Sopenharmony_ci if (!item->bytes_reserved) 53662306a36Sopenharmony_ci return; 53762306a36Sopenharmony_ci 53862306a36Sopenharmony_ci rsv = &fs_info->delayed_block_rsv; 53962306a36Sopenharmony_ci /* 54062306a36Sopenharmony_ci * Check btrfs_delayed_item_reserve_metadata() to see why we don't need 54162306a36Sopenharmony_ci * to release/reserve qgroup space. 54262306a36Sopenharmony_ci */ 54362306a36Sopenharmony_ci trace_btrfs_space_reservation(fs_info, "delayed_item", 54462306a36Sopenharmony_ci item->delayed_node->inode_id, 54562306a36Sopenharmony_ci item->bytes_reserved, 0); 54662306a36Sopenharmony_ci btrfs_block_rsv_release(fs_info, rsv, item->bytes_reserved, NULL); 54762306a36Sopenharmony_ci} 54862306a36Sopenharmony_ci 54962306a36Sopenharmony_cistatic void btrfs_delayed_item_release_leaves(struct btrfs_delayed_node *node, 55062306a36Sopenharmony_ci unsigned int num_leaves) 55162306a36Sopenharmony_ci{ 55262306a36Sopenharmony_ci struct btrfs_fs_info *fs_info = node->root->fs_info; 55362306a36Sopenharmony_ci const u64 bytes = btrfs_calc_insert_metadata_size(fs_info, num_leaves); 55462306a36Sopenharmony_ci 55562306a36Sopenharmony_ci /* There are no space reservations during log replay, bail out. */ 55662306a36Sopenharmony_ci if (test_bit(BTRFS_FS_LOG_RECOVERING, &fs_info->flags)) 55762306a36Sopenharmony_ci return; 55862306a36Sopenharmony_ci 55962306a36Sopenharmony_ci trace_btrfs_space_reservation(fs_info, "delayed_item", node->inode_id, 56062306a36Sopenharmony_ci bytes, 0); 56162306a36Sopenharmony_ci btrfs_block_rsv_release(fs_info, &fs_info->delayed_block_rsv, bytes, NULL); 56262306a36Sopenharmony_ci} 56362306a36Sopenharmony_ci 56462306a36Sopenharmony_cistatic int btrfs_delayed_inode_reserve_metadata( 56562306a36Sopenharmony_ci struct btrfs_trans_handle *trans, 56662306a36Sopenharmony_ci struct btrfs_root *root, 56762306a36Sopenharmony_ci struct btrfs_delayed_node *node) 56862306a36Sopenharmony_ci{ 56962306a36Sopenharmony_ci struct btrfs_fs_info *fs_info = root->fs_info; 57062306a36Sopenharmony_ci struct btrfs_block_rsv *src_rsv; 57162306a36Sopenharmony_ci struct btrfs_block_rsv *dst_rsv; 57262306a36Sopenharmony_ci u64 num_bytes; 57362306a36Sopenharmony_ci int ret; 57462306a36Sopenharmony_ci 57562306a36Sopenharmony_ci src_rsv = trans->block_rsv; 57662306a36Sopenharmony_ci dst_rsv = &fs_info->delayed_block_rsv; 57762306a36Sopenharmony_ci 57862306a36Sopenharmony_ci num_bytes = btrfs_calc_metadata_size(fs_info, 1); 57962306a36Sopenharmony_ci 58062306a36Sopenharmony_ci /* 58162306a36Sopenharmony_ci * btrfs_dirty_inode will update the inode under btrfs_join_transaction 58262306a36Sopenharmony_ci * which doesn't reserve space for speed. This is a problem since we 58362306a36Sopenharmony_ci * still need to reserve space for this update, so try to reserve the 58462306a36Sopenharmony_ci * space. 58562306a36Sopenharmony_ci * 58662306a36Sopenharmony_ci * Now if src_rsv == delalloc_block_rsv we'll let it just steal since 58762306a36Sopenharmony_ci * we always reserve enough to update the inode item. 58862306a36Sopenharmony_ci */ 58962306a36Sopenharmony_ci if (!src_rsv || (!trans->bytes_reserved && 59062306a36Sopenharmony_ci src_rsv->type != BTRFS_BLOCK_RSV_DELALLOC)) { 59162306a36Sopenharmony_ci ret = btrfs_qgroup_reserve_meta(root, num_bytes, 59262306a36Sopenharmony_ci BTRFS_QGROUP_RSV_META_PREALLOC, true); 59362306a36Sopenharmony_ci if (ret < 0) 59462306a36Sopenharmony_ci return ret; 59562306a36Sopenharmony_ci ret = btrfs_block_rsv_add(fs_info, dst_rsv, num_bytes, 59662306a36Sopenharmony_ci BTRFS_RESERVE_NO_FLUSH); 59762306a36Sopenharmony_ci /* NO_FLUSH could only fail with -ENOSPC */ 59862306a36Sopenharmony_ci ASSERT(ret == 0 || ret == -ENOSPC); 59962306a36Sopenharmony_ci if (ret) 60062306a36Sopenharmony_ci btrfs_qgroup_free_meta_prealloc(root, num_bytes); 60162306a36Sopenharmony_ci } else { 60262306a36Sopenharmony_ci ret = btrfs_block_rsv_migrate(src_rsv, dst_rsv, num_bytes, true); 60362306a36Sopenharmony_ci } 60462306a36Sopenharmony_ci 60562306a36Sopenharmony_ci if (!ret) { 60662306a36Sopenharmony_ci trace_btrfs_space_reservation(fs_info, "delayed_inode", 60762306a36Sopenharmony_ci node->inode_id, num_bytes, 1); 60862306a36Sopenharmony_ci node->bytes_reserved = num_bytes; 60962306a36Sopenharmony_ci } 61062306a36Sopenharmony_ci 61162306a36Sopenharmony_ci return ret; 61262306a36Sopenharmony_ci} 61362306a36Sopenharmony_ci 61462306a36Sopenharmony_cistatic void btrfs_delayed_inode_release_metadata(struct btrfs_fs_info *fs_info, 61562306a36Sopenharmony_ci struct btrfs_delayed_node *node, 61662306a36Sopenharmony_ci bool qgroup_free) 61762306a36Sopenharmony_ci{ 61862306a36Sopenharmony_ci struct btrfs_block_rsv *rsv; 61962306a36Sopenharmony_ci 62062306a36Sopenharmony_ci if (!node->bytes_reserved) 62162306a36Sopenharmony_ci return; 62262306a36Sopenharmony_ci 62362306a36Sopenharmony_ci rsv = &fs_info->delayed_block_rsv; 62462306a36Sopenharmony_ci trace_btrfs_space_reservation(fs_info, "delayed_inode", 62562306a36Sopenharmony_ci node->inode_id, node->bytes_reserved, 0); 62662306a36Sopenharmony_ci btrfs_block_rsv_release(fs_info, rsv, node->bytes_reserved, NULL); 62762306a36Sopenharmony_ci if (qgroup_free) 62862306a36Sopenharmony_ci btrfs_qgroup_free_meta_prealloc(node->root, 62962306a36Sopenharmony_ci node->bytes_reserved); 63062306a36Sopenharmony_ci else 63162306a36Sopenharmony_ci btrfs_qgroup_convert_reserved_meta(node->root, 63262306a36Sopenharmony_ci node->bytes_reserved); 63362306a36Sopenharmony_ci node->bytes_reserved = 0; 63462306a36Sopenharmony_ci} 63562306a36Sopenharmony_ci 63662306a36Sopenharmony_ci/* 63762306a36Sopenharmony_ci * Insert a single delayed item or a batch of delayed items, as many as possible 63862306a36Sopenharmony_ci * that fit in a leaf. The delayed items (dir index keys) are sorted by their key 63962306a36Sopenharmony_ci * in the rbtree, and if there's a gap between two consecutive dir index items, 64062306a36Sopenharmony_ci * then it means at some point we had delayed dir indexes to add but they got 64162306a36Sopenharmony_ci * removed (by btrfs_delete_delayed_dir_index()) before we attempted to flush them 64262306a36Sopenharmony_ci * into the subvolume tree. Dir index keys also have their offsets coming from a 64362306a36Sopenharmony_ci * monotonically increasing counter, so we can't get new keys with an offset that 64462306a36Sopenharmony_ci * fits within a gap between delayed dir index items. 64562306a36Sopenharmony_ci */ 64662306a36Sopenharmony_cistatic int btrfs_insert_delayed_item(struct btrfs_trans_handle *trans, 64762306a36Sopenharmony_ci struct btrfs_root *root, 64862306a36Sopenharmony_ci struct btrfs_path *path, 64962306a36Sopenharmony_ci struct btrfs_delayed_item *first_item) 65062306a36Sopenharmony_ci{ 65162306a36Sopenharmony_ci struct btrfs_fs_info *fs_info = root->fs_info; 65262306a36Sopenharmony_ci struct btrfs_delayed_node *node = first_item->delayed_node; 65362306a36Sopenharmony_ci LIST_HEAD(item_list); 65462306a36Sopenharmony_ci struct btrfs_delayed_item *curr; 65562306a36Sopenharmony_ci struct btrfs_delayed_item *next; 65662306a36Sopenharmony_ci const int max_size = BTRFS_LEAF_DATA_SIZE(fs_info); 65762306a36Sopenharmony_ci struct btrfs_item_batch batch; 65862306a36Sopenharmony_ci struct btrfs_key first_key; 65962306a36Sopenharmony_ci const u32 first_data_size = first_item->data_len; 66062306a36Sopenharmony_ci int total_size; 66162306a36Sopenharmony_ci char *ins_data = NULL; 66262306a36Sopenharmony_ci int ret; 66362306a36Sopenharmony_ci bool continuous_keys_only = false; 66462306a36Sopenharmony_ci 66562306a36Sopenharmony_ci lockdep_assert_held(&node->mutex); 66662306a36Sopenharmony_ci 66762306a36Sopenharmony_ci /* 66862306a36Sopenharmony_ci * During normal operation the delayed index offset is continuously 66962306a36Sopenharmony_ci * increasing, so we can batch insert all items as there will not be any 67062306a36Sopenharmony_ci * overlapping keys in the tree. 67162306a36Sopenharmony_ci * 67262306a36Sopenharmony_ci * The exception to this is log replay, where we may have interleaved 67362306a36Sopenharmony_ci * offsets in the tree, so our batch needs to be continuous keys only in 67462306a36Sopenharmony_ci * order to ensure we do not end up with out of order items in our leaf. 67562306a36Sopenharmony_ci */ 67662306a36Sopenharmony_ci if (test_bit(BTRFS_FS_LOG_RECOVERING, &fs_info->flags)) 67762306a36Sopenharmony_ci continuous_keys_only = true; 67862306a36Sopenharmony_ci 67962306a36Sopenharmony_ci /* 68062306a36Sopenharmony_ci * For delayed items to insert, we track reserved metadata bytes based 68162306a36Sopenharmony_ci * on the number of leaves that we will use. 68262306a36Sopenharmony_ci * See btrfs_insert_delayed_dir_index() and 68362306a36Sopenharmony_ci * btrfs_delayed_item_reserve_metadata()). 68462306a36Sopenharmony_ci */ 68562306a36Sopenharmony_ci ASSERT(first_item->bytes_reserved == 0); 68662306a36Sopenharmony_ci 68762306a36Sopenharmony_ci list_add_tail(&first_item->tree_list, &item_list); 68862306a36Sopenharmony_ci batch.total_data_size = first_data_size; 68962306a36Sopenharmony_ci batch.nr = 1; 69062306a36Sopenharmony_ci total_size = first_data_size + sizeof(struct btrfs_item); 69162306a36Sopenharmony_ci curr = first_item; 69262306a36Sopenharmony_ci 69362306a36Sopenharmony_ci while (true) { 69462306a36Sopenharmony_ci int next_size; 69562306a36Sopenharmony_ci 69662306a36Sopenharmony_ci next = __btrfs_next_delayed_item(curr); 69762306a36Sopenharmony_ci if (!next) 69862306a36Sopenharmony_ci break; 69962306a36Sopenharmony_ci 70062306a36Sopenharmony_ci /* 70162306a36Sopenharmony_ci * We cannot allow gaps in the key space if we're doing log 70262306a36Sopenharmony_ci * replay. 70362306a36Sopenharmony_ci */ 70462306a36Sopenharmony_ci if (continuous_keys_only && (next->index != curr->index + 1)) 70562306a36Sopenharmony_ci break; 70662306a36Sopenharmony_ci 70762306a36Sopenharmony_ci ASSERT(next->bytes_reserved == 0); 70862306a36Sopenharmony_ci 70962306a36Sopenharmony_ci next_size = next->data_len + sizeof(struct btrfs_item); 71062306a36Sopenharmony_ci if (total_size + next_size > max_size) 71162306a36Sopenharmony_ci break; 71262306a36Sopenharmony_ci 71362306a36Sopenharmony_ci list_add_tail(&next->tree_list, &item_list); 71462306a36Sopenharmony_ci batch.nr++; 71562306a36Sopenharmony_ci total_size += next_size; 71662306a36Sopenharmony_ci batch.total_data_size += next->data_len; 71762306a36Sopenharmony_ci curr = next; 71862306a36Sopenharmony_ci } 71962306a36Sopenharmony_ci 72062306a36Sopenharmony_ci if (batch.nr == 1) { 72162306a36Sopenharmony_ci first_key.objectid = node->inode_id; 72262306a36Sopenharmony_ci first_key.type = BTRFS_DIR_INDEX_KEY; 72362306a36Sopenharmony_ci first_key.offset = first_item->index; 72462306a36Sopenharmony_ci batch.keys = &first_key; 72562306a36Sopenharmony_ci batch.data_sizes = &first_data_size; 72662306a36Sopenharmony_ci } else { 72762306a36Sopenharmony_ci struct btrfs_key *ins_keys; 72862306a36Sopenharmony_ci u32 *ins_sizes; 72962306a36Sopenharmony_ci int i = 0; 73062306a36Sopenharmony_ci 73162306a36Sopenharmony_ci ins_data = kmalloc(batch.nr * sizeof(u32) + 73262306a36Sopenharmony_ci batch.nr * sizeof(struct btrfs_key), GFP_NOFS); 73362306a36Sopenharmony_ci if (!ins_data) { 73462306a36Sopenharmony_ci ret = -ENOMEM; 73562306a36Sopenharmony_ci goto out; 73662306a36Sopenharmony_ci } 73762306a36Sopenharmony_ci ins_sizes = (u32 *)ins_data; 73862306a36Sopenharmony_ci ins_keys = (struct btrfs_key *)(ins_data + batch.nr * sizeof(u32)); 73962306a36Sopenharmony_ci batch.keys = ins_keys; 74062306a36Sopenharmony_ci batch.data_sizes = ins_sizes; 74162306a36Sopenharmony_ci list_for_each_entry(curr, &item_list, tree_list) { 74262306a36Sopenharmony_ci ins_keys[i].objectid = node->inode_id; 74362306a36Sopenharmony_ci ins_keys[i].type = BTRFS_DIR_INDEX_KEY; 74462306a36Sopenharmony_ci ins_keys[i].offset = curr->index; 74562306a36Sopenharmony_ci ins_sizes[i] = curr->data_len; 74662306a36Sopenharmony_ci i++; 74762306a36Sopenharmony_ci } 74862306a36Sopenharmony_ci } 74962306a36Sopenharmony_ci 75062306a36Sopenharmony_ci ret = btrfs_insert_empty_items(trans, root, path, &batch); 75162306a36Sopenharmony_ci if (ret) 75262306a36Sopenharmony_ci goto out; 75362306a36Sopenharmony_ci 75462306a36Sopenharmony_ci list_for_each_entry(curr, &item_list, tree_list) { 75562306a36Sopenharmony_ci char *data_ptr; 75662306a36Sopenharmony_ci 75762306a36Sopenharmony_ci data_ptr = btrfs_item_ptr(path->nodes[0], path->slots[0], char); 75862306a36Sopenharmony_ci write_extent_buffer(path->nodes[0], &curr->data, 75962306a36Sopenharmony_ci (unsigned long)data_ptr, curr->data_len); 76062306a36Sopenharmony_ci path->slots[0]++; 76162306a36Sopenharmony_ci } 76262306a36Sopenharmony_ci 76362306a36Sopenharmony_ci /* 76462306a36Sopenharmony_ci * Now release our path before releasing the delayed items and their 76562306a36Sopenharmony_ci * metadata reservations, so that we don't block other tasks for more 76662306a36Sopenharmony_ci * time than needed. 76762306a36Sopenharmony_ci */ 76862306a36Sopenharmony_ci btrfs_release_path(path); 76962306a36Sopenharmony_ci 77062306a36Sopenharmony_ci ASSERT(node->index_item_leaves > 0); 77162306a36Sopenharmony_ci 77262306a36Sopenharmony_ci /* 77362306a36Sopenharmony_ci * For normal operations we will batch an entire leaf's worth of delayed 77462306a36Sopenharmony_ci * items, so if there are more items to process we can decrement 77562306a36Sopenharmony_ci * index_item_leaves by 1 as we inserted 1 leaf's worth of items. 77662306a36Sopenharmony_ci * 77762306a36Sopenharmony_ci * However for log replay we may not have inserted an entire leaf's 77862306a36Sopenharmony_ci * worth of items, we may have not had continuous items, so decrementing 77962306a36Sopenharmony_ci * here would mess up the index_item_leaves accounting. For this case 78062306a36Sopenharmony_ci * only clean up the accounting when there are no items left. 78162306a36Sopenharmony_ci */ 78262306a36Sopenharmony_ci if (next && !continuous_keys_only) { 78362306a36Sopenharmony_ci /* 78462306a36Sopenharmony_ci * We inserted one batch of items into a leaf a there are more 78562306a36Sopenharmony_ci * items to flush in a future batch, now release one unit of 78662306a36Sopenharmony_ci * metadata space from the delayed block reserve, corresponding 78762306a36Sopenharmony_ci * the leaf we just flushed to. 78862306a36Sopenharmony_ci */ 78962306a36Sopenharmony_ci btrfs_delayed_item_release_leaves(node, 1); 79062306a36Sopenharmony_ci node->index_item_leaves--; 79162306a36Sopenharmony_ci } else if (!next) { 79262306a36Sopenharmony_ci /* 79362306a36Sopenharmony_ci * There are no more items to insert. We can have a number of 79462306a36Sopenharmony_ci * reserved leaves > 1 here - this happens when many dir index 79562306a36Sopenharmony_ci * items are added and then removed before they are flushed (file 79662306a36Sopenharmony_ci * names with a very short life, never span a transaction). So 79762306a36Sopenharmony_ci * release all remaining leaves. 79862306a36Sopenharmony_ci */ 79962306a36Sopenharmony_ci btrfs_delayed_item_release_leaves(node, node->index_item_leaves); 80062306a36Sopenharmony_ci node->index_item_leaves = 0; 80162306a36Sopenharmony_ci } 80262306a36Sopenharmony_ci 80362306a36Sopenharmony_ci list_for_each_entry_safe(curr, next, &item_list, tree_list) { 80462306a36Sopenharmony_ci list_del(&curr->tree_list); 80562306a36Sopenharmony_ci btrfs_release_delayed_item(curr); 80662306a36Sopenharmony_ci } 80762306a36Sopenharmony_ciout: 80862306a36Sopenharmony_ci kfree(ins_data); 80962306a36Sopenharmony_ci return ret; 81062306a36Sopenharmony_ci} 81162306a36Sopenharmony_ci 81262306a36Sopenharmony_cistatic int btrfs_insert_delayed_items(struct btrfs_trans_handle *trans, 81362306a36Sopenharmony_ci struct btrfs_path *path, 81462306a36Sopenharmony_ci struct btrfs_root *root, 81562306a36Sopenharmony_ci struct btrfs_delayed_node *node) 81662306a36Sopenharmony_ci{ 81762306a36Sopenharmony_ci int ret = 0; 81862306a36Sopenharmony_ci 81962306a36Sopenharmony_ci while (ret == 0) { 82062306a36Sopenharmony_ci struct btrfs_delayed_item *curr; 82162306a36Sopenharmony_ci 82262306a36Sopenharmony_ci mutex_lock(&node->mutex); 82362306a36Sopenharmony_ci curr = __btrfs_first_delayed_insertion_item(node); 82462306a36Sopenharmony_ci if (!curr) { 82562306a36Sopenharmony_ci mutex_unlock(&node->mutex); 82662306a36Sopenharmony_ci break; 82762306a36Sopenharmony_ci } 82862306a36Sopenharmony_ci ret = btrfs_insert_delayed_item(trans, root, path, curr); 82962306a36Sopenharmony_ci mutex_unlock(&node->mutex); 83062306a36Sopenharmony_ci } 83162306a36Sopenharmony_ci 83262306a36Sopenharmony_ci return ret; 83362306a36Sopenharmony_ci} 83462306a36Sopenharmony_ci 83562306a36Sopenharmony_cistatic int btrfs_batch_delete_items(struct btrfs_trans_handle *trans, 83662306a36Sopenharmony_ci struct btrfs_root *root, 83762306a36Sopenharmony_ci struct btrfs_path *path, 83862306a36Sopenharmony_ci struct btrfs_delayed_item *item) 83962306a36Sopenharmony_ci{ 84062306a36Sopenharmony_ci const u64 ino = item->delayed_node->inode_id; 84162306a36Sopenharmony_ci struct btrfs_fs_info *fs_info = root->fs_info; 84262306a36Sopenharmony_ci struct btrfs_delayed_item *curr, *next; 84362306a36Sopenharmony_ci struct extent_buffer *leaf = path->nodes[0]; 84462306a36Sopenharmony_ci LIST_HEAD(batch_list); 84562306a36Sopenharmony_ci int nitems, slot, last_slot; 84662306a36Sopenharmony_ci int ret; 84762306a36Sopenharmony_ci u64 total_reserved_size = item->bytes_reserved; 84862306a36Sopenharmony_ci 84962306a36Sopenharmony_ci ASSERT(leaf != NULL); 85062306a36Sopenharmony_ci 85162306a36Sopenharmony_ci slot = path->slots[0]; 85262306a36Sopenharmony_ci last_slot = btrfs_header_nritems(leaf) - 1; 85362306a36Sopenharmony_ci /* 85462306a36Sopenharmony_ci * Our caller always gives us a path pointing to an existing item, so 85562306a36Sopenharmony_ci * this can not happen. 85662306a36Sopenharmony_ci */ 85762306a36Sopenharmony_ci ASSERT(slot <= last_slot); 85862306a36Sopenharmony_ci if (WARN_ON(slot > last_slot)) 85962306a36Sopenharmony_ci return -ENOENT; 86062306a36Sopenharmony_ci 86162306a36Sopenharmony_ci nitems = 1; 86262306a36Sopenharmony_ci curr = item; 86362306a36Sopenharmony_ci list_add_tail(&curr->tree_list, &batch_list); 86462306a36Sopenharmony_ci 86562306a36Sopenharmony_ci /* 86662306a36Sopenharmony_ci * Keep checking if the next delayed item matches the next item in the 86762306a36Sopenharmony_ci * leaf - if so, we can add it to the batch of items to delete from the 86862306a36Sopenharmony_ci * leaf. 86962306a36Sopenharmony_ci */ 87062306a36Sopenharmony_ci while (slot < last_slot) { 87162306a36Sopenharmony_ci struct btrfs_key key; 87262306a36Sopenharmony_ci 87362306a36Sopenharmony_ci next = __btrfs_next_delayed_item(curr); 87462306a36Sopenharmony_ci if (!next) 87562306a36Sopenharmony_ci break; 87662306a36Sopenharmony_ci 87762306a36Sopenharmony_ci slot++; 87862306a36Sopenharmony_ci btrfs_item_key_to_cpu(leaf, &key, slot); 87962306a36Sopenharmony_ci if (key.objectid != ino || 88062306a36Sopenharmony_ci key.type != BTRFS_DIR_INDEX_KEY || 88162306a36Sopenharmony_ci key.offset != next->index) 88262306a36Sopenharmony_ci break; 88362306a36Sopenharmony_ci nitems++; 88462306a36Sopenharmony_ci curr = next; 88562306a36Sopenharmony_ci list_add_tail(&curr->tree_list, &batch_list); 88662306a36Sopenharmony_ci total_reserved_size += curr->bytes_reserved; 88762306a36Sopenharmony_ci } 88862306a36Sopenharmony_ci 88962306a36Sopenharmony_ci ret = btrfs_del_items(trans, root, path, path->slots[0], nitems); 89062306a36Sopenharmony_ci if (ret) 89162306a36Sopenharmony_ci return ret; 89262306a36Sopenharmony_ci 89362306a36Sopenharmony_ci /* In case of BTRFS_FS_LOG_RECOVERING items won't have reserved space */ 89462306a36Sopenharmony_ci if (total_reserved_size > 0) { 89562306a36Sopenharmony_ci /* 89662306a36Sopenharmony_ci * Check btrfs_delayed_item_reserve_metadata() to see why we 89762306a36Sopenharmony_ci * don't need to release/reserve qgroup space. 89862306a36Sopenharmony_ci */ 89962306a36Sopenharmony_ci trace_btrfs_space_reservation(fs_info, "delayed_item", ino, 90062306a36Sopenharmony_ci total_reserved_size, 0); 90162306a36Sopenharmony_ci btrfs_block_rsv_release(fs_info, &fs_info->delayed_block_rsv, 90262306a36Sopenharmony_ci total_reserved_size, NULL); 90362306a36Sopenharmony_ci } 90462306a36Sopenharmony_ci 90562306a36Sopenharmony_ci list_for_each_entry_safe(curr, next, &batch_list, tree_list) { 90662306a36Sopenharmony_ci list_del(&curr->tree_list); 90762306a36Sopenharmony_ci btrfs_release_delayed_item(curr); 90862306a36Sopenharmony_ci } 90962306a36Sopenharmony_ci 91062306a36Sopenharmony_ci return 0; 91162306a36Sopenharmony_ci} 91262306a36Sopenharmony_ci 91362306a36Sopenharmony_cistatic int btrfs_delete_delayed_items(struct btrfs_trans_handle *trans, 91462306a36Sopenharmony_ci struct btrfs_path *path, 91562306a36Sopenharmony_ci struct btrfs_root *root, 91662306a36Sopenharmony_ci struct btrfs_delayed_node *node) 91762306a36Sopenharmony_ci{ 91862306a36Sopenharmony_ci struct btrfs_key key; 91962306a36Sopenharmony_ci int ret = 0; 92062306a36Sopenharmony_ci 92162306a36Sopenharmony_ci key.objectid = node->inode_id; 92262306a36Sopenharmony_ci key.type = BTRFS_DIR_INDEX_KEY; 92362306a36Sopenharmony_ci 92462306a36Sopenharmony_ci while (ret == 0) { 92562306a36Sopenharmony_ci struct btrfs_delayed_item *item; 92662306a36Sopenharmony_ci 92762306a36Sopenharmony_ci mutex_lock(&node->mutex); 92862306a36Sopenharmony_ci item = __btrfs_first_delayed_deletion_item(node); 92962306a36Sopenharmony_ci if (!item) { 93062306a36Sopenharmony_ci mutex_unlock(&node->mutex); 93162306a36Sopenharmony_ci break; 93262306a36Sopenharmony_ci } 93362306a36Sopenharmony_ci 93462306a36Sopenharmony_ci key.offset = item->index; 93562306a36Sopenharmony_ci ret = btrfs_search_slot(trans, root, &key, path, -1, 1); 93662306a36Sopenharmony_ci if (ret > 0) { 93762306a36Sopenharmony_ci /* 93862306a36Sopenharmony_ci * There's no matching item in the leaf. This means we 93962306a36Sopenharmony_ci * have already deleted this item in a past run of the 94062306a36Sopenharmony_ci * delayed items. We ignore errors when running delayed 94162306a36Sopenharmony_ci * items from an async context, through a work queue job 94262306a36Sopenharmony_ci * running btrfs_async_run_delayed_root(), and don't 94362306a36Sopenharmony_ci * release delayed items that failed to complete. This 94462306a36Sopenharmony_ci * is because we will retry later, and at transaction 94562306a36Sopenharmony_ci * commit time we always run delayed items and will 94662306a36Sopenharmony_ci * then deal with errors if they fail to run again. 94762306a36Sopenharmony_ci * 94862306a36Sopenharmony_ci * So just release delayed items for which we can't find 94962306a36Sopenharmony_ci * an item in the tree, and move to the next item. 95062306a36Sopenharmony_ci */ 95162306a36Sopenharmony_ci btrfs_release_path(path); 95262306a36Sopenharmony_ci btrfs_release_delayed_item(item); 95362306a36Sopenharmony_ci ret = 0; 95462306a36Sopenharmony_ci } else if (ret == 0) { 95562306a36Sopenharmony_ci ret = btrfs_batch_delete_items(trans, root, path, item); 95662306a36Sopenharmony_ci btrfs_release_path(path); 95762306a36Sopenharmony_ci } 95862306a36Sopenharmony_ci 95962306a36Sopenharmony_ci /* 96062306a36Sopenharmony_ci * We unlock and relock on each iteration, this is to prevent 96162306a36Sopenharmony_ci * blocking other tasks for too long while we are being run from 96262306a36Sopenharmony_ci * the async context (work queue job). Those tasks are typically 96362306a36Sopenharmony_ci * running system calls like creat/mkdir/rename/unlink/etc which 96462306a36Sopenharmony_ci * need to add delayed items to this delayed node. 96562306a36Sopenharmony_ci */ 96662306a36Sopenharmony_ci mutex_unlock(&node->mutex); 96762306a36Sopenharmony_ci } 96862306a36Sopenharmony_ci 96962306a36Sopenharmony_ci return ret; 97062306a36Sopenharmony_ci} 97162306a36Sopenharmony_ci 97262306a36Sopenharmony_cistatic void btrfs_release_delayed_inode(struct btrfs_delayed_node *delayed_node) 97362306a36Sopenharmony_ci{ 97462306a36Sopenharmony_ci struct btrfs_delayed_root *delayed_root; 97562306a36Sopenharmony_ci 97662306a36Sopenharmony_ci if (delayed_node && 97762306a36Sopenharmony_ci test_bit(BTRFS_DELAYED_NODE_INODE_DIRTY, &delayed_node->flags)) { 97862306a36Sopenharmony_ci BUG_ON(!delayed_node->root); 97962306a36Sopenharmony_ci clear_bit(BTRFS_DELAYED_NODE_INODE_DIRTY, &delayed_node->flags); 98062306a36Sopenharmony_ci delayed_node->count--; 98162306a36Sopenharmony_ci 98262306a36Sopenharmony_ci delayed_root = delayed_node->root->fs_info->delayed_root; 98362306a36Sopenharmony_ci finish_one_item(delayed_root); 98462306a36Sopenharmony_ci } 98562306a36Sopenharmony_ci} 98662306a36Sopenharmony_ci 98762306a36Sopenharmony_cistatic void btrfs_release_delayed_iref(struct btrfs_delayed_node *delayed_node) 98862306a36Sopenharmony_ci{ 98962306a36Sopenharmony_ci 99062306a36Sopenharmony_ci if (test_and_clear_bit(BTRFS_DELAYED_NODE_DEL_IREF, &delayed_node->flags)) { 99162306a36Sopenharmony_ci struct btrfs_delayed_root *delayed_root; 99262306a36Sopenharmony_ci 99362306a36Sopenharmony_ci ASSERT(delayed_node->root); 99462306a36Sopenharmony_ci delayed_node->count--; 99562306a36Sopenharmony_ci 99662306a36Sopenharmony_ci delayed_root = delayed_node->root->fs_info->delayed_root; 99762306a36Sopenharmony_ci finish_one_item(delayed_root); 99862306a36Sopenharmony_ci } 99962306a36Sopenharmony_ci} 100062306a36Sopenharmony_ci 100162306a36Sopenharmony_cistatic int __btrfs_update_delayed_inode(struct btrfs_trans_handle *trans, 100262306a36Sopenharmony_ci struct btrfs_root *root, 100362306a36Sopenharmony_ci struct btrfs_path *path, 100462306a36Sopenharmony_ci struct btrfs_delayed_node *node) 100562306a36Sopenharmony_ci{ 100662306a36Sopenharmony_ci struct btrfs_fs_info *fs_info = root->fs_info; 100762306a36Sopenharmony_ci struct btrfs_key key; 100862306a36Sopenharmony_ci struct btrfs_inode_item *inode_item; 100962306a36Sopenharmony_ci struct extent_buffer *leaf; 101062306a36Sopenharmony_ci int mod; 101162306a36Sopenharmony_ci int ret; 101262306a36Sopenharmony_ci 101362306a36Sopenharmony_ci key.objectid = node->inode_id; 101462306a36Sopenharmony_ci key.type = BTRFS_INODE_ITEM_KEY; 101562306a36Sopenharmony_ci key.offset = 0; 101662306a36Sopenharmony_ci 101762306a36Sopenharmony_ci if (test_bit(BTRFS_DELAYED_NODE_DEL_IREF, &node->flags)) 101862306a36Sopenharmony_ci mod = -1; 101962306a36Sopenharmony_ci else 102062306a36Sopenharmony_ci mod = 1; 102162306a36Sopenharmony_ci 102262306a36Sopenharmony_ci ret = btrfs_lookup_inode(trans, root, path, &key, mod); 102362306a36Sopenharmony_ci if (ret > 0) 102462306a36Sopenharmony_ci ret = -ENOENT; 102562306a36Sopenharmony_ci if (ret < 0) 102662306a36Sopenharmony_ci goto out; 102762306a36Sopenharmony_ci 102862306a36Sopenharmony_ci leaf = path->nodes[0]; 102962306a36Sopenharmony_ci inode_item = btrfs_item_ptr(leaf, path->slots[0], 103062306a36Sopenharmony_ci struct btrfs_inode_item); 103162306a36Sopenharmony_ci write_extent_buffer(leaf, &node->inode_item, (unsigned long)inode_item, 103262306a36Sopenharmony_ci sizeof(struct btrfs_inode_item)); 103362306a36Sopenharmony_ci btrfs_mark_buffer_dirty(trans, leaf); 103462306a36Sopenharmony_ci 103562306a36Sopenharmony_ci if (!test_bit(BTRFS_DELAYED_NODE_DEL_IREF, &node->flags)) 103662306a36Sopenharmony_ci goto out; 103762306a36Sopenharmony_ci 103862306a36Sopenharmony_ci path->slots[0]++; 103962306a36Sopenharmony_ci if (path->slots[0] >= btrfs_header_nritems(leaf)) 104062306a36Sopenharmony_ci goto search; 104162306a36Sopenharmony_ciagain: 104262306a36Sopenharmony_ci btrfs_item_key_to_cpu(leaf, &key, path->slots[0]); 104362306a36Sopenharmony_ci if (key.objectid != node->inode_id) 104462306a36Sopenharmony_ci goto out; 104562306a36Sopenharmony_ci 104662306a36Sopenharmony_ci if (key.type != BTRFS_INODE_REF_KEY && 104762306a36Sopenharmony_ci key.type != BTRFS_INODE_EXTREF_KEY) 104862306a36Sopenharmony_ci goto out; 104962306a36Sopenharmony_ci 105062306a36Sopenharmony_ci /* 105162306a36Sopenharmony_ci * Delayed iref deletion is for the inode who has only one link, 105262306a36Sopenharmony_ci * so there is only one iref. The case that several irefs are 105362306a36Sopenharmony_ci * in the same item doesn't exist. 105462306a36Sopenharmony_ci */ 105562306a36Sopenharmony_ci ret = btrfs_del_item(trans, root, path); 105662306a36Sopenharmony_ciout: 105762306a36Sopenharmony_ci btrfs_release_delayed_iref(node); 105862306a36Sopenharmony_ci btrfs_release_path(path); 105962306a36Sopenharmony_cierr_out: 106062306a36Sopenharmony_ci btrfs_delayed_inode_release_metadata(fs_info, node, (ret < 0)); 106162306a36Sopenharmony_ci btrfs_release_delayed_inode(node); 106262306a36Sopenharmony_ci 106362306a36Sopenharmony_ci /* 106462306a36Sopenharmony_ci * If we fail to update the delayed inode we need to abort the 106562306a36Sopenharmony_ci * transaction, because we could leave the inode with the improper 106662306a36Sopenharmony_ci * counts behind. 106762306a36Sopenharmony_ci */ 106862306a36Sopenharmony_ci if (ret && ret != -ENOENT) 106962306a36Sopenharmony_ci btrfs_abort_transaction(trans, ret); 107062306a36Sopenharmony_ci 107162306a36Sopenharmony_ci return ret; 107262306a36Sopenharmony_ci 107362306a36Sopenharmony_cisearch: 107462306a36Sopenharmony_ci btrfs_release_path(path); 107562306a36Sopenharmony_ci 107662306a36Sopenharmony_ci key.type = BTRFS_INODE_EXTREF_KEY; 107762306a36Sopenharmony_ci key.offset = -1; 107862306a36Sopenharmony_ci 107962306a36Sopenharmony_ci ret = btrfs_search_slot(trans, root, &key, path, -1, 1); 108062306a36Sopenharmony_ci if (ret < 0) 108162306a36Sopenharmony_ci goto err_out; 108262306a36Sopenharmony_ci ASSERT(ret); 108362306a36Sopenharmony_ci 108462306a36Sopenharmony_ci ret = 0; 108562306a36Sopenharmony_ci leaf = path->nodes[0]; 108662306a36Sopenharmony_ci path->slots[0]--; 108762306a36Sopenharmony_ci goto again; 108862306a36Sopenharmony_ci} 108962306a36Sopenharmony_ci 109062306a36Sopenharmony_cistatic inline int btrfs_update_delayed_inode(struct btrfs_trans_handle *trans, 109162306a36Sopenharmony_ci struct btrfs_root *root, 109262306a36Sopenharmony_ci struct btrfs_path *path, 109362306a36Sopenharmony_ci struct btrfs_delayed_node *node) 109462306a36Sopenharmony_ci{ 109562306a36Sopenharmony_ci int ret; 109662306a36Sopenharmony_ci 109762306a36Sopenharmony_ci mutex_lock(&node->mutex); 109862306a36Sopenharmony_ci if (!test_bit(BTRFS_DELAYED_NODE_INODE_DIRTY, &node->flags)) { 109962306a36Sopenharmony_ci mutex_unlock(&node->mutex); 110062306a36Sopenharmony_ci return 0; 110162306a36Sopenharmony_ci } 110262306a36Sopenharmony_ci 110362306a36Sopenharmony_ci ret = __btrfs_update_delayed_inode(trans, root, path, node); 110462306a36Sopenharmony_ci mutex_unlock(&node->mutex); 110562306a36Sopenharmony_ci return ret; 110662306a36Sopenharmony_ci} 110762306a36Sopenharmony_ci 110862306a36Sopenharmony_cistatic inline int 110962306a36Sopenharmony_ci__btrfs_commit_inode_delayed_items(struct btrfs_trans_handle *trans, 111062306a36Sopenharmony_ci struct btrfs_path *path, 111162306a36Sopenharmony_ci struct btrfs_delayed_node *node) 111262306a36Sopenharmony_ci{ 111362306a36Sopenharmony_ci int ret; 111462306a36Sopenharmony_ci 111562306a36Sopenharmony_ci ret = btrfs_insert_delayed_items(trans, path, node->root, node); 111662306a36Sopenharmony_ci if (ret) 111762306a36Sopenharmony_ci return ret; 111862306a36Sopenharmony_ci 111962306a36Sopenharmony_ci ret = btrfs_delete_delayed_items(trans, path, node->root, node); 112062306a36Sopenharmony_ci if (ret) 112162306a36Sopenharmony_ci return ret; 112262306a36Sopenharmony_ci 112362306a36Sopenharmony_ci ret = btrfs_update_delayed_inode(trans, node->root, path, node); 112462306a36Sopenharmony_ci return ret; 112562306a36Sopenharmony_ci} 112662306a36Sopenharmony_ci 112762306a36Sopenharmony_ci/* 112862306a36Sopenharmony_ci * Called when committing the transaction. 112962306a36Sopenharmony_ci * Returns 0 on success. 113062306a36Sopenharmony_ci * Returns < 0 on error and returns with an aborted transaction with any 113162306a36Sopenharmony_ci * outstanding delayed items cleaned up. 113262306a36Sopenharmony_ci */ 113362306a36Sopenharmony_cistatic int __btrfs_run_delayed_items(struct btrfs_trans_handle *trans, int nr) 113462306a36Sopenharmony_ci{ 113562306a36Sopenharmony_ci struct btrfs_fs_info *fs_info = trans->fs_info; 113662306a36Sopenharmony_ci struct btrfs_delayed_root *delayed_root; 113762306a36Sopenharmony_ci struct btrfs_delayed_node *curr_node, *prev_node; 113862306a36Sopenharmony_ci struct btrfs_path *path; 113962306a36Sopenharmony_ci struct btrfs_block_rsv *block_rsv; 114062306a36Sopenharmony_ci int ret = 0; 114162306a36Sopenharmony_ci bool count = (nr > 0); 114262306a36Sopenharmony_ci 114362306a36Sopenharmony_ci if (TRANS_ABORTED(trans)) 114462306a36Sopenharmony_ci return -EIO; 114562306a36Sopenharmony_ci 114662306a36Sopenharmony_ci path = btrfs_alloc_path(); 114762306a36Sopenharmony_ci if (!path) 114862306a36Sopenharmony_ci return -ENOMEM; 114962306a36Sopenharmony_ci 115062306a36Sopenharmony_ci block_rsv = trans->block_rsv; 115162306a36Sopenharmony_ci trans->block_rsv = &fs_info->delayed_block_rsv; 115262306a36Sopenharmony_ci 115362306a36Sopenharmony_ci delayed_root = fs_info->delayed_root; 115462306a36Sopenharmony_ci 115562306a36Sopenharmony_ci curr_node = btrfs_first_delayed_node(delayed_root); 115662306a36Sopenharmony_ci while (curr_node && (!count || nr--)) { 115762306a36Sopenharmony_ci ret = __btrfs_commit_inode_delayed_items(trans, path, 115862306a36Sopenharmony_ci curr_node); 115962306a36Sopenharmony_ci if (ret) { 116062306a36Sopenharmony_ci btrfs_abort_transaction(trans, ret); 116162306a36Sopenharmony_ci break; 116262306a36Sopenharmony_ci } 116362306a36Sopenharmony_ci 116462306a36Sopenharmony_ci prev_node = curr_node; 116562306a36Sopenharmony_ci curr_node = btrfs_next_delayed_node(curr_node); 116662306a36Sopenharmony_ci /* 116762306a36Sopenharmony_ci * See the comment below about releasing path before releasing 116862306a36Sopenharmony_ci * node. If the commit of delayed items was successful the path 116962306a36Sopenharmony_ci * should always be released, but in case of an error, it may 117062306a36Sopenharmony_ci * point to locked extent buffers (a leaf at the very least). 117162306a36Sopenharmony_ci */ 117262306a36Sopenharmony_ci ASSERT(path->nodes[0] == NULL); 117362306a36Sopenharmony_ci btrfs_release_delayed_node(prev_node); 117462306a36Sopenharmony_ci } 117562306a36Sopenharmony_ci 117662306a36Sopenharmony_ci /* 117762306a36Sopenharmony_ci * Release the path to avoid a potential deadlock and lockdep splat when 117862306a36Sopenharmony_ci * releasing the delayed node, as that requires taking the delayed node's 117962306a36Sopenharmony_ci * mutex. If another task starts running delayed items before we take 118062306a36Sopenharmony_ci * the mutex, it will first lock the mutex and then it may try to lock 118162306a36Sopenharmony_ci * the same btree path (leaf). 118262306a36Sopenharmony_ci */ 118362306a36Sopenharmony_ci btrfs_free_path(path); 118462306a36Sopenharmony_ci 118562306a36Sopenharmony_ci if (curr_node) 118662306a36Sopenharmony_ci btrfs_release_delayed_node(curr_node); 118762306a36Sopenharmony_ci trans->block_rsv = block_rsv; 118862306a36Sopenharmony_ci 118962306a36Sopenharmony_ci return ret; 119062306a36Sopenharmony_ci} 119162306a36Sopenharmony_ci 119262306a36Sopenharmony_ciint btrfs_run_delayed_items(struct btrfs_trans_handle *trans) 119362306a36Sopenharmony_ci{ 119462306a36Sopenharmony_ci return __btrfs_run_delayed_items(trans, -1); 119562306a36Sopenharmony_ci} 119662306a36Sopenharmony_ci 119762306a36Sopenharmony_ciint btrfs_run_delayed_items_nr(struct btrfs_trans_handle *trans, int nr) 119862306a36Sopenharmony_ci{ 119962306a36Sopenharmony_ci return __btrfs_run_delayed_items(trans, nr); 120062306a36Sopenharmony_ci} 120162306a36Sopenharmony_ci 120262306a36Sopenharmony_ciint btrfs_commit_inode_delayed_items(struct btrfs_trans_handle *trans, 120362306a36Sopenharmony_ci struct btrfs_inode *inode) 120462306a36Sopenharmony_ci{ 120562306a36Sopenharmony_ci struct btrfs_delayed_node *delayed_node = btrfs_get_delayed_node(inode); 120662306a36Sopenharmony_ci struct btrfs_path *path; 120762306a36Sopenharmony_ci struct btrfs_block_rsv *block_rsv; 120862306a36Sopenharmony_ci int ret; 120962306a36Sopenharmony_ci 121062306a36Sopenharmony_ci if (!delayed_node) 121162306a36Sopenharmony_ci return 0; 121262306a36Sopenharmony_ci 121362306a36Sopenharmony_ci mutex_lock(&delayed_node->mutex); 121462306a36Sopenharmony_ci if (!delayed_node->count) { 121562306a36Sopenharmony_ci mutex_unlock(&delayed_node->mutex); 121662306a36Sopenharmony_ci btrfs_release_delayed_node(delayed_node); 121762306a36Sopenharmony_ci return 0; 121862306a36Sopenharmony_ci } 121962306a36Sopenharmony_ci mutex_unlock(&delayed_node->mutex); 122062306a36Sopenharmony_ci 122162306a36Sopenharmony_ci path = btrfs_alloc_path(); 122262306a36Sopenharmony_ci if (!path) { 122362306a36Sopenharmony_ci btrfs_release_delayed_node(delayed_node); 122462306a36Sopenharmony_ci return -ENOMEM; 122562306a36Sopenharmony_ci } 122662306a36Sopenharmony_ci 122762306a36Sopenharmony_ci block_rsv = trans->block_rsv; 122862306a36Sopenharmony_ci trans->block_rsv = &delayed_node->root->fs_info->delayed_block_rsv; 122962306a36Sopenharmony_ci 123062306a36Sopenharmony_ci ret = __btrfs_commit_inode_delayed_items(trans, path, delayed_node); 123162306a36Sopenharmony_ci 123262306a36Sopenharmony_ci btrfs_release_delayed_node(delayed_node); 123362306a36Sopenharmony_ci btrfs_free_path(path); 123462306a36Sopenharmony_ci trans->block_rsv = block_rsv; 123562306a36Sopenharmony_ci 123662306a36Sopenharmony_ci return ret; 123762306a36Sopenharmony_ci} 123862306a36Sopenharmony_ci 123962306a36Sopenharmony_ciint btrfs_commit_inode_delayed_inode(struct btrfs_inode *inode) 124062306a36Sopenharmony_ci{ 124162306a36Sopenharmony_ci struct btrfs_fs_info *fs_info = inode->root->fs_info; 124262306a36Sopenharmony_ci struct btrfs_trans_handle *trans; 124362306a36Sopenharmony_ci struct btrfs_delayed_node *delayed_node = btrfs_get_delayed_node(inode); 124462306a36Sopenharmony_ci struct btrfs_path *path; 124562306a36Sopenharmony_ci struct btrfs_block_rsv *block_rsv; 124662306a36Sopenharmony_ci int ret; 124762306a36Sopenharmony_ci 124862306a36Sopenharmony_ci if (!delayed_node) 124962306a36Sopenharmony_ci return 0; 125062306a36Sopenharmony_ci 125162306a36Sopenharmony_ci mutex_lock(&delayed_node->mutex); 125262306a36Sopenharmony_ci if (!test_bit(BTRFS_DELAYED_NODE_INODE_DIRTY, &delayed_node->flags)) { 125362306a36Sopenharmony_ci mutex_unlock(&delayed_node->mutex); 125462306a36Sopenharmony_ci btrfs_release_delayed_node(delayed_node); 125562306a36Sopenharmony_ci return 0; 125662306a36Sopenharmony_ci } 125762306a36Sopenharmony_ci mutex_unlock(&delayed_node->mutex); 125862306a36Sopenharmony_ci 125962306a36Sopenharmony_ci trans = btrfs_join_transaction(delayed_node->root); 126062306a36Sopenharmony_ci if (IS_ERR(trans)) { 126162306a36Sopenharmony_ci ret = PTR_ERR(trans); 126262306a36Sopenharmony_ci goto out; 126362306a36Sopenharmony_ci } 126462306a36Sopenharmony_ci 126562306a36Sopenharmony_ci path = btrfs_alloc_path(); 126662306a36Sopenharmony_ci if (!path) { 126762306a36Sopenharmony_ci ret = -ENOMEM; 126862306a36Sopenharmony_ci goto trans_out; 126962306a36Sopenharmony_ci } 127062306a36Sopenharmony_ci 127162306a36Sopenharmony_ci block_rsv = trans->block_rsv; 127262306a36Sopenharmony_ci trans->block_rsv = &fs_info->delayed_block_rsv; 127362306a36Sopenharmony_ci 127462306a36Sopenharmony_ci mutex_lock(&delayed_node->mutex); 127562306a36Sopenharmony_ci if (test_bit(BTRFS_DELAYED_NODE_INODE_DIRTY, &delayed_node->flags)) 127662306a36Sopenharmony_ci ret = __btrfs_update_delayed_inode(trans, delayed_node->root, 127762306a36Sopenharmony_ci path, delayed_node); 127862306a36Sopenharmony_ci else 127962306a36Sopenharmony_ci ret = 0; 128062306a36Sopenharmony_ci mutex_unlock(&delayed_node->mutex); 128162306a36Sopenharmony_ci 128262306a36Sopenharmony_ci btrfs_free_path(path); 128362306a36Sopenharmony_ci trans->block_rsv = block_rsv; 128462306a36Sopenharmony_citrans_out: 128562306a36Sopenharmony_ci btrfs_end_transaction(trans); 128662306a36Sopenharmony_ci btrfs_btree_balance_dirty(fs_info); 128762306a36Sopenharmony_ciout: 128862306a36Sopenharmony_ci btrfs_release_delayed_node(delayed_node); 128962306a36Sopenharmony_ci 129062306a36Sopenharmony_ci return ret; 129162306a36Sopenharmony_ci} 129262306a36Sopenharmony_ci 129362306a36Sopenharmony_civoid btrfs_remove_delayed_node(struct btrfs_inode *inode) 129462306a36Sopenharmony_ci{ 129562306a36Sopenharmony_ci struct btrfs_delayed_node *delayed_node; 129662306a36Sopenharmony_ci 129762306a36Sopenharmony_ci delayed_node = READ_ONCE(inode->delayed_node); 129862306a36Sopenharmony_ci if (!delayed_node) 129962306a36Sopenharmony_ci return; 130062306a36Sopenharmony_ci 130162306a36Sopenharmony_ci inode->delayed_node = NULL; 130262306a36Sopenharmony_ci btrfs_release_delayed_node(delayed_node); 130362306a36Sopenharmony_ci} 130462306a36Sopenharmony_ci 130562306a36Sopenharmony_cistruct btrfs_async_delayed_work { 130662306a36Sopenharmony_ci struct btrfs_delayed_root *delayed_root; 130762306a36Sopenharmony_ci int nr; 130862306a36Sopenharmony_ci struct btrfs_work work; 130962306a36Sopenharmony_ci}; 131062306a36Sopenharmony_ci 131162306a36Sopenharmony_cistatic void btrfs_async_run_delayed_root(struct btrfs_work *work) 131262306a36Sopenharmony_ci{ 131362306a36Sopenharmony_ci struct btrfs_async_delayed_work *async_work; 131462306a36Sopenharmony_ci struct btrfs_delayed_root *delayed_root; 131562306a36Sopenharmony_ci struct btrfs_trans_handle *trans; 131662306a36Sopenharmony_ci struct btrfs_path *path; 131762306a36Sopenharmony_ci struct btrfs_delayed_node *delayed_node = NULL; 131862306a36Sopenharmony_ci struct btrfs_root *root; 131962306a36Sopenharmony_ci struct btrfs_block_rsv *block_rsv; 132062306a36Sopenharmony_ci int total_done = 0; 132162306a36Sopenharmony_ci 132262306a36Sopenharmony_ci async_work = container_of(work, struct btrfs_async_delayed_work, work); 132362306a36Sopenharmony_ci delayed_root = async_work->delayed_root; 132462306a36Sopenharmony_ci 132562306a36Sopenharmony_ci path = btrfs_alloc_path(); 132662306a36Sopenharmony_ci if (!path) 132762306a36Sopenharmony_ci goto out; 132862306a36Sopenharmony_ci 132962306a36Sopenharmony_ci do { 133062306a36Sopenharmony_ci if (atomic_read(&delayed_root->items) < 133162306a36Sopenharmony_ci BTRFS_DELAYED_BACKGROUND / 2) 133262306a36Sopenharmony_ci break; 133362306a36Sopenharmony_ci 133462306a36Sopenharmony_ci delayed_node = btrfs_first_prepared_delayed_node(delayed_root); 133562306a36Sopenharmony_ci if (!delayed_node) 133662306a36Sopenharmony_ci break; 133762306a36Sopenharmony_ci 133862306a36Sopenharmony_ci root = delayed_node->root; 133962306a36Sopenharmony_ci 134062306a36Sopenharmony_ci trans = btrfs_join_transaction(root); 134162306a36Sopenharmony_ci if (IS_ERR(trans)) { 134262306a36Sopenharmony_ci btrfs_release_path(path); 134362306a36Sopenharmony_ci btrfs_release_prepared_delayed_node(delayed_node); 134462306a36Sopenharmony_ci total_done++; 134562306a36Sopenharmony_ci continue; 134662306a36Sopenharmony_ci } 134762306a36Sopenharmony_ci 134862306a36Sopenharmony_ci block_rsv = trans->block_rsv; 134962306a36Sopenharmony_ci trans->block_rsv = &root->fs_info->delayed_block_rsv; 135062306a36Sopenharmony_ci 135162306a36Sopenharmony_ci __btrfs_commit_inode_delayed_items(trans, path, delayed_node); 135262306a36Sopenharmony_ci 135362306a36Sopenharmony_ci trans->block_rsv = block_rsv; 135462306a36Sopenharmony_ci btrfs_end_transaction(trans); 135562306a36Sopenharmony_ci btrfs_btree_balance_dirty_nodelay(root->fs_info); 135662306a36Sopenharmony_ci 135762306a36Sopenharmony_ci btrfs_release_path(path); 135862306a36Sopenharmony_ci btrfs_release_prepared_delayed_node(delayed_node); 135962306a36Sopenharmony_ci total_done++; 136062306a36Sopenharmony_ci 136162306a36Sopenharmony_ci } while ((async_work->nr == 0 && total_done < BTRFS_DELAYED_WRITEBACK) 136262306a36Sopenharmony_ci || total_done < async_work->nr); 136362306a36Sopenharmony_ci 136462306a36Sopenharmony_ci btrfs_free_path(path); 136562306a36Sopenharmony_ciout: 136662306a36Sopenharmony_ci wake_up(&delayed_root->wait); 136762306a36Sopenharmony_ci kfree(async_work); 136862306a36Sopenharmony_ci} 136962306a36Sopenharmony_ci 137062306a36Sopenharmony_ci 137162306a36Sopenharmony_cistatic int btrfs_wq_run_delayed_node(struct btrfs_delayed_root *delayed_root, 137262306a36Sopenharmony_ci struct btrfs_fs_info *fs_info, int nr) 137362306a36Sopenharmony_ci{ 137462306a36Sopenharmony_ci struct btrfs_async_delayed_work *async_work; 137562306a36Sopenharmony_ci 137662306a36Sopenharmony_ci async_work = kmalloc(sizeof(*async_work), GFP_NOFS); 137762306a36Sopenharmony_ci if (!async_work) 137862306a36Sopenharmony_ci return -ENOMEM; 137962306a36Sopenharmony_ci 138062306a36Sopenharmony_ci async_work->delayed_root = delayed_root; 138162306a36Sopenharmony_ci btrfs_init_work(&async_work->work, btrfs_async_run_delayed_root, NULL, 138262306a36Sopenharmony_ci NULL); 138362306a36Sopenharmony_ci async_work->nr = nr; 138462306a36Sopenharmony_ci 138562306a36Sopenharmony_ci btrfs_queue_work(fs_info->delayed_workers, &async_work->work); 138662306a36Sopenharmony_ci return 0; 138762306a36Sopenharmony_ci} 138862306a36Sopenharmony_ci 138962306a36Sopenharmony_civoid btrfs_assert_delayed_root_empty(struct btrfs_fs_info *fs_info) 139062306a36Sopenharmony_ci{ 139162306a36Sopenharmony_ci WARN_ON(btrfs_first_delayed_node(fs_info->delayed_root)); 139262306a36Sopenharmony_ci} 139362306a36Sopenharmony_ci 139462306a36Sopenharmony_cistatic int could_end_wait(struct btrfs_delayed_root *delayed_root, int seq) 139562306a36Sopenharmony_ci{ 139662306a36Sopenharmony_ci int val = atomic_read(&delayed_root->items_seq); 139762306a36Sopenharmony_ci 139862306a36Sopenharmony_ci if (val < seq || val >= seq + BTRFS_DELAYED_BATCH) 139962306a36Sopenharmony_ci return 1; 140062306a36Sopenharmony_ci 140162306a36Sopenharmony_ci if (atomic_read(&delayed_root->items) < BTRFS_DELAYED_BACKGROUND) 140262306a36Sopenharmony_ci return 1; 140362306a36Sopenharmony_ci 140462306a36Sopenharmony_ci return 0; 140562306a36Sopenharmony_ci} 140662306a36Sopenharmony_ci 140762306a36Sopenharmony_civoid btrfs_balance_delayed_items(struct btrfs_fs_info *fs_info) 140862306a36Sopenharmony_ci{ 140962306a36Sopenharmony_ci struct btrfs_delayed_root *delayed_root = fs_info->delayed_root; 141062306a36Sopenharmony_ci 141162306a36Sopenharmony_ci if ((atomic_read(&delayed_root->items) < BTRFS_DELAYED_BACKGROUND) || 141262306a36Sopenharmony_ci btrfs_workqueue_normal_congested(fs_info->delayed_workers)) 141362306a36Sopenharmony_ci return; 141462306a36Sopenharmony_ci 141562306a36Sopenharmony_ci if (atomic_read(&delayed_root->items) >= BTRFS_DELAYED_WRITEBACK) { 141662306a36Sopenharmony_ci int seq; 141762306a36Sopenharmony_ci int ret; 141862306a36Sopenharmony_ci 141962306a36Sopenharmony_ci seq = atomic_read(&delayed_root->items_seq); 142062306a36Sopenharmony_ci 142162306a36Sopenharmony_ci ret = btrfs_wq_run_delayed_node(delayed_root, fs_info, 0); 142262306a36Sopenharmony_ci if (ret) 142362306a36Sopenharmony_ci return; 142462306a36Sopenharmony_ci 142562306a36Sopenharmony_ci wait_event_interruptible(delayed_root->wait, 142662306a36Sopenharmony_ci could_end_wait(delayed_root, seq)); 142762306a36Sopenharmony_ci return; 142862306a36Sopenharmony_ci } 142962306a36Sopenharmony_ci 143062306a36Sopenharmony_ci btrfs_wq_run_delayed_node(delayed_root, fs_info, BTRFS_DELAYED_BATCH); 143162306a36Sopenharmony_ci} 143262306a36Sopenharmony_ci 143362306a36Sopenharmony_cistatic void btrfs_release_dir_index_item_space(struct btrfs_trans_handle *trans) 143462306a36Sopenharmony_ci{ 143562306a36Sopenharmony_ci struct btrfs_fs_info *fs_info = trans->fs_info; 143662306a36Sopenharmony_ci const u64 bytes = btrfs_calc_insert_metadata_size(fs_info, 1); 143762306a36Sopenharmony_ci 143862306a36Sopenharmony_ci if (test_bit(BTRFS_FS_LOG_RECOVERING, &fs_info->flags)) 143962306a36Sopenharmony_ci return; 144062306a36Sopenharmony_ci 144162306a36Sopenharmony_ci /* 144262306a36Sopenharmony_ci * Adding the new dir index item does not require touching another 144362306a36Sopenharmony_ci * leaf, so we can release 1 unit of metadata that was previously 144462306a36Sopenharmony_ci * reserved when starting the transaction. This applies only to 144562306a36Sopenharmony_ci * the case where we had a transaction start and excludes the 144662306a36Sopenharmony_ci * transaction join case (when replaying log trees). 144762306a36Sopenharmony_ci */ 144862306a36Sopenharmony_ci trace_btrfs_space_reservation(fs_info, "transaction", 144962306a36Sopenharmony_ci trans->transid, bytes, 0); 145062306a36Sopenharmony_ci btrfs_block_rsv_release(fs_info, trans->block_rsv, bytes, NULL); 145162306a36Sopenharmony_ci ASSERT(trans->bytes_reserved >= bytes); 145262306a36Sopenharmony_ci trans->bytes_reserved -= bytes; 145362306a36Sopenharmony_ci} 145462306a36Sopenharmony_ci 145562306a36Sopenharmony_ci/* Will return 0, -ENOMEM or -EEXIST (index number collision, unexpected). */ 145662306a36Sopenharmony_ciint btrfs_insert_delayed_dir_index(struct btrfs_trans_handle *trans, 145762306a36Sopenharmony_ci const char *name, int name_len, 145862306a36Sopenharmony_ci struct btrfs_inode *dir, 145962306a36Sopenharmony_ci struct btrfs_disk_key *disk_key, u8 flags, 146062306a36Sopenharmony_ci u64 index) 146162306a36Sopenharmony_ci{ 146262306a36Sopenharmony_ci struct btrfs_fs_info *fs_info = trans->fs_info; 146362306a36Sopenharmony_ci const unsigned int leaf_data_size = BTRFS_LEAF_DATA_SIZE(fs_info); 146462306a36Sopenharmony_ci struct btrfs_delayed_node *delayed_node; 146562306a36Sopenharmony_ci struct btrfs_delayed_item *delayed_item; 146662306a36Sopenharmony_ci struct btrfs_dir_item *dir_item; 146762306a36Sopenharmony_ci bool reserve_leaf_space; 146862306a36Sopenharmony_ci u32 data_len; 146962306a36Sopenharmony_ci int ret; 147062306a36Sopenharmony_ci 147162306a36Sopenharmony_ci delayed_node = btrfs_get_or_create_delayed_node(dir); 147262306a36Sopenharmony_ci if (IS_ERR(delayed_node)) 147362306a36Sopenharmony_ci return PTR_ERR(delayed_node); 147462306a36Sopenharmony_ci 147562306a36Sopenharmony_ci delayed_item = btrfs_alloc_delayed_item(sizeof(*dir_item) + name_len, 147662306a36Sopenharmony_ci delayed_node, 147762306a36Sopenharmony_ci BTRFS_DELAYED_INSERTION_ITEM); 147862306a36Sopenharmony_ci if (!delayed_item) { 147962306a36Sopenharmony_ci ret = -ENOMEM; 148062306a36Sopenharmony_ci goto release_node; 148162306a36Sopenharmony_ci } 148262306a36Sopenharmony_ci 148362306a36Sopenharmony_ci delayed_item->index = index; 148462306a36Sopenharmony_ci 148562306a36Sopenharmony_ci dir_item = (struct btrfs_dir_item *)delayed_item->data; 148662306a36Sopenharmony_ci dir_item->location = *disk_key; 148762306a36Sopenharmony_ci btrfs_set_stack_dir_transid(dir_item, trans->transid); 148862306a36Sopenharmony_ci btrfs_set_stack_dir_data_len(dir_item, 0); 148962306a36Sopenharmony_ci btrfs_set_stack_dir_name_len(dir_item, name_len); 149062306a36Sopenharmony_ci btrfs_set_stack_dir_flags(dir_item, flags); 149162306a36Sopenharmony_ci memcpy((char *)(dir_item + 1), name, name_len); 149262306a36Sopenharmony_ci 149362306a36Sopenharmony_ci data_len = delayed_item->data_len + sizeof(struct btrfs_item); 149462306a36Sopenharmony_ci 149562306a36Sopenharmony_ci mutex_lock(&delayed_node->mutex); 149662306a36Sopenharmony_ci 149762306a36Sopenharmony_ci /* 149862306a36Sopenharmony_ci * First attempt to insert the delayed item. This is to make the error 149962306a36Sopenharmony_ci * handling path simpler in case we fail (-EEXIST). There's no risk of 150062306a36Sopenharmony_ci * any other task coming in and running the delayed item before we do 150162306a36Sopenharmony_ci * the metadata space reservation below, because we are holding the 150262306a36Sopenharmony_ci * delayed node's mutex and that mutex must also be locked before the 150362306a36Sopenharmony_ci * node's delayed items can be run. 150462306a36Sopenharmony_ci */ 150562306a36Sopenharmony_ci ret = __btrfs_add_delayed_item(delayed_node, delayed_item); 150662306a36Sopenharmony_ci if (unlikely(ret)) { 150762306a36Sopenharmony_ci btrfs_err(trans->fs_info, 150862306a36Sopenharmony_ci"error adding delayed dir index item, name: %.*s, index: %llu, root: %llu, dir: %llu, dir->index_cnt: %llu, delayed_node->index_cnt: %llu, error: %d", 150962306a36Sopenharmony_ci name_len, name, index, btrfs_root_id(delayed_node->root), 151062306a36Sopenharmony_ci delayed_node->inode_id, dir->index_cnt, 151162306a36Sopenharmony_ci delayed_node->index_cnt, ret); 151262306a36Sopenharmony_ci btrfs_release_delayed_item(delayed_item); 151362306a36Sopenharmony_ci btrfs_release_dir_index_item_space(trans); 151462306a36Sopenharmony_ci mutex_unlock(&delayed_node->mutex); 151562306a36Sopenharmony_ci goto release_node; 151662306a36Sopenharmony_ci } 151762306a36Sopenharmony_ci 151862306a36Sopenharmony_ci if (delayed_node->index_item_leaves == 0 || 151962306a36Sopenharmony_ci delayed_node->curr_index_batch_size + data_len > leaf_data_size) { 152062306a36Sopenharmony_ci delayed_node->curr_index_batch_size = data_len; 152162306a36Sopenharmony_ci reserve_leaf_space = true; 152262306a36Sopenharmony_ci } else { 152362306a36Sopenharmony_ci delayed_node->curr_index_batch_size += data_len; 152462306a36Sopenharmony_ci reserve_leaf_space = false; 152562306a36Sopenharmony_ci } 152662306a36Sopenharmony_ci 152762306a36Sopenharmony_ci if (reserve_leaf_space) { 152862306a36Sopenharmony_ci ret = btrfs_delayed_item_reserve_metadata(trans, delayed_item); 152962306a36Sopenharmony_ci /* 153062306a36Sopenharmony_ci * Space was reserved for a dir index item insertion when we 153162306a36Sopenharmony_ci * started the transaction, so getting a failure here should be 153262306a36Sopenharmony_ci * impossible. 153362306a36Sopenharmony_ci */ 153462306a36Sopenharmony_ci if (WARN_ON(ret)) { 153562306a36Sopenharmony_ci btrfs_release_delayed_item(delayed_item); 153662306a36Sopenharmony_ci mutex_unlock(&delayed_node->mutex); 153762306a36Sopenharmony_ci goto release_node; 153862306a36Sopenharmony_ci } 153962306a36Sopenharmony_ci 154062306a36Sopenharmony_ci delayed_node->index_item_leaves++; 154162306a36Sopenharmony_ci } else { 154262306a36Sopenharmony_ci btrfs_release_dir_index_item_space(trans); 154362306a36Sopenharmony_ci } 154462306a36Sopenharmony_ci mutex_unlock(&delayed_node->mutex); 154562306a36Sopenharmony_ci 154662306a36Sopenharmony_cirelease_node: 154762306a36Sopenharmony_ci btrfs_release_delayed_node(delayed_node); 154862306a36Sopenharmony_ci return ret; 154962306a36Sopenharmony_ci} 155062306a36Sopenharmony_ci 155162306a36Sopenharmony_cistatic int btrfs_delete_delayed_insertion_item(struct btrfs_fs_info *fs_info, 155262306a36Sopenharmony_ci struct btrfs_delayed_node *node, 155362306a36Sopenharmony_ci u64 index) 155462306a36Sopenharmony_ci{ 155562306a36Sopenharmony_ci struct btrfs_delayed_item *item; 155662306a36Sopenharmony_ci 155762306a36Sopenharmony_ci mutex_lock(&node->mutex); 155862306a36Sopenharmony_ci item = __btrfs_lookup_delayed_item(&node->ins_root.rb_root, index); 155962306a36Sopenharmony_ci if (!item) { 156062306a36Sopenharmony_ci mutex_unlock(&node->mutex); 156162306a36Sopenharmony_ci return 1; 156262306a36Sopenharmony_ci } 156362306a36Sopenharmony_ci 156462306a36Sopenharmony_ci /* 156562306a36Sopenharmony_ci * For delayed items to insert, we track reserved metadata bytes based 156662306a36Sopenharmony_ci * on the number of leaves that we will use. 156762306a36Sopenharmony_ci * See btrfs_insert_delayed_dir_index() and 156862306a36Sopenharmony_ci * btrfs_delayed_item_reserve_metadata()). 156962306a36Sopenharmony_ci */ 157062306a36Sopenharmony_ci ASSERT(item->bytes_reserved == 0); 157162306a36Sopenharmony_ci ASSERT(node->index_item_leaves > 0); 157262306a36Sopenharmony_ci 157362306a36Sopenharmony_ci /* 157462306a36Sopenharmony_ci * If there's only one leaf reserved, we can decrement this item from the 157562306a36Sopenharmony_ci * current batch, otherwise we can not because we don't know which leaf 157662306a36Sopenharmony_ci * it belongs to. With the current limit on delayed items, we rarely 157762306a36Sopenharmony_ci * accumulate enough dir index items to fill more than one leaf (even 157862306a36Sopenharmony_ci * when using a leaf size of 4K). 157962306a36Sopenharmony_ci */ 158062306a36Sopenharmony_ci if (node->index_item_leaves == 1) { 158162306a36Sopenharmony_ci const u32 data_len = item->data_len + sizeof(struct btrfs_item); 158262306a36Sopenharmony_ci 158362306a36Sopenharmony_ci ASSERT(node->curr_index_batch_size >= data_len); 158462306a36Sopenharmony_ci node->curr_index_batch_size -= data_len; 158562306a36Sopenharmony_ci } 158662306a36Sopenharmony_ci 158762306a36Sopenharmony_ci btrfs_release_delayed_item(item); 158862306a36Sopenharmony_ci 158962306a36Sopenharmony_ci /* If we now have no more dir index items, we can release all leaves. */ 159062306a36Sopenharmony_ci if (RB_EMPTY_ROOT(&node->ins_root.rb_root)) { 159162306a36Sopenharmony_ci btrfs_delayed_item_release_leaves(node, node->index_item_leaves); 159262306a36Sopenharmony_ci node->index_item_leaves = 0; 159362306a36Sopenharmony_ci } 159462306a36Sopenharmony_ci 159562306a36Sopenharmony_ci mutex_unlock(&node->mutex); 159662306a36Sopenharmony_ci return 0; 159762306a36Sopenharmony_ci} 159862306a36Sopenharmony_ci 159962306a36Sopenharmony_ciint btrfs_delete_delayed_dir_index(struct btrfs_trans_handle *trans, 160062306a36Sopenharmony_ci struct btrfs_inode *dir, u64 index) 160162306a36Sopenharmony_ci{ 160262306a36Sopenharmony_ci struct btrfs_delayed_node *node; 160362306a36Sopenharmony_ci struct btrfs_delayed_item *item; 160462306a36Sopenharmony_ci int ret; 160562306a36Sopenharmony_ci 160662306a36Sopenharmony_ci node = btrfs_get_or_create_delayed_node(dir); 160762306a36Sopenharmony_ci if (IS_ERR(node)) 160862306a36Sopenharmony_ci return PTR_ERR(node); 160962306a36Sopenharmony_ci 161062306a36Sopenharmony_ci ret = btrfs_delete_delayed_insertion_item(trans->fs_info, node, index); 161162306a36Sopenharmony_ci if (!ret) 161262306a36Sopenharmony_ci goto end; 161362306a36Sopenharmony_ci 161462306a36Sopenharmony_ci item = btrfs_alloc_delayed_item(0, node, BTRFS_DELAYED_DELETION_ITEM); 161562306a36Sopenharmony_ci if (!item) { 161662306a36Sopenharmony_ci ret = -ENOMEM; 161762306a36Sopenharmony_ci goto end; 161862306a36Sopenharmony_ci } 161962306a36Sopenharmony_ci 162062306a36Sopenharmony_ci item->index = index; 162162306a36Sopenharmony_ci 162262306a36Sopenharmony_ci ret = btrfs_delayed_item_reserve_metadata(trans, item); 162362306a36Sopenharmony_ci /* 162462306a36Sopenharmony_ci * we have reserved enough space when we start a new transaction, 162562306a36Sopenharmony_ci * so reserving metadata failure is impossible. 162662306a36Sopenharmony_ci */ 162762306a36Sopenharmony_ci if (ret < 0) { 162862306a36Sopenharmony_ci btrfs_err(trans->fs_info, 162962306a36Sopenharmony_ci"metadata reservation failed for delayed dir item deltiona, should have been reserved"); 163062306a36Sopenharmony_ci btrfs_release_delayed_item(item); 163162306a36Sopenharmony_ci goto end; 163262306a36Sopenharmony_ci } 163362306a36Sopenharmony_ci 163462306a36Sopenharmony_ci mutex_lock(&node->mutex); 163562306a36Sopenharmony_ci ret = __btrfs_add_delayed_item(node, item); 163662306a36Sopenharmony_ci if (unlikely(ret)) { 163762306a36Sopenharmony_ci btrfs_err(trans->fs_info, 163862306a36Sopenharmony_ci "err add delayed dir index item(index: %llu) into the deletion tree of the delayed node(root id: %llu, inode id: %llu, errno: %d)", 163962306a36Sopenharmony_ci index, node->root->root_key.objectid, 164062306a36Sopenharmony_ci node->inode_id, ret); 164162306a36Sopenharmony_ci btrfs_delayed_item_release_metadata(dir->root, item); 164262306a36Sopenharmony_ci btrfs_release_delayed_item(item); 164362306a36Sopenharmony_ci } 164462306a36Sopenharmony_ci mutex_unlock(&node->mutex); 164562306a36Sopenharmony_ciend: 164662306a36Sopenharmony_ci btrfs_release_delayed_node(node); 164762306a36Sopenharmony_ci return ret; 164862306a36Sopenharmony_ci} 164962306a36Sopenharmony_ci 165062306a36Sopenharmony_ciint btrfs_inode_delayed_dir_index_count(struct btrfs_inode *inode) 165162306a36Sopenharmony_ci{ 165262306a36Sopenharmony_ci struct btrfs_delayed_node *delayed_node = btrfs_get_delayed_node(inode); 165362306a36Sopenharmony_ci 165462306a36Sopenharmony_ci if (!delayed_node) 165562306a36Sopenharmony_ci return -ENOENT; 165662306a36Sopenharmony_ci 165762306a36Sopenharmony_ci /* 165862306a36Sopenharmony_ci * Since we have held i_mutex of this directory, it is impossible that 165962306a36Sopenharmony_ci * a new directory index is added into the delayed node and index_cnt 166062306a36Sopenharmony_ci * is updated now. So we needn't lock the delayed node. 166162306a36Sopenharmony_ci */ 166262306a36Sopenharmony_ci if (!delayed_node->index_cnt) { 166362306a36Sopenharmony_ci btrfs_release_delayed_node(delayed_node); 166462306a36Sopenharmony_ci return -EINVAL; 166562306a36Sopenharmony_ci } 166662306a36Sopenharmony_ci 166762306a36Sopenharmony_ci inode->index_cnt = delayed_node->index_cnt; 166862306a36Sopenharmony_ci btrfs_release_delayed_node(delayed_node); 166962306a36Sopenharmony_ci return 0; 167062306a36Sopenharmony_ci} 167162306a36Sopenharmony_ci 167262306a36Sopenharmony_cibool btrfs_readdir_get_delayed_items(struct inode *inode, 167362306a36Sopenharmony_ci u64 last_index, 167462306a36Sopenharmony_ci struct list_head *ins_list, 167562306a36Sopenharmony_ci struct list_head *del_list) 167662306a36Sopenharmony_ci{ 167762306a36Sopenharmony_ci struct btrfs_delayed_node *delayed_node; 167862306a36Sopenharmony_ci struct btrfs_delayed_item *item; 167962306a36Sopenharmony_ci 168062306a36Sopenharmony_ci delayed_node = btrfs_get_delayed_node(BTRFS_I(inode)); 168162306a36Sopenharmony_ci if (!delayed_node) 168262306a36Sopenharmony_ci return false; 168362306a36Sopenharmony_ci 168462306a36Sopenharmony_ci /* 168562306a36Sopenharmony_ci * We can only do one readdir with delayed items at a time because of 168662306a36Sopenharmony_ci * item->readdir_list. 168762306a36Sopenharmony_ci */ 168862306a36Sopenharmony_ci btrfs_inode_unlock(BTRFS_I(inode), BTRFS_ILOCK_SHARED); 168962306a36Sopenharmony_ci btrfs_inode_lock(BTRFS_I(inode), 0); 169062306a36Sopenharmony_ci 169162306a36Sopenharmony_ci mutex_lock(&delayed_node->mutex); 169262306a36Sopenharmony_ci item = __btrfs_first_delayed_insertion_item(delayed_node); 169362306a36Sopenharmony_ci while (item && item->index <= last_index) { 169462306a36Sopenharmony_ci refcount_inc(&item->refs); 169562306a36Sopenharmony_ci list_add_tail(&item->readdir_list, ins_list); 169662306a36Sopenharmony_ci item = __btrfs_next_delayed_item(item); 169762306a36Sopenharmony_ci } 169862306a36Sopenharmony_ci 169962306a36Sopenharmony_ci item = __btrfs_first_delayed_deletion_item(delayed_node); 170062306a36Sopenharmony_ci while (item && item->index <= last_index) { 170162306a36Sopenharmony_ci refcount_inc(&item->refs); 170262306a36Sopenharmony_ci list_add_tail(&item->readdir_list, del_list); 170362306a36Sopenharmony_ci item = __btrfs_next_delayed_item(item); 170462306a36Sopenharmony_ci } 170562306a36Sopenharmony_ci mutex_unlock(&delayed_node->mutex); 170662306a36Sopenharmony_ci /* 170762306a36Sopenharmony_ci * This delayed node is still cached in the btrfs inode, so refs 170862306a36Sopenharmony_ci * must be > 1 now, and we needn't check it is going to be freed 170962306a36Sopenharmony_ci * or not. 171062306a36Sopenharmony_ci * 171162306a36Sopenharmony_ci * Besides that, this function is used to read dir, we do not 171262306a36Sopenharmony_ci * insert/delete delayed items in this period. So we also needn't 171362306a36Sopenharmony_ci * requeue or dequeue this delayed node. 171462306a36Sopenharmony_ci */ 171562306a36Sopenharmony_ci refcount_dec(&delayed_node->refs); 171662306a36Sopenharmony_ci 171762306a36Sopenharmony_ci return true; 171862306a36Sopenharmony_ci} 171962306a36Sopenharmony_ci 172062306a36Sopenharmony_civoid btrfs_readdir_put_delayed_items(struct inode *inode, 172162306a36Sopenharmony_ci struct list_head *ins_list, 172262306a36Sopenharmony_ci struct list_head *del_list) 172362306a36Sopenharmony_ci{ 172462306a36Sopenharmony_ci struct btrfs_delayed_item *curr, *next; 172562306a36Sopenharmony_ci 172662306a36Sopenharmony_ci list_for_each_entry_safe(curr, next, ins_list, readdir_list) { 172762306a36Sopenharmony_ci list_del(&curr->readdir_list); 172862306a36Sopenharmony_ci if (refcount_dec_and_test(&curr->refs)) 172962306a36Sopenharmony_ci kfree(curr); 173062306a36Sopenharmony_ci } 173162306a36Sopenharmony_ci 173262306a36Sopenharmony_ci list_for_each_entry_safe(curr, next, del_list, readdir_list) { 173362306a36Sopenharmony_ci list_del(&curr->readdir_list); 173462306a36Sopenharmony_ci if (refcount_dec_and_test(&curr->refs)) 173562306a36Sopenharmony_ci kfree(curr); 173662306a36Sopenharmony_ci } 173762306a36Sopenharmony_ci 173862306a36Sopenharmony_ci /* 173962306a36Sopenharmony_ci * The VFS is going to do up_read(), so we need to downgrade back to a 174062306a36Sopenharmony_ci * read lock. 174162306a36Sopenharmony_ci */ 174262306a36Sopenharmony_ci downgrade_write(&inode->i_rwsem); 174362306a36Sopenharmony_ci} 174462306a36Sopenharmony_ci 174562306a36Sopenharmony_ciint btrfs_should_delete_dir_index(struct list_head *del_list, 174662306a36Sopenharmony_ci u64 index) 174762306a36Sopenharmony_ci{ 174862306a36Sopenharmony_ci struct btrfs_delayed_item *curr; 174962306a36Sopenharmony_ci int ret = 0; 175062306a36Sopenharmony_ci 175162306a36Sopenharmony_ci list_for_each_entry(curr, del_list, readdir_list) { 175262306a36Sopenharmony_ci if (curr->index > index) 175362306a36Sopenharmony_ci break; 175462306a36Sopenharmony_ci if (curr->index == index) { 175562306a36Sopenharmony_ci ret = 1; 175662306a36Sopenharmony_ci break; 175762306a36Sopenharmony_ci } 175862306a36Sopenharmony_ci } 175962306a36Sopenharmony_ci return ret; 176062306a36Sopenharmony_ci} 176162306a36Sopenharmony_ci 176262306a36Sopenharmony_ci/* 176362306a36Sopenharmony_ci * btrfs_readdir_delayed_dir_index - read dir info stored in the delayed tree 176462306a36Sopenharmony_ci * 176562306a36Sopenharmony_ci */ 176662306a36Sopenharmony_ciint btrfs_readdir_delayed_dir_index(struct dir_context *ctx, 176762306a36Sopenharmony_ci struct list_head *ins_list) 176862306a36Sopenharmony_ci{ 176962306a36Sopenharmony_ci struct btrfs_dir_item *di; 177062306a36Sopenharmony_ci struct btrfs_delayed_item *curr, *next; 177162306a36Sopenharmony_ci struct btrfs_key location; 177262306a36Sopenharmony_ci char *name; 177362306a36Sopenharmony_ci int name_len; 177462306a36Sopenharmony_ci int over = 0; 177562306a36Sopenharmony_ci unsigned char d_type; 177662306a36Sopenharmony_ci 177762306a36Sopenharmony_ci /* 177862306a36Sopenharmony_ci * Changing the data of the delayed item is impossible. So 177962306a36Sopenharmony_ci * we needn't lock them. And we have held i_mutex of the 178062306a36Sopenharmony_ci * directory, nobody can delete any directory indexes now. 178162306a36Sopenharmony_ci */ 178262306a36Sopenharmony_ci list_for_each_entry_safe(curr, next, ins_list, readdir_list) { 178362306a36Sopenharmony_ci list_del(&curr->readdir_list); 178462306a36Sopenharmony_ci 178562306a36Sopenharmony_ci if (curr->index < ctx->pos) { 178662306a36Sopenharmony_ci if (refcount_dec_and_test(&curr->refs)) 178762306a36Sopenharmony_ci kfree(curr); 178862306a36Sopenharmony_ci continue; 178962306a36Sopenharmony_ci } 179062306a36Sopenharmony_ci 179162306a36Sopenharmony_ci ctx->pos = curr->index; 179262306a36Sopenharmony_ci 179362306a36Sopenharmony_ci di = (struct btrfs_dir_item *)curr->data; 179462306a36Sopenharmony_ci name = (char *)(di + 1); 179562306a36Sopenharmony_ci name_len = btrfs_stack_dir_name_len(di); 179662306a36Sopenharmony_ci 179762306a36Sopenharmony_ci d_type = fs_ftype_to_dtype(btrfs_dir_flags_to_ftype(di->type)); 179862306a36Sopenharmony_ci btrfs_disk_key_to_cpu(&location, &di->location); 179962306a36Sopenharmony_ci 180062306a36Sopenharmony_ci over = !dir_emit(ctx, name, name_len, 180162306a36Sopenharmony_ci location.objectid, d_type); 180262306a36Sopenharmony_ci 180362306a36Sopenharmony_ci if (refcount_dec_and_test(&curr->refs)) 180462306a36Sopenharmony_ci kfree(curr); 180562306a36Sopenharmony_ci 180662306a36Sopenharmony_ci if (over) 180762306a36Sopenharmony_ci return 1; 180862306a36Sopenharmony_ci ctx->pos++; 180962306a36Sopenharmony_ci } 181062306a36Sopenharmony_ci return 0; 181162306a36Sopenharmony_ci} 181262306a36Sopenharmony_ci 181362306a36Sopenharmony_cistatic void fill_stack_inode_item(struct btrfs_trans_handle *trans, 181462306a36Sopenharmony_ci struct btrfs_inode_item *inode_item, 181562306a36Sopenharmony_ci struct inode *inode) 181662306a36Sopenharmony_ci{ 181762306a36Sopenharmony_ci u64 flags; 181862306a36Sopenharmony_ci 181962306a36Sopenharmony_ci btrfs_set_stack_inode_uid(inode_item, i_uid_read(inode)); 182062306a36Sopenharmony_ci btrfs_set_stack_inode_gid(inode_item, i_gid_read(inode)); 182162306a36Sopenharmony_ci btrfs_set_stack_inode_size(inode_item, BTRFS_I(inode)->disk_i_size); 182262306a36Sopenharmony_ci btrfs_set_stack_inode_mode(inode_item, inode->i_mode); 182362306a36Sopenharmony_ci btrfs_set_stack_inode_nlink(inode_item, inode->i_nlink); 182462306a36Sopenharmony_ci btrfs_set_stack_inode_nbytes(inode_item, inode_get_bytes(inode)); 182562306a36Sopenharmony_ci btrfs_set_stack_inode_generation(inode_item, 182662306a36Sopenharmony_ci BTRFS_I(inode)->generation); 182762306a36Sopenharmony_ci btrfs_set_stack_inode_sequence(inode_item, 182862306a36Sopenharmony_ci inode_peek_iversion(inode)); 182962306a36Sopenharmony_ci btrfs_set_stack_inode_transid(inode_item, trans->transid); 183062306a36Sopenharmony_ci btrfs_set_stack_inode_rdev(inode_item, inode->i_rdev); 183162306a36Sopenharmony_ci flags = btrfs_inode_combine_flags(BTRFS_I(inode)->flags, 183262306a36Sopenharmony_ci BTRFS_I(inode)->ro_flags); 183362306a36Sopenharmony_ci btrfs_set_stack_inode_flags(inode_item, flags); 183462306a36Sopenharmony_ci btrfs_set_stack_inode_block_group(inode_item, 0); 183562306a36Sopenharmony_ci 183662306a36Sopenharmony_ci btrfs_set_stack_timespec_sec(&inode_item->atime, 183762306a36Sopenharmony_ci inode->i_atime.tv_sec); 183862306a36Sopenharmony_ci btrfs_set_stack_timespec_nsec(&inode_item->atime, 183962306a36Sopenharmony_ci inode->i_atime.tv_nsec); 184062306a36Sopenharmony_ci 184162306a36Sopenharmony_ci btrfs_set_stack_timespec_sec(&inode_item->mtime, 184262306a36Sopenharmony_ci inode->i_mtime.tv_sec); 184362306a36Sopenharmony_ci btrfs_set_stack_timespec_nsec(&inode_item->mtime, 184462306a36Sopenharmony_ci inode->i_mtime.tv_nsec); 184562306a36Sopenharmony_ci 184662306a36Sopenharmony_ci btrfs_set_stack_timespec_sec(&inode_item->ctime, 184762306a36Sopenharmony_ci inode_get_ctime(inode).tv_sec); 184862306a36Sopenharmony_ci btrfs_set_stack_timespec_nsec(&inode_item->ctime, 184962306a36Sopenharmony_ci inode_get_ctime(inode).tv_nsec); 185062306a36Sopenharmony_ci 185162306a36Sopenharmony_ci btrfs_set_stack_timespec_sec(&inode_item->otime, 185262306a36Sopenharmony_ci BTRFS_I(inode)->i_otime.tv_sec); 185362306a36Sopenharmony_ci btrfs_set_stack_timespec_nsec(&inode_item->otime, 185462306a36Sopenharmony_ci BTRFS_I(inode)->i_otime.tv_nsec); 185562306a36Sopenharmony_ci} 185662306a36Sopenharmony_ci 185762306a36Sopenharmony_ciint btrfs_fill_inode(struct inode *inode, u32 *rdev) 185862306a36Sopenharmony_ci{ 185962306a36Sopenharmony_ci struct btrfs_fs_info *fs_info = BTRFS_I(inode)->root->fs_info; 186062306a36Sopenharmony_ci struct btrfs_delayed_node *delayed_node; 186162306a36Sopenharmony_ci struct btrfs_inode_item *inode_item; 186262306a36Sopenharmony_ci 186362306a36Sopenharmony_ci delayed_node = btrfs_get_delayed_node(BTRFS_I(inode)); 186462306a36Sopenharmony_ci if (!delayed_node) 186562306a36Sopenharmony_ci return -ENOENT; 186662306a36Sopenharmony_ci 186762306a36Sopenharmony_ci mutex_lock(&delayed_node->mutex); 186862306a36Sopenharmony_ci if (!test_bit(BTRFS_DELAYED_NODE_INODE_DIRTY, &delayed_node->flags)) { 186962306a36Sopenharmony_ci mutex_unlock(&delayed_node->mutex); 187062306a36Sopenharmony_ci btrfs_release_delayed_node(delayed_node); 187162306a36Sopenharmony_ci return -ENOENT; 187262306a36Sopenharmony_ci } 187362306a36Sopenharmony_ci 187462306a36Sopenharmony_ci inode_item = &delayed_node->inode_item; 187562306a36Sopenharmony_ci 187662306a36Sopenharmony_ci i_uid_write(inode, btrfs_stack_inode_uid(inode_item)); 187762306a36Sopenharmony_ci i_gid_write(inode, btrfs_stack_inode_gid(inode_item)); 187862306a36Sopenharmony_ci btrfs_i_size_write(BTRFS_I(inode), btrfs_stack_inode_size(inode_item)); 187962306a36Sopenharmony_ci btrfs_inode_set_file_extent_range(BTRFS_I(inode), 0, 188062306a36Sopenharmony_ci round_up(i_size_read(inode), fs_info->sectorsize)); 188162306a36Sopenharmony_ci inode->i_mode = btrfs_stack_inode_mode(inode_item); 188262306a36Sopenharmony_ci set_nlink(inode, btrfs_stack_inode_nlink(inode_item)); 188362306a36Sopenharmony_ci inode_set_bytes(inode, btrfs_stack_inode_nbytes(inode_item)); 188462306a36Sopenharmony_ci BTRFS_I(inode)->generation = btrfs_stack_inode_generation(inode_item); 188562306a36Sopenharmony_ci BTRFS_I(inode)->last_trans = btrfs_stack_inode_transid(inode_item); 188662306a36Sopenharmony_ci 188762306a36Sopenharmony_ci inode_set_iversion_queried(inode, 188862306a36Sopenharmony_ci btrfs_stack_inode_sequence(inode_item)); 188962306a36Sopenharmony_ci inode->i_rdev = 0; 189062306a36Sopenharmony_ci *rdev = btrfs_stack_inode_rdev(inode_item); 189162306a36Sopenharmony_ci btrfs_inode_split_flags(btrfs_stack_inode_flags(inode_item), 189262306a36Sopenharmony_ci &BTRFS_I(inode)->flags, &BTRFS_I(inode)->ro_flags); 189362306a36Sopenharmony_ci 189462306a36Sopenharmony_ci inode->i_atime.tv_sec = btrfs_stack_timespec_sec(&inode_item->atime); 189562306a36Sopenharmony_ci inode->i_atime.tv_nsec = btrfs_stack_timespec_nsec(&inode_item->atime); 189662306a36Sopenharmony_ci 189762306a36Sopenharmony_ci inode->i_mtime.tv_sec = btrfs_stack_timespec_sec(&inode_item->mtime); 189862306a36Sopenharmony_ci inode->i_mtime.tv_nsec = btrfs_stack_timespec_nsec(&inode_item->mtime); 189962306a36Sopenharmony_ci 190062306a36Sopenharmony_ci inode_set_ctime(inode, btrfs_stack_timespec_sec(&inode_item->ctime), 190162306a36Sopenharmony_ci btrfs_stack_timespec_nsec(&inode_item->ctime)); 190262306a36Sopenharmony_ci 190362306a36Sopenharmony_ci BTRFS_I(inode)->i_otime.tv_sec = 190462306a36Sopenharmony_ci btrfs_stack_timespec_sec(&inode_item->otime); 190562306a36Sopenharmony_ci BTRFS_I(inode)->i_otime.tv_nsec = 190662306a36Sopenharmony_ci btrfs_stack_timespec_nsec(&inode_item->otime); 190762306a36Sopenharmony_ci 190862306a36Sopenharmony_ci inode->i_generation = BTRFS_I(inode)->generation; 190962306a36Sopenharmony_ci BTRFS_I(inode)->index_cnt = (u64)-1; 191062306a36Sopenharmony_ci 191162306a36Sopenharmony_ci mutex_unlock(&delayed_node->mutex); 191262306a36Sopenharmony_ci btrfs_release_delayed_node(delayed_node); 191362306a36Sopenharmony_ci return 0; 191462306a36Sopenharmony_ci} 191562306a36Sopenharmony_ci 191662306a36Sopenharmony_ciint btrfs_delayed_update_inode(struct btrfs_trans_handle *trans, 191762306a36Sopenharmony_ci struct btrfs_root *root, 191862306a36Sopenharmony_ci struct btrfs_inode *inode) 191962306a36Sopenharmony_ci{ 192062306a36Sopenharmony_ci struct btrfs_delayed_node *delayed_node; 192162306a36Sopenharmony_ci int ret = 0; 192262306a36Sopenharmony_ci 192362306a36Sopenharmony_ci delayed_node = btrfs_get_or_create_delayed_node(inode); 192462306a36Sopenharmony_ci if (IS_ERR(delayed_node)) 192562306a36Sopenharmony_ci return PTR_ERR(delayed_node); 192662306a36Sopenharmony_ci 192762306a36Sopenharmony_ci mutex_lock(&delayed_node->mutex); 192862306a36Sopenharmony_ci if (test_bit(BTRFS_DELAYED_NODE_INODE_DIRTY, &delayed_node->flags)) { 192962306a36Sopenharmony_ci fill_stack_inode_item(trans, &delayed_node->inode_item, 193062306a36Sopenharmony_ci &inode->vfs_inode); 193162306a36Sopenharmony_ci goto release_node; 193262306a36Sopenharmony_ci } 193362306a36Sopenharmony_ci 193462306a36Sopenharmony_ci ret = btrfs_delayed_inode_reserve_metadata(trans, root, delayed_node); 193562306a36Sopenharmony_ci if (ret) 193662306a36Sopenharmony_ci goto release_node; 193762306a36Sopenharmony_ci 193862306a36Sopenharmony_ci fill_stack_inode_item(trans, &delayed_node->inode_item, &inode->vfs_inode); 193962306a36Sopenharmony_ci set_bit(BTRFS_DELAYED_NODE_INODE_DIRTY, &delayed_node->flags); 194062306a36Sopenharmony_ci delayed_node->count++; 194162306a36Sopenharmony_ci atomic_inc(&root->fs_info->delayed_root->items); 194262306a36Sopenharmony_cirelease_node: 194362306a36Sopenharmony_ci mutex_unlock(&delayed_node->mutex); 194462306a36Sopenharmony_ci btrfs_release_delayed_node(delayed_node); 194562306a36Sopenharmony_ci return ret; 194662306a36Sopenharmony_ci} 194762306a36Sopenharmony_ci 194862306a36Sopenharmony_ciint btrfs_delayed_delete_inode_ref(struct btrfs_inode *inode) 194962306a36Sopenharmony_ci{ 195062306a36Sopenharmony_ci struct btrfs_fs_info *fs_info = inode->root->fs_info; 195162306a36Sopenharmony_ci struct btrfs_delayed_node *delayed_node; 195262306a36Sopenharmony_ci 195362306a36Sopenharmony_ci /* 195462306a36Sopenharmony_ci * we don't do delayed inode updates during log recovery because it 195562306a36Sopenharmony_ci * leads to enospc problems. This means we also can't do 195662306a36Sopenharmony_ci * delayed inode refs 195762306a36Sopenharmony_ci */ 195862306a36Sopenharmony_ci if (test_bit(BTRFS_FS_LOG_RECOVERING, &fs_info->flags)) 195962306a36Sopenharmony_ci return -EAGAIN; 196062306a36Sopenharmony_ci 196162306a36Sopenharmony_ci delayed_node = btrfs_get_or_create_delayed_node(inode); 196262306a36Sopenharmony_ci if (IS_ERR(delayed_node)) 196362306a36Sopenharmony_ci return PTR_ERR(delayed_node); 196462306a36Sopenharmony_ci 196562306a36Sopenharmony_ci /* 196662306a36Sopenharmony_ci * We don't reserve space for inode ref deletion is because: 196762306a36Sopenharmony_ci * - We ONLY do async inode ref deletion for the inode who has only 196862306a36Sopenharmony_ci * one link(i_nlink == 1), it means there is only one inode ref. 196962306a36Sopenharmony_ci * And in most case, the inode ref and the inode item are in the 197062306a36Sopenharmony_ci * same leaf, and we will deal with them at the same time. 197162306a36Sopenharmony_ci * Since we are sure we will reserve the space for the inode item, 197262306a36Sopenharmony_ci * it is unnecessary to reserve space for inode ref deletion. 197362306a36Sopenharmony_ci * - If the inode ref and the inode item are not in the same leaf, 197462306a36Sopenharmony_ci * We also needn't worry about enospc problem, because we reserve 197562306a36Sopenharmony_ci * much more space for the inode update than it needs. 197662306a36Sopenharmony_ci * - At the worst, we can steal some space from the global reservation. 197762306a36Sopenharmony_ci * It is very rare. 197862306a36Sopenharmony_ci */ 197962306a36Sopenharmony_ci mutex_lock(&delayed_node->mutex); 198062306a36Sopenharmony_ci if (test_bit(BTRFS_DELAYED_NODE_DEL_IREF, &delayed_node->flags)) 198162306a36Sopenharmony_ci goto release_node; 198262306a36Sopenharmony_ci 198362306a36Sopenharmony_ci set_bit(BTRFS_DELAYED_NODE_DEL_IREF, &delayed_node->flags); 198462306a36Sopenharmony_ci delayed_node->count++; 198562306a36Sopenharmony_ci atomic_inc(&fs_info->delayed_root->items); 198662306a36Sopenharmony_cirelease_node: 198762306a36Sopenharmony_ci mutex_unlock(&delayed_node->mutex); 198862306a36Sopenharmony_ci btrfs_release_delayed_node(delayed_node); 198962306a36Sopenharmony_ci return 0; 199062306a36Sopenharmony_ci} 199162306a36Sopenharmony_ci 199262306a36Sopenharmony_cistatic void __btrfs_kill_delayed_node(struct btrfs_delayed_node *delayed_node) 199362306a36Sopenharmony_ci{ 199462306a36Sopenharmony_ci struct btrfs_root *root = delayed_node->root; 199562306a36Sopenharmony_ci struct btrfs_fs_info *fs_info = root->fs_info; 199662306a36Sopenharmony_ci struct btrfs_delayed_item *curr_item, *prev_item; 199762306a36Sopenharmony_ci 199862306a36Sopenharmony_ci mutex_lock(&delayed_node->mutex); 199962306a36Sopenharmony_ci curr_item = __btrfs_first_delayed_insertion_item(delayed_node); 200062306a36Sopenharmony_ci while (curr_item) { 200162306a36Sopenharmony_ci prev_item = curr_item; 200262306a36Sopenharmony_ci curr_item = __btrfs_next_delayed_item(prev_item); 200362306a36Sopenharmony_ci btrfs_release_delayed_item(prev_item); 200462306a36Sopenharmony_ci } 200562306a36Sopenharmony_ci 200662306a36Sopenharmony_ci if (delayed_node->index_item_leaves > 0) { 200762306a36Sopenharmony_ci btrfs_delayed_item_release_leaves(delayed_node, 200862306a36Sopenharmony_ci delayed_node->index_item_leaves); 200962306a36Sopenharmony_ci delayed_node->index_item_leaves = 0; 201062306a36Sopenharmony_ci } 201162306a36Sopenharmony_ci 201262306a36Sopenharmony_ci curr_item = __btrfs_first_delayed_deletion_item(delayed_node); 201362306a36Sopenharmony_ci while (curr_item) { 201462306a36Sopenharmony_ci btrfs_delayed_item_release_metadata(root, curr_item); 201562306a36Sopenharmony_ci prev_item = curr_item; 201662306a36Sopenharmony_ci curr_item = __btrfs_next_delayed_item(prev_item); 201762306a36Sopenharmony_ci btrfs_release_delayed_item(prev_item); 201862306a36Sopenharmony_ci } 201962306a36Sopenharmony_ci 202062306a36Sopenharmony_ci btrfs_release_delayed_iref(delayed_node); 202162306a36Sopenharmony_ci 202262306a36Sopenharmony_ci if (test_bit(BTRFS_DELAYED_NODE_INODE_DIRTY, &delayed_node->flags)) { 202362306a36Sopenharmony_ci btrfs_delayed_inode_release_metadata(fs_info, delayed_node, false); 202462306a36Sopenharmony_ci btrfs_release_delayed_inode(delayed_node); 202562306a36Sopenharmony_ci } 202662306a36Sopenharmony_ci mutex_unlock(&delayed_node->mutex); 202762306a36Sopenharmony_ci} 202862306a36Sopenharmony_ci 202962306a36Sopenharmony_civoid btrfs_kill_delayed_inode_items(struct btrfs_inode *inode) 203062306a36Sopenharmony_ci{ 203162306a36Sopenharmony_ci struct btrfs_delayed_node *delayed_node; 203262306a36Sopenharmony_ci 203362306a36Sopenharmony_ci delayed_node = btrfs_get_delayed_node(inode); 203462306a36Sopenharmony_ci if (!delayed_node) 203562306a36Sopenharmony_ci return; 203662306a36Sopenharmony_ci 203762306a36Sopenharmony_ci __btrfs_kill_delayed_node(delayed_node); 203862306a36Sopenharmony_ci btrfs_release_delayed_node(delayed_node); 203962306a36Sopenharmony_ci} 204062306a36Sopenharmony_ci 204162306a36Sopenharmony_civoid btrfs_kill_all_delayed_nodes(struct btrfs_root *root) 204262306a36Sopenharmony_ci{ 204362306a36Sopenharmony_ci u64 inode_id = 0; 204462306a36Sopenharmony_ci struct btrfs_delayed_node *delayed_nodes[8]; 204562306a36Sopenharmony_ci int i, n; 204662306a36Sopenharmony_ci 204762306a36Sopenharmony_ci while (1) { 204862306a36Sopenharmony_ci spin_lock(&root->inode_lock); 204962306a36Sopenharmony_ci n = radix_tree_gang_lookup(&root->delayed_nodes_tree, 205062306a36Sopenharmony_ci (void **)delayed_nodes, inode_id, 205162306a36Sopenharmony_ci ARRAY_SIZE(delayed_nodes)); 205262306a36Sopenharmony_ci if (!n) { 205362306a36Sopenharmony_ci spin_unlock(&root->inode_lock); 205462306a36Sopenharmony_ci break; 205562306a36Sopenharmony_ci } 205662306a36Sopenharmony_ci 205762306a36Sopenharmony_ci inode_id = delayed_nodes[n - 1]->inode_id + 1; 205862306a36Sopenharmony_ci for (i = 0; i < n; i++) { 205962306a36Sopenharmony_ci /* 206062306a36Sopenharmony_ci * Don't increase refs in case the node is dead and 206162306a36Sopenharmony_ci * about to be removed from the tree in the loop below 206262306a36Sopenharmony_ci */ 206362306a36Sopenharmony_ci if (!refcount_inc_not_zero(&delayed_nodes[i]->refs)) 206462306a36Sopenharmony_ci delayed_nodes[i] = NULL; 206562306a36Sopenharmony_ci } 206662306a36Sopenharmony_ci spin_unlock(&root->inode_lock); 206762306a36Sopenharmony_ci 206862306a36Sopenharmony_ci for (i = 0; i < n; i++) { 206962306a36Sopenharmony_ci if (!delayed_nodes[i]) 207062306a36Sopenharmony_ci continue; 207162306a36Sopenharmony_ci __btrfs_kill_delayed_node(delayed_nodes[i]); 207262306a36Sopenharmony_ci btrfs_release_delayed_node(delayed_nodes[i]); 207362306a36Sopenharmony_ci } 207462306a36Sopenharmony_ci } 207562306a36Sopenharmony_ci} 207662306a36Sopenharmony_ci 207762306a36Sopenharmony_civoid btrfs_destroy_delayed_inodes(struct btrfs_fs_info *fs_info) 207862306a36Sopenharmony_ci{ 207962306a36Sopenharmony_ci struct btrfs_delayed_node *curr_node, *prev_node; 208062306a36Sopenharmony_ci 208162306a36Sopenharmony_ci curr_node = btrfs_first_delayed_node(fs_info->delayed_root); 208262306a36Sopenharmony_ci while (curr_node) { 208362306a36Sopenharmony_ci __btrfs_kill_delayed_node(curr_node); 208462306a36Sopenharmony_ci 208562306a36Sopenharmony_ci prev_node = curr_node; 208662306a36Sopenharmony_ci curr_node = btrfs_next_delayed_node(curr_node); 208762306a36Sopenharmony_ci btrfs_release_delayed_node(prev_node); 208862306a36Sopenharmony_ci } 208962306a36Sopenharmony_ci} 209062306a36Sopenharmony_ci 209162306a36Sopenharmony_civoid btrfs_log_get_delayed_items(struct btrfs_inode *inode, 209262306a36Sopenharmony_ci struct list_head *ins_list, 209362306a36Sopenharmony_ci struct list_head *del_list) 209462306a36Sopenharmony_ci{ 209562306a36Sopenharmony_ci struct btrfs_delayed_node *node; 209662306a36Sopenharmony_ci struct btrfs_delayed_item *item; 209762306a36Sopenharmony_ci 209862306a36Sopenharmony_ci node = btrfs_get_delayed_node(inode); 209962306a36Sopenharmony_ci if (!node) 210062306a36Sopenharmony_ci return; 210162306a36Sopenharmony_ci 210262306a36Sopenharmony_ci mutex_lock(&node->mutex); 210362306a36Sopenharmony_ci item = __btrfs_first_delayed_insertion_item(node); 210462306a36Sopenharmony_ci while (item) { 210562306a36Sopenharmony_ci /* 210662306a36Sopenharmony_ci * It's possible that the item is already in a log list. This 210762306a36Sopenharmony_ci * can happen in case two tasks are trying to log the same 210862306a36Sopenharmony_ci * directory. For example if we have tasks A and task B: 210962306a36Sopenharmony_ci * 211062306a36Sopenharmony_ci * Task A collected the delayed items into a log list while 211162306a36Sopenharmony_ci * under the inode's log_mutex (at btrfs_log_inode()), but it 211262306a36Sopenharmony_ci * only releases the items after logging the inodes they point 211362306a36Sopenharmony_ci * to (if they are new inodes), which happens after unlocking 211462306a36Sopenharmony_ci * the log mutex; 211562306a36Sopenharmony_ci * 211662306a36Sopenharmony_ci * Task B enters btrfs_log_inode() and acquires the log_mutex 211762306a36Sopenharmony_ci * of the same directory inode, before task B releases the 211862306a36Sopenharmony_ci * delayed items. This can happen for example when logging some 211962306a36Sopenharmony_ci * inode we need to trigger logging of its parent directory, so 212062306a36Sopenharmony_ci * logging two files that have the same parent directory can 212162306a36Sopenharmony_ci * lead to this. 212262306a36Sopenharmony_ci * 212362306a36Sopenharmony_ci * If this happens, just ignore delayed items already in a log 212462306a36Sopenharmony_ci * list. All the tasks logging the directory are under a log 212562306a36Sopenharmony_ci * transaction and whichever finishes first can not sync the log 212662306a36Sopenharmony_ci * before the other completes and leaves the log transaction. 212762306a36Sopenharmony_ci */ 212862306a36Sopenharmony_ci if (!item->logged && list_empty(&item->log_list)) { 212962306a36Sopenharmony_ci refcount_inc(&item->refs); 213062306a36Sopenharmony_ci list_add_tail(&item->log_list, ins_list); 213162306a36Sopenharmony_ci } 213262306a36Sopenharmony_ci item = __btrfs_next_delayed_item(item); 213362306a36Sopenharmony_ci } 213462306a36Sopenharmony_ci 213562306a36Sopenharmony_ci item = __btrfs_first_delayed_deletion_item(node); 213662306a36Sopenharmony_ci while (item) { 213762306a36Sopenharmony_ci /* It may be non-empty, for the same reason mentioned above. */ 213862306a36Sopenharmony_ci if (!item->logged && list_empty(&item->log_list)) { 213962306a36Sopenharmony_ci refcount_inc(&item->refs); 214062306a36Sopenharmony_ci list_add_tail(&item->log_list, del_list); 214162306a36Sopenharmony_ci } 214262306a36Sopenharmony_ci item = __btrfs_next_delayed_item(item); 214362306a36Sopenharmony_ci } 214462306a36Sopenharmony_ci mutex_unlock(&node->mutex); 214562306a36Sopenharmony_ci 214662306a36Sopenharmony_ci /* 214762306a36Sopenharmony_ci * We are called during inode logging, which means the inode is in use 214862306a36Sopenharmony_ci * and can not be evicted before we finish logging the inode. So we never 214962306a36Sopenharmony_ci * have the last reference on the delayed inode. 215062306a36Sopenharmony_ci * Also, we don't use btrfs_release_delayed_node() because that would 215162306a36Sopenharmony_ci * requeue the delayed inode (change its order in the list of prepared 215262306a36Sopenharmony_ci * nodes) and we don't want to do such change because we don't create or 215362306a36Sopenharmony_ci * delete delayed items. 215462306a36Sopenharmony_ci */ 215562306a36Sopenharmony_ci ASSERT(refcount_read(&node->refs) > 1); 215662306a36Sopenharmony_ci refcount_dec(&node->refs); 215762306a36Sopenharmony_ci} 215862306a36Sopenharmony_ci 215962306a36Sopenharmony_civoid btrfs_log_put_delayed_items(struct btrfs_inode *inode, 216062306a36Sopenharmony_ci struct list_head *ins_list, 216162306a36Sopenharmony_ci struct list_head *del_list) 216262306a36Sopenharmony_ci{ 216362306a36Sopenharmony_ci struct btrfs_delayed_node *node; 216462306a36Sopenharmony_ci struct btrfs_delayed_item *item; 216562306a36Sopenharmony_ci struct btrfs_delayed_item *next; 216662306a36Sopenharmony_ci 216762306a36Sopenharmony_ci node = btrfs_get_delayed_node(inode); 216862306a36Sopenharmony_ci if (!node) 216962306a36Sopenharmony_ci return; 217062306a36Sopenharmony_ci 217162306a36Sopenharmony_ci mutex_lock(&node->mutex); 217262306a36Sopenharmony_ci 217362306a36Sopenharmony_ci list_for_each_entry_safe(item, next, ins_list, log_list) { 217462306a36Sopenharmony_ci item->logged = true; 217562306a36Sopenharmony_ci list_del_init(&item->log_list); 217662306a36Sopenharmony_ci if (refcount_dec_and_test(&item->refs)) 217762306a36Sopenharmony_ci kfree(item); 217862306a36Sopenharmony_ci } 217962306a36Sopenharmony_ci 218062306a36Sopenharmony_ci list_for_each_entry_safe(item, next, del_list, log_list) { 218162306a36Sopenharmony_ci item->logged = true; 218262306a36Sopenharmony_ci list_del_init(&item->log_list); 218362306a36Sopenharmony_ci if (refcount_dec_and_test(&item->refs)) 218462306a36Sopenharmony_ci kfree(item); 218562306a36Sopenharmony_ci } 218662306a36Sopenharmony_ci 218762306a36Sopenharmony_ci mutex_unlock(&node->mutex); 218862306a36Sopenharmony_ci 218962306a36Sopenharmony_ci /* 219062306a36Sopenharmony_ci * We are called during inode logging, which means the inode is in use 219162306a36Sopenharmony_ci * and can not be evicted before we finish logging the inode. So we never 219262306a36Sopenharmony_ci * have the last reference on the delayed inode. 219362306a36Sopenharmony_ci * Also, we don't use btrfs_release_delayed_node() because that would 219462306a36Sopenharmony_ci * requeue the delayed inode (change its order in the list of prepared 219562306a36Sopenharmony_ci * nodes) and we don't want to do such change because we don't create or 219662306a36Sopenharmony_ci * delete delayed items. 219762306a36Sopenharmony_ci */ 219862306a36Sopenharmony_ci ASSERT(refcount_read(&node->refs) > 1); 219962306a36Sopenharmony_ci refcount_dec(&node->refs); 220062306a36Sopenharmony_ci} 2201