• Zhao Lei's avatar
    btrfs: reada: avoid undone reada extents in btrfs_reada_wait · 4fe7a0e1
    Zhao Lei authored
    Reada background works is not designed to finish all jobs
    completely, it will break in following case:
    1: When a device reaches workload limit (MAX_IN_FLIGHT)
    2: Total reads reach max limit (10000)
    3: All devices don't have queued more jobs, often happened in DUP case
    
    And if all background works exit with remaining jobs,
    btrfs_reada_wait() will wait indefinetelly.
    
    Above problem is rarely happened in old code, because:
    1: Every work queues 2x new works
       So many works reduced chances of undone jobs.
    2: One work will continue 10000 times loop in case of no-jobs
       It reduced no-thread window time.
    
    But after we fixed above case, the "undone reada extents" frequently
    happened.
    
    Fix:
     Check to ensure we have at least one thread if there are undone jobs
     in btrfs_reada_wait().
    Signed-off-by: default avatarZhao Lei <zhaolei@cn.fujitsu.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    4fe7a0e1
reada.c 24.6 KB