aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/dev-replace.c
diff options
context:
space:
mode:
authorMiao Xie <miaox@cn.fujitsu.com>2014-11-25 03:39:28 -0500
committerMiao Xie <miaox@cn.fujitsu.com>2014-12-02 21:18:47 -0500
commit4245215d6a8dba1a51c50533b6667919687c0b89 (patch)
treed3d988c61ff1dcf8fe6886e3c2ba3783814d614e /fs/btrfs/dev-replace.c
parent7603597690147a16b5cc77047d7570fa22a22673 (diff)
Btrfs, raid56: fix use-after-free problem in the final device replace procedure on raid56
The commit c404e0dc (Btrfs: fix use-after-free in the finishing procedure of the device replace) fixed a use-after-free problem which happened when removing the source device at the end of device replace, but at that time, btrfs didn't support device replace on raid56, so we didn't fix the problem on the raid56 profile. Currently, we implemented device replace for raid56, so we need kick that problem out before we enable that function for raid56. The fix method is very simple, we just increase the bio per-cpu counter before we submit a raid56 io, and decrease the counter when the raid56 io ends. Signed-off-by: Miao Xie <miaox@cn.fujitsu.com>
Diffstat (limited to 'fs/btrfs/dev-replace.c')
-rw-r--r--fs/btrfs/dev-replace.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/fs/btrfs/dev-replace.c b/fs/btrfs/dev-replace.c
index 6f662b34ba0e..fa27b4e3b6c8 100644
--- a/fs/btrfs/dev-replace.c
+++ b/fs/btrfs/dev-replace.c
@@ -920,9 +920,9 @@ void btrfs_bio_counter_inc_noblocked(struct btrfs_fs_info *fs_info)
920 percpu_counter_inc(&fs_info->bio_counter); 920 percpu_counter_inc(&fs_info->bio_counter);
921} 921}
922 922
923void btrfs_bio_counter_dec(struct btrfs_fs_info *fs_info) 923void btrfs_bio_counter_sub(struct btrfs_fs_info *fs_info, s64 amount)
924{ 924{
925 percpu_counter_dec(&fs_info->bio_counter); 925 percpu_counter_sub(&fs_info->bio_counter, amount);
926 926
927 if (waitqueue_active(&fs_info->replace_wait)) 927 if (waitqueue_active(&fs_info->replace_wait))
928 wake_up(&fs_info->replace_wait); 928 wake_up(&fs_info->replace_wait);