]> git.baikalelectronics.ru Git - kernel.git/commit
btrfs: reada: avoid undone reada extents in btrfs_reada_wait
authorZhao Lei <zhaolei@cn.fujitsu.com>
Tue, 26 Jan 2016 10:42:40 +0000 (18:42 +0800)
committerDavid Sterba <dsterba@suse.com>
Thu, 18 Feb 2016 09:27:23 +0000 (10:27 +0100)
commit1b664bba93087636100de54ed4d46de659715f48
tree6bbeac8bc14b6fa2683c454cafea277f1be88022
parent77ac963b73bdbdd2a974261d57dec2782b29080a
btrfs: reada: avoid undone reada extents in btrfs_reada_wait

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: Zhao Lei <zhaolei@cn.fujitsu.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/reada.c