aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/delayed-inode.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/delayed-inode.c')
-rw-r--r--fs/btrfs/delayed-inode.c19
1 files changed, 10 insertions, 9 deletions
diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c
index cbd9523ad09c..8d292fbae659 100644
--- a/fs/btrfs/delayed-inode.c
+++ b/fs/btrfs/delayed-inode.c
@@ -108,8 +108,8 @@ static struct btrfs_delayed_node *btrfs_get_delayed_node(struct inode *inode)
108 return node; 108 return node;
109 } 109 }
110 btrfs_inode->delayed_node = node; 110 btrfs_inode->delayed_node = node;
111 atomic_inc(&node->refs); /* can be accessed */ 111 /* can be accessed and cached in the inode */
112 atomic_inc(&node->refs); /* cached in the inode */ 112 atomic_add(2, &node->refs);
113 spin_unlock(&root->inode_lock); 113 spin_unlock(&root->inode_lock);
114 return node; 114 return node;
115 } 115 }
@@ -138,8 +138,8 @@ again:
138 return ERR_PTR(-ENOMEM); 138 return ERR_PTR(-ENOMEM);
139 btrfs_init_delayed_node(node, root, ino); 139 btrfs_init_delayed_node(node, root, ino);
140 140
141 atomic_inc(&node->refs); /* cached in the btrfs inode */ 141 /* cached in the btrfs inode and can be accessed */
142 atomic_inc(&node->refs); /* can be accessed */ 142 atomic_add(2, &node->refs);
143 143
144 ret = radix_tree_preload(GFP_NOFS & ~__GFP_HIGHMEM); 144 ret = radix_tree_preload(GFP_NOFS & ~__GFP_HIGHMEM);
145 if (ret) { 145 if (ret) {
@@ -649,14 +649,13 @@ static int btrfs_delayed_inode_reserve_metadata(
649 goto out; 649 goto out;
650 650
651 ret = btrfs_block_rsv_migrate(src_rsv, dst_rsv, num_bytes); 651 ret = btrfs_block_rsv_migrate(src_rsv, dst_rsv, num_bytes);
652 if (!ret) 652 if (!WARN_ON(ret))
653 goto out; 653 goto out;
654 654
655 /* 655 /*
656 * Ok this is a problem, let's just steal from the global rsv 656 * Ok this is a problem, let's just steal from the global rsv
657 * since this really shouldn't happen that often. 657 * since this really shouldn't happen that often.
658 */ 658 */
659 WARN_ON(1);
660 ret = btrfs_block_rsv_migrate(&root->fs_info->global_block_rsv, 659 ret = btrfs_block_rsv_migrate(&root->fs_info->global_block_rsv,
661 dst_rsv, num_bytes); 660 dst_rsv, num_bytes);
662 goto out; 661 goto out;
@@ -771,13 +770,13 @@ static int btrfs_batch_insert_items(struct btrfs_root *root,
771 */ 770 */
772 btrfs_set_path_blocking(path); 771 btrfs_set_path_blocking(path);
773 772
774 keys = kmalloc(sizeof(struct btrfs_key) * nitems, GFP_NOFS); 773 keys = kmalloc_array(nitems, sizeof(struct btrfs_key), GFP_NOFS);
775 if (!keys) { 774 if (!keys) {
776 ret = -ENOMEM; 775 ret = -ENOMEM;
777 goto out; 776 goto out;
778 } 777 }
779 778
780 data_size = kmalloc(sizeof(u32) * nitems, GFP_NOFS); 779 data_size = kmalloc_array(nitems, sizeof(u32), GFP_NOFS);
781 if (!data_size) { 780 if (!data_size) {
782 ret = -ENOMEM; 781 ret = -ENOMEM;
783 goto error; 782 goto error;
@@ -1174,8 +1173,10 @@ int btrfs_commit_inode_delayed_items(struct btrfs_trans_handle *trans,
1174 mutex_unlock(&delayed_node->mutex); 1173 mutex_unlock(&delayed_node->mutex);
1175 1174
1176 path = btrfs_alloc_path(); 1175 path = btrfs_alloc_path();
1177 if (!path) 1176 if (!path) {
1177 btrfs_release_delayed_node(delayed_node);
1178 return -ENOMEM; 1178 return -ENOMEM;
1179 }
1179 path->leave_spinning = 1; 1180 path->leave_spinning = 1;
1180 1181
1181 block_rsv = trans->block_rsv; 1182 block_rsv = trans->block_rsv;