• Wang Shilong's avatar
    Btrfs: wake up @scrub_pause_wait as much as we can · 32a44789
    Wang Shilong authored
    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: default avatarWang Shilong <wangsl.fnst@cn.fujitsu.com>
    Signed-off-by: default avatarMiao Xie <miaox@cn.fujitsu.com>
    Signed-off-by: default avatarJosef Bacik <jbacik@fb.com>
    32a44789
scrub.c 91 KB