]> git.baikalelectronics.ru Git - kernel.git/commit
Btrfs: wake up @scrub_pause_wait as much as we can
authorWang Shilong <wangsl.fnst@cn.fujitsu.com>
Wed, 19 Feb 2014 11:24:19 +0000 (19:24 +0800)
committerJosef Bacik <jbacik@fb.com>
Mon, 10 Mar 2014 19:16:54 +0000 (15:16 -0400)
commit19be5fcff0ef4b42f77eeb67ae00dd2fea38148b
tree3ad2fb22832b927c3b7192f6d7f12bc6119ef7c8
parent1024a190449fe1fa1a30b354276df671a1d82de2
Btrfs: wake up @scrub_pause_wait as much as we can

check if @scrubs_running=@scrubs_paused condition inside wait_event()
is not an atomic operation which means we may inc/dec @scrub_running/
paused at any time. Let's wake up @scrub_pause_wait as much as we can
to let commit transaction blocked less.

An example below:

Thread1 Thread2
|->scrub_blocked_if_needed() |->scrub_pending_trans_workers_inc
  |->increase @scrub_paused
                                       |->increase @scrub_running
  |->wake up scrub_pause_wait list
                                       |->scrub blocked
                                       |->increase @scrub_paused

Thread3 is commiting transaction which is blocked at btrfs_scrub_pause().
So after Thread2 increase @scrub_paused, we meet the condition
@scrub_paused=@scrub_running, but transaction will be still blocked until
another calling to wake up @scrub_pause_wait.

Signed-off-by: Wang Shilong <wangsl.fnst@cn.fujitsu.com>
Signed-off-by: Miao Xie <miaox@cn.fujitsu.com>
Signed-off-by: Josef Bacik <jbacik@fb.com>
fs/btrfs/scrub.c