btrfs-progs: image: Fix a access-beyond-boundary bug when there are 32 online CPUs
[BUG] When there are over 32 (in my example, 35) online CPUs, btrfs-image -c9 will just hang. [CAUSE] Btrfs-image has a hard coded limit (32) on how many threads we can use. For the "-t" option we do the up limit check. But when we don't specify "-t" option and speicified "-c" option, then btrfs-image will try to auto detect the number of online CPUs, and use it without checking if it's over the up limit. And for num_threads larger than the up limit, we will over write the adjust members of metadump_struct/mdrestore_struct, corrupting pthread_mutex_t and pthread_cond_t, causing synchronising problem. Nowadays, with SMT/HT and higher cpu core counts, it's not hard to go beyond 32 threads, and hit the bug. [FIX] Just do extra num_threads check before using the number from sysconf(). Reviewed-by: Su Yue <Damenly_Su@gmx.com> Signed-off-by: Qu Wenruo <wqu@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
d8c27db9ac
commit
686e86d82d
|
@ -2701,6 +2701,7 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
if (tmp <= 0)
|
if (tmp <= 0)
|
||||||
tmp = 1;
|
tmp = 1;
|
||||||
|
tmp = min_t(long, tmp, MAX_WORKER_THREADS);
|
||||||
num_threads = tmp;
|
num_threads = tmp;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue