diff options
author | David Sterba <dsterba@suse.cz> | 2013-12-17 09:07:20 -0500 |
---|---|---|
committer | Chris Mason <clm@fb.com> | 2014-01-28 16:20:04 -0500 |
commit | 66ef7d65c3fc6e5300b9359f1c6537efb23781bb (patch) | |
tree | eaba562491ad69b90c542a7e9854c62730ade7d0 /fs/btrfs | |
parent | 41ce9970a8a6a362ae8df145f7a03d789e9ef9d2 (diff) |
btrfs: check balance of send_in_progress
Warn if the balance goes below zero, which appears to be unlikely
though. Otherwise cleans up the code a bit.
Signed-off-by: David Sterba <dsterba@suse.cz>
Signed-off-by: Josef Bacik <jbacik@fb.com>
Signed-off-by: Chris Mason <clm@fb.com>
Diffstat (limited to 'fs/btrfs')
-rw-r--r-- | fs/btrfs/send.c | 38 |
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 | ||
4728 | static 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 | |||
4728 | long btrfs_ioctl_send(struct file *mnt_file, void __user *arg_) | 4743 | long 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 | ||
4944 | out: | 4959 | out: |
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); |