diff options
Diffstat (limited to 'fs/btrfs/delayed-inode.c')
| -rw-r--r-- | fs/btrfs/delayed-inode.c | 73 | 
1 files changed, 28 insertions, 45 deletions
diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c index 3f1551d8a5c6..c7cc24a5dd5e 100644 --- a/fs/btrfs/delayed-inode.c +++ b/fs/btrfs/delayed-inode.c @@ -119,7 +119,12 @@ static struct btrfs_delayed_node *btrfs_get_delayed_node(  	return NULL;  } -/* Will return either the node or PTR_ERR(-ENOMEM) */ +/* + * Look up an existing delayed node associated with @btrfs_inode or create a new + * one and insert it to the delayed nodes of the root. + * + * Return the delayed node, or error pointer on failure. + */  static struct btrfs_delayed_node *btrfs_get_or_create_delayed_node(  		struct btrfs_inode *btrfs_inode)  { @@ -211,17 +216,13 @@ static void btrfs_dequeue_delayed_node(struct btrfs_delayed_root *root,  static struct btrfs_delayed_node *btrfs_first_delayed_node(  			struct btrfs_delayed_root *delayed_root)  { -	struct list_head *p; -	struct btrfs_delayed_node *node = NULL; +	struct btrfs_delayed_node *node;  	spin_lock(&delayed_root->lock); -	if (list_empty(&delayed_root->node_list)) -		goto out; - -	p = delayed_root->node_list.next; -	node = list_entry(p, struct btrfs_delayed_node, n_list); -	refcount_inc(&node->refs); -out: +	node = list_first_entry_or_null(&delayed_root->node_list, +					struct btrfs_delayed_node, n_list); +	if (node) +		refcount_inc(&node->refs);  	spin_unlock(&delayed_root->lock);  	return node; @@ -293,18 +294,15 @@ static inline void btrfs_release_delayed_node(struct btrfs_delayed_node *node)  static struct btrfs_delayed_node *btrfs_first_prepared_delayed_node(  					struct btrfs_delayed_root *delayed_root)  { -	struct list_head *p; -	struct btrfs_delayed_node *node = NULL; +	struct btrfs_delayed_node *node;  	spin_lock(&delayed_root->lock); -	if (list_empty(&delayed_root->prepare_list)) -		goto out; - -	p = delayed_root->prepare_list.next; -	list_del_init(p); -	node = list_entry(p, struct btrfs_delayed_node, p_list); -	refcount_inc(&node->refs); -out: +	node = list_first_entry_or_null(&delayed_root->prepare_list, +					struct btrfs_delayed_node, p_list); +	if (node) { +		list_del_init(&node->p_list); +		refcount_inc(&node->refs); +	}  	spin_unlock(&delayed_root->lock);  	return node; @@ -454,40 +452,25 @@ static void btrfs_release_delayed_item(struct btrfs_delayed_item *item)  static struct btrfs_delayed_item *__btrfs_first_delayed_insertion_item(  					struct btrfs_delayed_node *delayed_node)  { -	struct rb_node *p; -	struct btrfs_delayed_item *item = NULL; +	struct rb_node *p = rb_first_cached(&delayed_node->ins_root); -	p = rb_first_cached(&delayed_node->ins_root); -	if (p) -		item = rb_entry(p, struct btrfs_delayed_item, rb_node); - -	return item; +	return rb_entry_safe(p, struct btrfs_delayed_item, rb_node);  }  static struct btrfs_delayed_item *__btrfs_first_delayed_deletion_item(  					struct btrfs_delayed_node *delayed_node)  { -	struct rb_node *p; -	struct btrfs_delayed_item *item = NULL; - -	p = rb_first_cached(&delayed_node->del_root); -	if (p) -		item = rb_entry(p, struct btrfs_delayed_item, rb_node); +	struct rb_node *p = rb_first_cached(&delayed_node->del_root); -	return item; +	return rb_entry_safe(p, struct btrfs_delayed_item, rb_node);  }  static struct btrfs_delayed_item *__btrfs_next_delayed_item(  						struct btrfs_delayed_item *item)  { -	struct rb_node *p; -	struct btrfs_delayed_item *next = NULL; - -	p = rb_next(&item->rb_node); -	if (p) -		next = rb_entry(p, struct btrfs_delayed_item, rb_node); +	struct rb_node *p = rb_next(&item->rb_node); -	return next; +	return rb_entry_safe(p, struct btrfs_delayed_item, rb_node);  }  static int btrfs_delayed_item_reserve_metadata(struct btrfs_trans_handle *trans, @@ -1397,17 +1380,17 @@ void btrfs_assert_delayed_root_empty(struct btrfs_fs_info *fs_info)  	WARN_ON(btrfs_first_delayed_node(fs_info->delayed_root));  } -static int could_end_wait(struct btrfs_delayed_root *delayed_root, int seq) +static bool could_end_wait(struct btrfs_delayed_root *delayed_root, int seq)  {  	int val = atomic_read(&delayed_root->items_seq);  	if (val < seq || val >= seq + BTRFS_DELAYED_BATCH) -		return 1; +		return true;  	if (atomic_read(&delayed_root->items) < BTRFS_DELAYED_BACKGROUND) -		return 1; +		return true; -	return 0; +	return false;  }  void btrfs_balance_delayed_items(struct btrfs_fs_info *fs_info)  | 
