diff options
Diffstat (limited to 'fs/btrfs/delayed-inode.c')
| -rw-r--r-- | fs/btrfs/delayed-inode.c | 19 |
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; |
