aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs')
-rw-r--r--fs/btrfs/send.c38
1 files changed, 20 insertions, 18 deletions
diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c
index 78a43b2e5c8e..8877adc45394 100644
--- a/fs/btrfs/send.c
+++ b/fs/btrfs/send.c
@@ -4725,6 +4725,21 @@ out:
4725 return ret; 4725 return ret;
4726} 4726}
4727 4727
4728static void btrfs_root_dec_send_in_progress(struct btrfs_root* root)
4729{
4730 spin_lock(&root->root_item_lock);
4731 root->send_in_progress--;
4732 /*
4733 * Not much left to do, we don't know why it's unbalanced and
4734 * can't blindly reset it to 0.
4735 */
4736 if (root->send_in_progress < 0)
4737 btrfs_err(root->fs_info,
4738 "send_in_progres unbalanced %d root %llu\n",
4739 root->send_in_progress, root->root_key.objectid);
4740 spin_unlock(&root->root_item_lock);
4741}
4742
4728long btrfs_ioctl_send(struct file *mnt_file, void __user *arg_) 4743long btrfs_ioctl_send(struct file *mnt_file, void __user *arg_)
4729{ 4744{
4730 int ret = 0; 4745 int ret = 0;
@@ -4942,24 +4957,11 @@ long btrfs_ioctl_send(struct file *mnt_file, void __user *arg_)
4942 } 4957 }
4943 4958
4944out: 4959out:
4945 for (i = 0; sctx && i < clone_sources_to_rollback; i++) { 4960 for (i = 0; sctx && i < clone_sources_to_rollback; i++)
4946 struct btrfs_root *r = sctx->clone_roots[i].root; 4961 btrfs_root_dec_send_in_progress(sctx->clone_roots[i].root);
4947 4962 if (sctx && !IS_ERR_OR_NULL(sctx->parent_root))
4948 spin_lock(&r->root_item_lock); 4963 btrfs_root_dec_send_in_progress(sctx->parent_root);
4949 r->send_in_progress--; 4964 btrfs_root_dec_send_in_progress(send_root);
4950 spin_unlock(&r->root_item_lock);
4951 }
4952 if (sctx && !IS_ERR_OR_NULL(sctx->parent_root)) {
4953 struct btrfs_root *r = sctx->parent_root;
4954
4955 spin_lock(&r->root_item_lock);
4956 r->send_in_progress--;
4957 spin_unlock(&r->root_item_lock);
4958 }
4959
4960 spin_lock(&send_root->root_item_lock);
4961 send_root->send_in_progress--;
4962 spin_unlock(&send_root->root_item_lock);
4963 4965
4964 kfree(arg); 4966 kfree(arg);
4965 vfree(clone_sources_tmp); 4967 vfree(clone_sources_tmp);