HomeFreeBSD

Fix scn_queue races on very old pools

Description

Fix scn_queue races on very old pools

Code for pools before version 11 uses dmu_objset_find_dp() to scan
for children datasets/clones. It calls enqueue_clones_cb() and
enqueue_cb() callbacks in parallel from multiple taskq threads.
It ends up bad for scan_ds_queue_insert(), corrupting scn_queue
AVL-tree. Fix it by introducing a mutex to protect those two
scan_ds_queue_insert() calls. All other calls are done from the
sync thread and so serialized.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Brian Atkinson <batkinson@lanl.gov>
Signed-off-by: Alexander Motin <mav@FreeBSD.org>
Sponsored by: iXsystems, Inc.
Closes #16162
PR: 278414
Approved by: re (cperciva)

(cherry picked from commit 49086aa35d987b78dbc3c9ec94814fe338e07164)
(cherry picked from commit 455ce1729353f2ffce9713ccc3574e73186a22f0)

Details

Provenance
mavAuthored on May 23 2024, 4:20 PM
Parents
rG309946854fd5: geli: allocate a UMA pool earlier
Branches
Unknown
Tags
Unknown